CWAC Saferoom и сжатие кода. Как сжать код при использовании Saferoom? [ИСПРАВЛЕНО] - PullRequest
0 голосов
/ 08 октября 2019

Мне нужна помощь в реализации программы сжатия кода Android R8 с CWAC Saferoom.

Оба реализованы хорошо и протестированы в режиме отладки, но когда я генерирую релиз 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)

Мне кажется, что я что-то упустил, возможно, исключая пакет saferoom в файле proguard (если я использую proguard), или мне нужно добавить библиотеку SQLCipher в мои зависимости при сжатии моего кода, если нет,У меня нет идей.

ПРИМЕЧАНИЕ:

  • Я изменил идентификатор приложения и идентификатор трассировки стека по соображениям конфиденциальности
  • Моя проблема возникает только при генерациис выпуском APK, база данных SQLCipher, с другой стороны, прекрасно и хорошо реализована

Gradle сборки приложения

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.* { *; }

1 Ответ

0 голосов
/ 08 октября 2019

На основании этой проблемы добавьте это в свои правила хранения ProGuard:

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