Я искал вопросы, связанные с 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.**
dontwarn
в любом случае? Я имею в виду, что ошибка, которую вы получаете, имела бы предупреждение/ошибку при компиляции библиотеки (но этого не произошло, поскольку вы добавилиdontwarn
). Глядя на руководство ProGuard, кажется, что вам действительно нужна веская причина, чтобы использовать этот флаг. Если вы получаете сообщение об ошибке безdontwarn
, я предлагаю вам исправить это. - person JensV   schedule 23.11.2020dontwarn
предназначен для частей кода, которые я не использую, и меня не волнуют проблемы. Это неправильно? Если это правильно, почему сборка не работает на классах, которые я не использую? Если нет, что посоветуете поставить вместо него? Спасибо. - person Danielle   schedule 23.11.2020-repackageclasses ''
на Android ... Попробуйте сократить свою проблему до подмножества кода, постоянно удаляя вещи. Также попробуйте очистить кеш и выполнить чистую сборку - person JensV   schedule 23.11.2020-dontwarn
на-ignorewarnings
и вывести все предупреждения? - person JensV   schedule 23.11.2020-ignorewarnings
сверху и удалил команды-dontwarn
. Я обновил вопрос, чтобы игнорировать одну строку из каждого пакета, иначе он был бы слишком длинным. Продолжаем работать над уменьшением проблемы. Спасибо - person Danielle   schedule 24.11.2020