Android SDK 29 中的混淆器和消费者混淆器问题
Problem with Proguard and consumer proguard in Android SDK 29
我搜索了 Whosebug 和 proguard 的相关问题,但仍然卡住了。
我创建了一个 android .aar 库 (snifferservice),其中包含与硬件相关的功能和实用程序包。我将此用于连接到此硬件设备的大多数 Android 应用程序。我还有一个应用程序只使用库中的实用程序包。
我正在使用 Proguard 来混淆和缩小我的主要应用程序 NoseBook,并使用它来混淆和缩小已完成应用程序中的 aar。由于迁移到 androidx 并更改为目标 API 29,我无法创建发布版本,因为我收到一条错误消息,指出它找不到我专门标记为 [= 的文件的通用超类19=].
我尝试使用 proguard 规则 - 添加和删除 aar 中的其他包,特别是错误中引用的包。什么都不管用。如果我根本不将 Proguard 应用于 aar,一切都可以编译。
我的应用程序使用 Firebase Uuthentication 和 Firebase Cloud Functions。我在 Windows 10 上使用 Android Studio 3.6.3。任何想法将不胜感激。
错误:
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 和 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'
}
我的最高等级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 和 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'
}
顶级 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
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
命令,还添加和删除 android.content.*
和 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.**
最终起作用的是:错误总是出现在第二次优化过程中。我加了
-optimizationpasses 1
一开始的选项,错误从未出现。
我尝试了各种清除缓存选项,updating/reverting 内部 aar 的版本,添加了删除大量 proguard 选项,但没有成功。最坏的情况也给出了 STRING_TOO_LARGE 错误。
感谢 JensV 的帮助!
任何解决此问题的进一步想法仍将不胜感激。
我搜索了 Whosebug 和 proguard 的相关问题,但仍然卡住了。
我创建了一个 android .aar 库 (snifferservice),其中包含与硬件相关的功能和实用程序包。我将此用于连接到此硬件设备的大多数 Android 应用程序。我还有一个应用程序只使用库中的实用程序包。 我正在使用 Proguard 来混淆和缩小我的主要应用程序 NoseBook,并使用它来混淆和缩小已完成应用程序中的 aar。由于迁移到 androidx 并更改为目标 API 29,我无法创建发布版本,因为我收到一条错误消息,指出它找不到我专门标记为 [= 的文件的通用超类19=].
我尝试使用 proguard 规则 - 添加和删除 aar 中的其他包,特别是错误中引用的包。什么都不管用。如果我根本不将 Proguard 应用于 aar,一切都可以编译。
我的应用程序使用 Firebase Uuthentication 和 Firebase Cloud Functions。我在 Windows 10 上使用 Android Studio 3.6.3。任何想法将不胜感激。
错误:
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 和 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'
}
我的最高等级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 和 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'
}
顶级 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
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
命令,还添加和删除 android.content.*
和 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.**
最终起作用的是:错误总是出现在第二次优化过程中。我加了
-optimizationpasses 1
一开始的选项,错误从未出现。
我尝试了各种清除缓存选项,updating/reverting 内部 aar 的版本,添加了删除大量 proguard 选项,但没有成功。最坏的情况也给出了 STRING_TOO_LARGE 错误。
感谢 JensV 的帮助!
任何解决此问题的进一步想法仍将不胜感激。