НЕИСПРАВНОЕ ИСКЛЮЧЕНИЕ: основной java.lang.VerifyError: net/sqlcipher/database/SQLiteDatabase из SQLCipher

Я использую SQLCipher в качестве базы данных в своем проекте. Мое приложение успешно работает на телефонах с OS Lollipop и выше. но возникают проблемы с ОС 4.4.4 и ниже. Я использую jar-файлы 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:1.8.5@aar') {
    exclude group: 'com.google.android', module: 'support-v4'
  }



  // sqlcipher
  //  compile 'net.zetetic:android-database-sqlcipher:3.3.1-2@aar'

  compile('com.mikepenz:materialdrawer:5.1.2@aar') {
    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());

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


person Nabeel K    schedule 26.04.2016    source источник


Ответы (4)


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

В app/build.gradle укажите на multiDexKeepFile:

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

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

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

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

person Kaneelster    schedule 07.10.2016

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

compile 'net.zetetic:android-database-sqlcipher:3.4.0@aar'

person Nick Parker    schedule 27.04.2016
comment
но он все еще не работает. дает мне ту же ошибку. - person Nabeel K; 28.04.2016

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

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'

to

 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'

поэтому методы не превысили лимит 64K. и проблема решилась. спасибо всем за ваше время.

person Nabeel K    schedule 03.05.2016

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

multiDexEnabled true
person Antonio    schedule 03.05.2016