2016-04-26 4 views
1

Я использую SQLCipher как db в своем проекте. Мое приложение успешно работает в телефонах с ОС Lollipop и выше. но имеющих проблемы с ОС 4.4.4 и ниже. Я использую SQLCipher опарника (не позднее одного) .он запуске приложения, я получаю следующее сообщение об ошибке:FATAL EXCEPTION: main java.lang.VerifyError: net/sqlcipher/database/SQLiteDatabase от SQLCipher

04-26 12:50:04.940 18598-18598/packageName E/dalvikvm: Could not find class 'net.sqlcipher.database.SQLiteCompiledSql', referenced from method net.sqlcipher.database.SQLiteDatabase.deallocCachedSqlStatements 
04-26 12:50:04.940 18598-18598/packageName E/dalvikvm: Could not find class 'net.sqlcipher.database.SQLiteStatement', referenced from method net.sqlcipher.database.SQLiteDatabase.getPragmaVal 
04-26 12:50:04.945 18598-18598/packageName E/dalvikvm: Could not find class 'net.sqlcipher.database.SQLiteDatabase$SyncUpdateInfo', referenced from method net.sqlcipher.database.SQLiteDatabase.markTableSyncable 
04-26 12:50:04.955 18598-18627/packageName E/GMPM: Uploading is not possible. App measurement disabled 
04-26 12:50:04.955 18598-18598/packageName E/AndroidRuntime: FATAL EXCEPTION: main 
java.lang.VerifyError: net/sqlcipher/database/SQLiteDatabase 
at packageName.database.PassbookContentProvider.onCreate(PassbookContentProvider.java:538) 
at android.content.ContentProvider.attachInfo(ContentProvider.java:1214) 
at android.content.ContentProvider.attachInfo(ContentProvider.java:1189) 
at android.app.ActivityThread.installProvider(ActivityThread.java:5119) 
at android.app.ActivityThread.installContentProviders(ActivityThread.java:4725) 
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4665) 
at android.app.ActivityThread.access$1400(ActivityThread.java:159) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1376) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:176) 
at android.app.ActivityThread.main(ActivityThread.java:5419) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:525) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862) 
at dalvik.system.NativeStart.main(Native Method) 

приложение/build.gradle:

apply plugin: 'com.android.application' 
apply plugin: 'me.tatarka.retrolambda' 

android { 
    compileSdkVersion 23 
    buildToolsVersion "23.0.2" 

    def isSMSAuthEnabled = "false" 

    defaultConfig { 
    applicationId "packageName" 
    minSdkVersion 16 
    targetSdkVersion 22 
    versionCode 6 
    versionName "v3.0" 

    multiDexEnabled true 
    } 
    buildTypes { 
    debug { 
     resValue "bool", "enableSMSAuth", isSMSAuthEnabled 
    } 

    release { 
     minifyEnabled true 
     resValue "bool", "enableSMSAuth", isSMSAuthEnabled 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
    } 
    } 
    compileOptions { 
    sourceCompatibility JavaVersion.VERSION_1_8 
    targetCompatibility JavaVersion.VERSION_1_8 
    } 
    dexOptions { 
    javaMaxHeapSize "4g" 
    } 
    packagingOptions { 
    exclude 'META-INF/services/javax.annotation.processing.Processor' 
    exclude 'META-INF/LICENSE.txt' 
    exclude 'META-INF/NOTICE.txt' 
    } 
} 

dependencies { 
    testCompile 'junit:junit:4.12' 
    compile files('libs/PDFjet.jar') 
    compile files('libs/guava-r09.jar') 
    compile files('libs/sqlcipher.jar') 

    compile('de.keyboardsurfer.android.widget:crouton:[email protected]') { 
    exclude group: 'com.google.android', module: 'support-v4' 
    } 



    // sqlcipher 
    // compile 'net.zetetic:android-database-sqlcipher:[email protected]' 

    compile('com.mikepenz:materialdrawer:[email protected]') { 
    transitive = true 
    } 

    // Because RxAndroid releases are few and far between, it is recommended to 
    // explicitly depend on RxJava's latest version for bug fixes and new features. 

    compile 'com.android.support:appcompat-v7:23.2.1' 
    compile 'com.android.support:design:23.2.1' 
    compile 'com.google.code.gson:gson:2.4' 
    compile 'com.github.castorflex.smoothprogressbar:library-circular:1.0.2' 
    compile 'com.shamanland:fab:0.0.6' 
    compile 'com.android.support:recyclerview-v7:23.2.1' 
    compile 'com.android.support:cardview-v7:23.2.1' 
    compile 'com.squareup.retrofit:retrofit:1.9.0' 
    compile 'com.squareup.okhttp:okhttp:2.4.0' 
    compile 'com.squareup.okhttp:okhttp-urlconnection:2.4.0' 
    compile 'de.hdodenhof:circleimageview:2.0.0' 
    compile 'com.flipboard:bottomsheet-core:1.5.0' 
    compile 'com.flipboard:bottomsheet-commons:1.5.0' 
    compile 'com.github.PhilJay:MPAndroidChart:v2.2.2' 
    compile 'io.reactivex:rxandroid:1.1.0' 
    compile 'io.reactivex:rxjava:1.1.0' 
    compile 'com.bignerdranch.android:expandablerecyclerview:2.0.4' 
    compile 'com.borax12.materialdaterangepicker:library:1.6' 
    compile 'com.google.android.gms:play-services:8.4.0' 
} 

contentProvider.java

@Override public boolean onCreate() { 
    String password = null; 
    SQLiteDatabase db = null; 

    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getContext()); 
    try { 
     if (mOpenHelper == null) mOpenHelper = new BOBDatabaseOpenHelper(getContext()); 
     SQLiteDatabase.loadLibs(getContext()); 

     if (preferences.contains(Constants.OLD_USER_PIN_SET)) { 
     if (preferences.contains(Constants.REKEY) && preferences.getBoolean(Constants.REKEY, 
      true)) { 
      password = getPassword(); 
     } else { 
      password = getOldPassword(); 
     } 
     } else { 
     password = getPassword(); 
     } 
     if (password != null) db = mOpenHelper.getWritableDatabase(password); 
    } catch (SQLiteException e) { 
     e.printStackTrace(); 
    } 
    return db != null; 
    } 

ошибка происходит в этом положении в коде

SQLiteDatabase.loadLibs(getContext()); 

Я сделал достаточно исследований, но не смог решить проблему. пожалуйста, помогите мне.

ответ

0

Наконец, после многих исследований, я получил решение для моего проблема. Проблема началась, когда я добавил

compile 'com.google.android.gms:play-services:8.4.0' 

для карт в моем проекте. который не был необходим. когда я добавил это, я получил ошибку, считая, что количество методов превысило лимит в 64 КБ. поэтому я добавил

`multiDexEnabled true` 

в моем app/build.gradle все еще есть еще несколько ошибок. когда я искал я должен был добавить

dexOptions { 
    javaMaxHeapSize "4g" 
    } 

в app/build.gradle. , и больше не было ошибок в телефонах с леденцом и выше ОС. , но для других я получаю вышеуказанную проблему.

поэтому я установил ее, изменив

compile 'com.google.android.gms:play-services:8.4.0' 

в

compile 'com.google.android.gms:play-services-location:8.4.0' 
compile 'com.google.android.gms:play-services-maps:8.4.0' 
compile 'com.google.android.gms:play-services-appindexing:8.4.0' 

так методов ограничения превышены техника его подводит 64К. и проблема решена. спасибо всем за ваше время.

0

Звучит так, как будто родные библиотеки не могут быть включены в вашу сборку. Самым простым решением может быть, вы просто использовать распределение AAR мы делаем в наличии:

compile 'net.zetetic:android-database-sqlcipher:[email protected]'

+0

, но его все еще не работает. давая мне ту же ошибку. –

-1

Если вы можете удалить:

multiDexEnabled true 
+0

Я решил. Я разместил его выше. благодаря –

1

В моем случае было нецелесообразно удалять multidex, но нашли решение, используя свойство multiDexKeepFile gradle. Это подталкивает указанные классы к включению в первый dex, когда вы нарушаете предел метода 64K.

В app/build.gradle, указывают на multiDexKeepFile:

// Enabling multidex support. 
multiDexEnabled true 
multiDexKeepFile file('multidex.keep') 

И в файле Держись, указать классы, которые должны быть включены в первый декс, в моем случае мой контент-провайдера и SQLiteDatabase sqlcipher в:

com/myapp/android/database/provider/MyContentProvider.class 
net/sqlcipher/database/SQLiteDatabase.class 

Это остановило сбои в работе как на физическом S3 mini, так и на виртуальном устройстве Nexus 4 (оба api 16, оба были разбиты до исправления).