Room SQLCipher 提供了一个替代的 LibraryLoader
Room SQLCipher provide an alternative LibraryLoader
我想知道是否有办法为 SQLCipher 添加替代的 LibraryLoader。
Huawei Enjoy 9s
(Android 5.1 root)和 Nexus 4
(Android 6.0.1 未 root)的某些设备会产生下一次崩溃:
Fatal Exception: java.lang.UnsatisfiedLinkError
dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.application-1/base.apk"],
nativeLibraryDirectories=[/data/app/com.application.app-1/lib/arm, /vendor/lib, /system/lib]]]
couldn't find "libsqlcipher.so"
如果可能的话,我如何找到合适的库名称来加载以及在何处执行操作?
这是来自 SQLiteDatabase
:
的代码
/**
* Loads the native SQLCipher library into the application process.
*/
public static synchronized void loadLibs (Context context, File workingDir, LibraryLoader libraryLoader) {
libraryLoader.loadLibraries("sqlcipher");
// System.loadLibrary("stlport_shared");
// System.loadLibrary("sqlcipher_android");
// System.loadLibrary("database_sqlcipher");
// boolean systemICUFileExists = new File("/system/usr/icu/icudt46l.dat").exists();
// String icuRootPath = systemICUFileExists ? "/system/usr" : workingDir.getAbsolutePath();
// setICURoot(icuRootPath);
// if(!systemICUFileExists){
// loadICUData(context, workingDir);
// }
}
这就是我创建数据库实例的方式:
import net.sqlcipher.database.SQLiteDatabase
import net.sqlcipher.database.SupportFactory
...
val passphrase: ByteArray = SQLiteDatabase.getBytes((BuildConfig.ROOM_PASSPHRASE + session.getRoomUUID()).toCharArray())
val factory = SupportFactory(passphrase)
val instance = Room.databaseBuilder(context.applicationContext, MyDatabase::class.java, "MyDatabase")
.openHelperFactory(factory)
.fallbackToDestructiveMigration()
.build()
...
不是很明显,但我发现了一个问题。 SupportFactory
实例每次打开数据库只能使用一次。因此,在登录屏幕上重置保存数据库实例的 Dagger 组件解决了这个问题。
无需手动loadLibraries
,只需在正确的位置重新设置DI组件即可。
我想知道是否有办法为 SQLCipher 添加替代的 LibraryLoader。
Huawei Enjoy 9s
(Android 5.1 root)和 Nexus 4
(Android 6.0.1 未 root)的某些设备会产生下一次崩溃:
Fatal Exception: java.lang.UnsatisfiedLinkError dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.application-1/base.apk"], nativeLibraryDirectories=[/data/app/com.application.app-1/lib/arm, /vendor/lib, /system/lib]]] couldn't find "libsqlcipher.so"
如果可能的话,我如何找到合适的库名称来加载以及在何处执行操作?
这是来自 SQLiteDatabase
:
/**
* Loads the native SQLCipher library into the application process.
*/
public static synchronized void loadLibs (Context context, File workingDir, LibraryLoader libraryLoader) {
libraryLoader.loadLibraries("sqlcipher");
// System.loadLibrary("stlport_shared");
// System.loadLibrary("sqlcipher_android");
// System.loadLibrary("database_sqlcipher");
// boolean systemICUFileExists = new File("/system/usr/icu/icudt46l.dat").exists();
// String icuRootPath = systemICUFileExists ? "/system/usr" : workingDir.getAbsolutePath();
// setICURoot(icuRootPath);
// if(!systemICUFileExists){
// loadICUData(context, workingDir);
// }
}
这就是我创建数据库实例的方式:
import net.sqlcipher.database.SQLiteDatabase
import net.sqlcipher.database.SupportFactory
...
val passphrase: ByteArray = SQLiteDatabase.getBytes((BuildConfig.ROOM_PASSPHRASE + session.getRoomUUID()).toCharArray())
val factory = SupportFactory(passphrase)
val instance = Room.databaseBuilder(context.applicationContext, MyDatabase::class.java, "MyDatabase")
.openHelperFactory(factory)
.fallbackToDestructiveMigration()
.build()
...
不是很明显,但我发现了一个问题。 SupportFactory
实例每次打开数据库只能使用一次。因此,在登录屏幕上重置保存数据库实例的 Dagger 组件解决了这个问题。
无需手动loadLibraries
,只需在正确的位置重新设置DI组件即可。