【问题标题】:CWAC Saferoom and Code Shrinking, How do I shrink my code while having Saferoom? [FIXED]CWAC 安全室和代码收缩,我如何在拥有安全室的同时收缩我的代码? [固定的]
【发布时间】:2019-10-08 06:37:40
【问题描述】:

我需要帮助使用 CWAC Saferoom 实现 android 的 R8 代码收缩器。

两者都实现得很好,并在调试模式下进行了测试,但是当我生成发布 APK 时,会出现此堆栈跟踪并且应用程序崩溃:

2019-10-08 14:10:32.890 22013-22013/? A/.sample: thread.cc:2166] No pending exception expected: java.lang.NoSuchFieldError: no "J" field "mNativeHandle" in class "Lnet/sqlcipher/database/SQLiteDatabase;" or its superclasses
2019-10-08 14:10:32.890 22013-22013/? A/.sample: thread.cc:2166]   at java.lang.String java.lang.Runtime.nativeLoad(java.lang.String, java.lang.ClassLoader) (Runtime.java:-2)
2019-10-08 14:10:32.890 22013-22013/? A/.sample: thread.cc:2166]   at void java.lang.Runtime.loadLibrary0(java.lang.ClassLoader, java.lang.String) (Runtime.java:1014)
2019-10-08 14:10:32.890 22013-22013/? A/.sample: thread.cc:2166]   at void java.lang.System.loadLibrary(java.lang.String) (System.java:1672)
2019-10-08 14:10:32.890 22013-22013/? A/.sample: thread.cc:2166]   at void net.sqlcipher.database.SQLiteDatabase$a.a(java.lang.String[]) (:-1)
2019-10-08 14:10:32.890 22013-22013/? A/.sample: thread.cc:2166]   at void net.sqlcipher.database.SQLiteDatabase.a(net.sqlcipher.database.SQLiteDatabase$e) (:-1)
2019-10-08 14:10:32.890 22013-22013/? A/.sample: thread.cc:2166]   at void net.sqlcipher.database.SQLiteDatabase.a(android.content.Context, java.io.File) (:-1)
2019-10-08 14:10:32.890 22013-22013/? A/.sample: thread.cc:2166]   at void net.sqlcipher.database.SQLiteDatabase.a(android.content.Context) (:-1)

我相信我遗漏了一些东西,可能在 proguard 文件中排除了安全室的包(如果我使用 proguard),或者在缩小我的代码时我是否必须在我的依赖项中添加 SQLCipher 库,如果没有,我全力以赴想法。

注意:

  • 由于隐私原因,我更改了应用 ID 和堆栈跟踪 ID
  • 我的问题只发生在我生成发布 APK 时,另一方面,SQLCipher 数据库很好并且实现得很好

应用的构建等级

android {
    compileSdkVersion 28
    buildToolsVersion "28.0.3"
    defaultConfig {
        applicationId "sample.id"
        minSdkVersion 23
        targetSdkVersion 28
        versionCode 1
        versionName "0.1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            useProguard false
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support:design:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'

    // JUnit Library
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

    // Room Database Library
    implementation "android.arch.persistence.room:runtime:1.1.1"
    implementation 'com.android.support:design:28.0.0'
    implementation 'com.android.support:support-annotations:28.0.0'
    implementation 'android.arch.lifecycle:extensions:1.1.1'
    annotationProcessor "android.arch.persistence.room:compiler:1.1.1"

    // CWAC SafeRoom Library
    implementation "com.commonsware.cwac:saferoom:1.2.1"

//... some unimportant android libraries
}


解决方案:

根据@commonsware,将以下内容添加到您的 proguard 文件中(无论您使用 Android R8 还是 proguard),它应该可以工作:

-keep class net.sqlcipher.** { *; }
-keep class net.sqlcipher.database.* { *; }

【问题讨论】:

  • 具体的收缩错误来自 SQLCipher for Android,而不是 SafeRoom。

标签: android sqlcipher commonsware-cwac


【解决方案1】:

基于this issue,将此添加到您的 ProGuard 保留规则中:

-keep class net.sqlcipher.** { *; }
-keep class net.sqlcipher.database.* { *; }

【讨论】:

  • 罪魁祸首毕竟是Android SQLCipher!我将这些行添加到我的 proguard 文件中并且它有效。谢谢@commonsware
  • 我有同样的问题,但是这个解决方案似乎不起作用
  • @FrancisSaa-Dittoh:仅供参考,CWAC-SafeRoom 不久前已停止使用,因为 Android 的 SQLCipher 现在直接支持 SupportSQLite* API 和 Room。
  • @CommonsWare 抱歉,不是指 CWAC-SafeRoom,而是 sqlcipher 的 ProGuard 问题(在 Github 链接中)。
  • @FrancisSaa-Dittoh:啊,好的。您可能想加入 the Zetetic discussion board 并询问他们是否有任何更新的 ProGuard 建议。
猜你喜欢
  • 2010-09-10
  • 2011-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多