Обфускация нескольких модулей с помощью студии android
У меня проблемы с градулой proguard... У меня есть следующие модули:
- Приложение: основной модуль приложения. Имеют зависимость ModuleA и ModuleC
- ModuleA: библиотечный модуль. Имеют зависимость ModuleB и jar dependecies.
- МодульB: модуль библиотеки
- Модуль Module: библиотечный модуль
- Износ: носить модуль приложения.
build.gradle файлы: - Приложение:
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile project(':ModuleA')
compile project(':ModuleC')
wearApp project(':Wear')
}
ModuleA:
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile project(':ModuleB')
}
ModuleB:
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
ModuleC: То же, что и ModuleB.
Wear:
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
** Я написал только важные строки
Моя проблема заключается в том, что если я создаю подписанный APK с этой конфигурацией, когда я устанавливаю его на устройство, он вылетает с этим исключением:
java.lang.NoSuchFieldError: нет поля с именем = 'peer' signature = 'J' в классе Lcom/package/ClassInJar;
Он сбой в классе, содержащемся в банке в папке libs модуля A.
Если я устанавливаю minifyEnabled на false во всех модулях, он не сбой, но я предпочитаю обфускацию кода. И если я превращу minifyEnabled в true в библиотечных модулях, он не компилируется и покажет мне это исключение:
Error:Execution failed for task ':ModuleB:proguardRelease'.
java.io.IOException: выходной бачок пуст. Вы указали правильные опции -keep?
Ответы
Ответ 1
Во-первых, важно понимать, что proguard играет два основных броска:
- Когда proguard obfuscate, он фактически принимает все ваши классы, члены классов, методы и т.д. И изменяет их имена, чтобы они стали тарабарщиной. Таким образом, для кого-то намного сложнее перепроектировать ваш код.
- Он сжимает код таким образом, что каждый неиспользуемый класс, член класса, метод и т.д. Отбрасывается при компиляции, чтобы сделать ваш apk более тонким.
Что касается "minify", это не обязательно, даже если это может спасти вас несколько килобайт здесь и там. Вы, вероятно, можете оставить его, и все будет хорошо.
Что касается аварии - это происходит из-за того, что часть вашего кода пытается достичь класса, который он назвал, вероятно, был запутан и поэтому отсутствует.
Попробуйте установить правила для proguard. это можно сделать так:
-
Найдите файл proguard-rules.pro, который находится рядом с файлом 'build.gradle' внутри папки "приложение" (изображение ниже).
-
Затем вам нужно добавить правила "держать" для определенных классов/членов класса/методов /etc, чтобы обфускация не возникала в этих элементах. В файле есть примеры, например:
-keepclassmembers класс fqcn.of.javascript.interface.for.webview {public *; } }
Это означает, что "не обфускайте всех членов класса, которые являются общедоступными в данном классе.
Но есть много вариантов содержания.
Для получения дополнительной информации о вариантах "держать" проверьте эту документацию с примерами (когда вы нажимаете элемент) в ссылке: сохраняйте параметры.
Удачи =)