Proguard не ведет занятия при создании aar

Из этой справки:

https://github.com/codepath/android_guides/wiki/Building-your-own-Android-library

У меня есть следующий файл gradle:

android {
    compileSdkVersion 25
    buildToolsVersion "26.0.2"

    buildTypes {
        release {
            minifyEnabled true
            consumerProguardFiles 'consumer-proguard-rules.pro'
        }
    }
}

И следующий файл proguard:

-dontobfuscate
-optimizations !code/allocation/variable

-keep public class * {
    public protected *;
}

Однако все мои классы в aar отсутствуют, когда я запускаю задачу "assembleRelease" для сборки моего файла aar для выпуска.

Любые идеи?

Ответ 1

Вы должны установить minifyEnabled в false (значение по умолчанию): consumerProguardFiles не используется для немедленной минимизации (т.е. при создании самой библиотеки). Он используется, когда сборщик библиотеки (например, приложение) создается.

Минимизация библиотеки до того, как потребление не рекомендуется, потому что вы не можете знать, какие части будут фактически использоваться до окончательной сборки. Библиотеки обычно этого не делают. например LeakCanary, ACRA, Butter Knife

Ответ 2

в целом, библиотека должна содержать все имена методов и методов, необходимые для ее работы; например:

-verbose

# -libraryjars ../app/libs
# -dontpreverify
# -dontobfuscate
# -dontshrink
# -dontoptimize

# keep class BuildConfig
-keep public class **.BuildConfig { *; }

# keep class members of R
-keepclassmembers class **.R$* {public static <fields>;}

ответ на вопрос, вероятно, должен быть:

# keep all public and protected method names,
# which could be used by Java reflection.
-keepclassmembernames class * {
    public protected <methods>;
}

скорее всего, потребуется еще несколько правил, а флаг -verbose сообщает, что писать там. при создании библиотеки против другого кода (как было предложено выше), тем не менее, необходимо добавить более или менее те же правила для библиотеки. есть также довольно некоторые, а не с открытым исходным кодом библиотеки с обфускационными именами классов.

библиотека build.gradle может выглядеть примерно так:

android {
    defaultConfig {
        consumerProguardFiles 'proguard-consumer-rules.pro' 
    }
    buildTypes {
        release {
            minifyEnabled false // don't proguard the library itself.
        }
    }
}

по умолчанию proguard-consumer-rules.pro объясняет это:

Плагин Android Gradle позволяет определять правила ProGuard, которые внедряются в AAR.

Эти правила ProGuard автоматически применяются, когда потребительское приложение устанавливает minifyEnabled в true.

Пользовательский файл правил должен быть определен с использованием свойства customerProguardFiles в файле build.gradle.

Когда библиотека не обрабатывается сама по себе, она все равно может приносить ей правила ProGuard - для того, чтобы потребляться при создании всего проекта.

Ответ 3

Я не получаю то, что вы на самом деле хотите сделать, но я могу предложить вам одну вещь, которая просто не делает assembleRelease, а вместо импорта в ваш другой проект, чистый проект и сборку, затем используйте сгенерированный aar из каталога /build/outputs/aar/. И нужно проверить, что вы не используете ссылку obfuscated класса в любом месте.