#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 за вашу помощь!
Любые дальнейшие идеи по решению этой проблемы все равно будут оценены.