Подтвердить что ты не робот

Обфускация нескольких модулей с помощью студии 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?

4b9b3361

Ответ 1

Во-первых, важно понимать, что proguard играет два основных броска:

  • Когда proguard obfuscate, он фактически принимает все ваши классы, члены классов, методы и т.д. И изменяет их имена, чтобы они стали тарабарщиной. Таким образом, для кого-то намного сложнее перепроектировать ваш код.
  • Он сжимает код таким образом, что каждый неиспользуемый класс, член класса, метод и т.д. Отбрасывается при компиляции, чтобы сделать ваш apk более тонким.

Что касается "minify", это не обязательно, даже если это может спасти вас несколько килобайт здесь и там. Вы, вероятно, можете оставить его, и все будет хорошо.

Что касается аварии - это происходит из-за того, что часть вашего кода пытается достичь класса, который он назвал, вероятно, был запутан и поэтому отсутствует.
Попробуйте установить правила для proguard. это можно сделать так:

  • Найдите файл proguard-rules.pro, который находится рядом с файлом 'build.gradle' внутри папки "приложение" (изображение ниже). enter image description here

  • Затем вам нужно добавить правила "держать" для определенных классов/членов класса/методов /etc, чтобы обфускация не возникала в этих элементах. В файле есть примеры, например:

    -keepclassmembers класс fqcn.of.javascript.interface.for.webview {public *; } }


Это означает, что "не обфускайте всех членов класса, которые являются общедоступными в данном классе.

Но есть много вариантов содержания.
Для получения дополнительной информации о вариантах "держать" проверьте эту документацию с примерами (когда вы нажимаете элемент) в ссылке: сохраняйте параметры.

Удачи =)