1

I am using SQLCipher as db in my project.My app is running successfully in phones with OS lollipop and above. but having issues from OS 4.4.4 and below. I am using SQLCipher jar files (not the latest one).on application start, I am getting the following error:

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)

app/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;
  }

error is occurring at this position in the code

SQLiteDatabase.loadLibs(getContext());

I have done enough research but couldn't solve the issue. please help me.thanks.

USER9561
  • 1,084
  • 3
  • 15
  • 41
Nabeel K
  • 5,938
  • 11
  • 38
  • 68

4 Answers4

1

In my case it wasn't practical to remove multidex, but found a solution using gradle's multiDexKeepFile property. This nudges the specified classes to be inluded in the first dex when you're breaching the 64K method limit.

In app/build.gradle, point to a multiDexKeepFile:

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

And in the keep file, specify the classes you need to be included in the first dex, in my case my content provider and sqlcipher's SQLiteDatabase:

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

This stopped the crashing from happening on both a physical S3 mini and a Nexus 4 virtual device (both api 16, both crashed before the fix).

Kaneelster
  • 11
  • 3
0

It sounds as if the native libraries may not be included within your build. The easiest solution maybe for you to just use the AAR distribution we make available:

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

Nick Parker
  • 1,378
  • 1
  • 7
  • 10
0

Finally, after lots of research, I got the solution for my problem. The problem started when I added

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

for maps in my project. which wasnt necessary. when I added this I got an error saying method count exceeded 64K limit. so I added

`multiDexEnabled true` 

in my app/build.gradle still got some more errors. when I searched I had to add

 dexOptions {
    javaMaxHeapSize "4g"
  }

into app/build.gradle. and there was no more error in phones with lollipop and above OS. but for others I am getting the above problem.

so I fixed it by changing

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'

so the methods didnt exceeded 64K limit. and the problem got solved. thanks everyone for your time.

Nabeel K
  • 5,938
  • 11
  • 38
  • 68
-1

If you can delete:

multiDexEnabled true
Box Box Box Box
  • 5,094
  • 10
  • 49
  • 67