Проблема с Proguard и consumer proguard в Android SDK 29

#android #android-studio #proguard #aar

#Android #android-studio #proguard #aar

Вопрос:

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

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

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

Мое приложение использует Uuthentication Firebase и облачные функции Firebase. Я использую 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
 

My app build.gradle: compilesdk и targetsdk равны 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'
}
 

Моя сборка высшего уровня.gradle:

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

aar build.gradle: compilesdk и targetsdk равны 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'

}
 

top level Proguard rules:

 -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
 

consumer-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 and, а также добавлять и удалять android.content.* and weizmann.com.snifferservice.data.* и weizmann.com.snifferservice.roomdata.* , но это не помогает.

РЕДАКТИРОВАТЬ Проблема, по-видимому, связана с базой данных номеров. Это ошибки 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.**
 

Комментарии:

1. Покажите нам зависимости вашего приложения и библиотеки от androidx / support. Кроме того, какой минимальный / максимальный / целевой sdk есть у библиотеки и приложения?

2. Почему именно вы используете dontwarn anyways? Я имею в виду, что ошибка, которую вы получаете, должна была иметь предупреждение / ошибку при компиляции библиотеки (но этого не произошло с тех пор, как вы добавили dontwarn ). Глядя на руководство ProGuard, кажется, что вам действительно нужна веская причина, чтобы использовать этот флаг. Если вы получите сообщение об ошибке, dontwarn я предлагаю вам скорее исправить это.

3. @JensV, спасибо за ответ. Я добавил зависимости в соответствии с запросом. minsdk равен 21, цель aar равна 28, а цель приложения верхнего уровня равна 29. У меня есть другие приложения, которые я без проблем перенес на androidx и sdk 29, но они также используют библиотеки устройств, а не только служебные функции.

4. @JensV, я понял, что dontwarn это относится к частям кода, которые я не использую, и мне все равно, есть ли проблемы. Это неправильно? Если это правильно, то почему происходит сбой сборки в классах, которые я не использую? Если нет, что вы порекомендуете мне поставить вместо этого? Спасибо.

5. Покопался еще немного.. вы не должны использовать -repackageclasses '' на Android… Попробуйте свести проблему к подмножеству кода, постоянно удаляя материал. Также попробуйте очистить кеши и выполнить чистую сборку

Ответ №1:

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

 -optimizationpasses 1
 

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

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

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

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