Проблема с Proguard и потребительским proguard в Android SDK 29

Я искал вопросы, связанные с stackoverflow и proguard, и все еще застрял.

Я создал библиотеку Android .aar (snifferservice), которая содержит аппаратные функции и пакет утилит. Я использую это для большинства своих приложений для Android, которые подключаются к этому аппаратному устройству. У меня также есть приложение, которое использует только пакет утилит в библиотеке. Я использую Proguard для обфускации и сжатия моего основного приложения NoseBook, а также использую его для обфускации и сжатия aar в готовом приложении. После перехода на androidx и перехода на целевой API 29 я не могу создать версию выпуска, потому что получаю сообщение об ошибке, в котором говорится, что он не может найти общий суперкласс для файлов, которые я специально пометил как dontwarn.

Я пробовал играть с правилами proguard - добавлял и удалял другие пакеты в aar, и в частности пакеты, на которые ссылается ошибка. Ничего не работает. Если я вообще не применяю Proguard к aar, все компилируется нормально.

Мое приложение использует Firebase Uuthentication и Firebase Cloud Functions. Я использую Android Studio 3.6.3 в Windows 10. Буду признателен за любые идеи.

Ошибка:

Optimizing (pass 2/5)...
Unexpected error while performing partial evaluation:
  Class       = [weizmann/com/snifferservice/data/SaveDataService]
  Method      = [onCreate()V]
  Exception   = [java.lang.IllegalArgumentException] (Can't find common super class of [android/content/Context] (with 2 known super classes) and [weizmann/com/snifferservice/roomdata/SnifferDatabase] (with 1 known super classes))
Unexpected error while performing partial evaluation:
  Class       = [weizmann/com/snifferservice/services/BluetoothLeService]
  Method      = [onCreate()V]
  Exception   = [java.lang.IllegalArgumentException] (Can't find common super class of [android/content/Context] (with 2 known super classes) and [weizmann/com/snifferservice/roomdata/SnifferDatabase] (with 1 known super classes))
Unexpected error while performing partial evaluation:
  Class       = [weizmann/com/snifferservice/services/CloudDataService]
  Method      = [onHandleIntent(Landroid/content/Intent;)V]
  Exception   = [java.lang.IllegalArgumentException] (Can't find common super class of [android/content/Context] (with 2 known super classes) and [weizmann/com/snifferservice/roomdata/SnifferDatabase] (with 1 known super classes))
Warning: Exception while processing task java.io.IOException: java.lang.RuntimeException: java.lang.IllegalArgumentException: Can't find common super class of [android/content/Context] (with 2 known super classes) and [weizmann/com/snifferservice/roomdata/SnifferDatabase] (with 1 known super classes)
Thread(Tasks limiter_4): destruction

Мое приложение build.gradle: compilesdk и targetdk — 29.

release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            consumerProguardFiles 'consumer-proguard-rules.pro' //If I comment out this line everything works
        }
...
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.0.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    implementation 'androidx.recyclerview:recyclerview:1.0.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0'

    implementation project(':SnifferService-7.142')

    implementation 'com.google.firebase:firebase-auth:17.0.0'
    implementation 'com.firebaseui:firebase-ui-auth:4.3.1'

    implementation 'com.google.firebase:firebase-core:16.0.9'

    implementation 'com.google.firebase:firebase-functions:17.0.0'
}

Мой верхний уровень build.gradle:

 dependencies {
        classpath 'com.android.tools.build:gradle:3.2.0'
        classpath 'com.google.gms:google-services:4.1.0'
    }

aar build.gradle: compilesdk и targetdk 28

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'androidx.recyclerview:recyclerview:1.0.0'
    androidTestImplementation('androidx.test.espresso:espresso-core:3.1.0', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    implementation 'androidx.appcompat:appcompat:1.0.0'
    testImplementation 'junit:junit:4.12'
    implementation 'com.github.PhilJay:MPAndroidChart:v3.0.1'
    //gson
    implementation 'com.google.code.gson:gson:2.8.0'
    //volley
    implementation 'com.android.volley:volley:1.1.1'
    
    implementation 'net.mabboud:android-tone-player:0.3'

    def room_version = "2.2.5"
    implementation "androidx.room:room-runtime:$room_version"
    annotationProcessor "androidx.room:room-compiler:$room_version" // For Kotlin use kapt instead of annotationProcessor
    // Test helpers
    testImplementation "androidx.room:room-testing:$room_version"

    // Core library
    androidTestImplementation 'androidx.test:core:1.0.0'

    // AndroidJUnitRunner and JUnit Rules
    androidTestImplementation 'androidx.test:runner:1.1.0'
    androidTestImplementation 'androidx.test:rules:1.1.0'

    // Assertions
    androidTestImplementation 'androidx.test.ext:junit:1.0.0'
    androidTestImplementation 'androidx.test.ext:truth:1.0.0'
    androidTestImplementation 'com.google.truth:truth:0.42'

}

Правила Proguard верхнего уровня:

-android
-dontpreverify
-repackageclasses ''
-allowaccessmodification
-optimizations !code/simplification/arithmetic
-keepattributes *Annotation*

# chart
-dontwarn com.github.mikephil.**

#continuous buzzer
-dontwarn net.mabboud.android_tone_player.**

# gson
-dontwarn com.google.gson.**

# android support
-keep class android.support.v4.app.** { *; }
-keep class android.support.v7.app.** { *; }

-keep interface android.support.v4.app.** { *; }

#androidx
-dontwarn com.google.android.material.**
-keep class com.google.android.material.** { *; }

-dontwarn androidx.**
-keep class androidx.** { *; }
-keep interface androidx.** { *; }

# monocontinuous buzzer
-dontwarn weizmann.com.snifferservice.audio.MonoContinuousBuzzer

#gmailsender
-dontwarn java.awt.**
-dontwarn java.beans.Beans
-dontwarn javax.security.**

# don't need device-related stuff
-dontwarn weizmann.com.snifferservice.communication.*
-dontwarn weizmann.com.snifferservice.fragments.*
-dontwarn weizmann.com.snifferservice.supportfragments.*
-dontwarn weizmann.com.snifferservice.services.*
-dontwarn weizmann.com.snifferservice.roomdata.*
-dontwarn weizmann.com.snifferservice.data.*


# This will strip `Log.v`, `Log.d`, and `Log.i` statements and will leave `Log.w` and `Log.e` statements intact.
-assumenosideeffects class android.util.Log {
    public static boolean isLoggable(java.lang.String, int);
    public static int v(...);
    public static int d(...);
    public static int i(...);
}


-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application

потребитель-proguard-rules.pro:

-dontwarn weizmann.com.snifferservice.communication.*
-dontwarn weizmann.com.snifferservice.fragments.*
-dontwarn weizmann.com.snifferservice.supportfragments.*
-dontwarn weizmann.com.snifferservice.services.*
-dontwarn weizmann.com.snifferservice.roomdata.*
-dontwarn weizmann.com.snifferservice.data.*
-keep class weizmann.com.snifferservice.util.** {*;}

Я пробовал добавлять в этот файл также команды support.v4 и support.v7 , а также добавлять и удалять android.content.* и weizmann.com.snifferservice.data.* и weizmann.com.snifferservice.roomdata.* , не помогает.

EDIT Проблема, похоже, связана с базой данных комнат. Это ошибки Proguard:

Warning: weizmann.com.snifferservice.roomdata.SnifferDatabase_Impl: can't find referenced field 'java.util.List mCallbacks' in program class weizmann.com.snifferservice.roomdata.SnifferDatabase_Impl
Warning: weizmann.com.snifferservice.roomdata.SnifferDatabase_Impl: can't find referenced method 'void internalInitInvalidationTracker(androidx.sqlite.db.SupportSQLiteDatabase)' in program class weizmann.com.snifferservice.roomdata.SnifferDatabase_Impl
Warning: weizmann.com.snifferservice.roomdata.SnifferDatabase_Impl: can't find referenced field 'androidx.sqlite.db.SupportSQLiteDatabase mDatabase' in program class weizmann.com.snifferservice.roomdata.SnifferDatabase_Impl
Warning: weizmann.com.snifferservice.roomdata.SnifferDatabase_Impl: can't find referenced method 'void assertNotMainThread()' in program class weizmann.com.snifferservice.roomdata.SnifferDatabase
Warning: weizmann.com.snifferservice.roomdata.SnifferDatabase_Impl: can't find referenced method 'androidx.sqlite.db.SupportSQLiteOpenHelper getOpenHelper()' in program class weizmann.com.snifferservice.roomdata.SnifferDatabase
Warning: weizmann.com.snifferservice.roomdata.SnifferDatabase_Impl: can't find referenced method 'void beginTransaction()' in program class weizmann.com.snifferservice.roomdata.SnifferDatabase
Warning: weizmann.com.snifferservice.roomdata.SnifferDatabase_Impl: can't find referenced method 'void setTransactionSuccessful()' in program class weizmann.com.snifferservice.roomdata.SnifferDatabase
Warning: weizmann.com.snifferservice.roomdata.SnifferDatabase_Impl: can't find referenced method 'void endTransaction()' in program class weizmann.com.snifferservice.roomdata.SnifferDatabase

Я добавил в свои варианты proguard следующие, ничего не помогает.

#this
-dontwarn android.arch.util.paging.CountedDataSource
-dontwarn android.arch.persistence.room.paging.LimitOffsetDataSource

#or this
-keep class androidx.room.**{
    public protected private *;
}
#or this
-keep class * extends androidx.room.RoomDatabase
#or this
-keep class androidx.room.RoomDatabase
#or this and various combinations.
-dontwarn androidx.room.paging.**

person Danielle    schedule 23.11.2020    source источник
comment
Покажите нам зависимости androidx/support вашего приложения и библиотеки. Кроме того, какой минимальный/максимальный/целевой SDK есть в библиотеке и приложении?   -  person JensV    schedule 23.11.2020
comment
Почему именно вы используете dontwarn в любом случае? Я имею в виду, что ошибка, которую вы получаете, имела бы предупреждение/ошибку при компиляции библиотеки (но этого не произошло, поскольку вы добавили dontwarn). Глядя на руководство ProGuard, кажется, что вам действительно нужна веская причина, чтобы использовать этот флаг. Если вы получаете сообщение об ошибке без dontwarn, я предлагаю вам исправить это.   -  person JensV    schedule 23.11.2020
comment
@JensV, спасибо за ответ. Я добавил зависимости по запросу. minsdk — 21, цель aar — 28, а цель приложения верхнего уровня — 29. У меня есть другие приложения, которые я перенес на androidx и sdk 29 без проблем, но они также используют библиотеки устройств, а не только служебные функции.   -  person Danielle    schedule 23.11.2020
comment
@JensV, я понял, что dontwarn предназначен для частей кода, которые я не использую, и меня не волнуют проблемы. Это неправильно? Если это правильно, почему сборка не работает на классах, которые я не использую? Если нет, что посоветуете поставить вместо него? Спасибо.   -  person Danielle    schedule 23.11.2020
comment
Покопался еще .. вам не следует использовать -repackageclasses '' на Android ... Попробуйте сократить свою проблему до подмножества кода, постоянно удаляя вещи. Также попробуйте очистить кеш и выполнить чистую сборку   -  person JensV    schedule 23.11.2020
comment
Это также полезно прочитать guardsquare.com/en/products/proguard/manual/ использование   -  person JensV    schedule 23.11.2020
comment
Не могли бы вы заменить все -dontwarn на -ignorewarnings и вывести все предупреждения?   -  person JensV    schedule 23.11.2020
comment
@JensV, я поставил -ignorewarnings сверху и удалил команды -dontwarn. Я обновил вопрос, чтобы игнорировать одну строку из каждого пакета, иначе он был бы слишком длинным. Продолжаем работать над уменьшением проблемы. Спасибо   -  person Danielle    schedule 24.11.2020
comment
@JensV, похоже, проблема в базе данных комнат. Я обновил вопрос, чтобы показать ошибки.   -  person Danielle    schedule 24.11.2020
comment
guardsquare.com/en/products/proguard/manual/troubleshooting предполагает, что ваша сборка находится в несогласованном состоянии. Попробуйте очистить кеш сборки и, возможно, попытаться очистить и другие кеши (очистить градуировку, сделать недействительными кеши и т. д.).   -  person JensV    schedule 24.11.2020


Ответы (1)


Что в итоге сработало: ошибка всегда появлялась на втором проходе оптимизации. я добавил

-optimizationpasses 1

к параметрам в начале, и ошибка никогда не появлялась.

Я пробовал различные варианты очистки кеша, обновляя/возвращая версию внутреннего aar, добавляя удаление многочисленных параметров proguard, но безуспешно. В худшем случае также возникла ошибка STRING_TOO_LARGE.

Спасибо JensV за вашу помощь!

Любые дальнейшие идеи по решению этой проблемы все равно будут оценены.

person Danielle    schedule 26.11.2020