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.v4support.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 的帮助!

任何解决此问题的进一步想法仍将不胜感激。