1

当大约 1% 的新用户尝试启动我们的应用程序时,我们的数据库创建失败。主要发生在中国,有时在俄罗斯和其他地区。无法在我的任何设备上重现它,但我从日志上传中收集了信息。

我注意到一件事:当 db create 失败时,我们的包目录 /data/data/com.lootworks.swords 的文件权限是 --x 即无法读/写。这与我的具有 rwx 访问权限的测试设备不同。

包目录上的 --x 是 db create 失败的原因吗?这对我来说肯定听起来很糟糕,除非当 SQLite 尝试访问它时操作系统会做一些时髦的事情,比如更改权限。有没有人见过这个?

更多信息:

  • 该应用程序使用子类 SQLiteOpenHelper,非常常规(不复制准备好的 db 文件或类似的东西)
  • 对 getWritableDatabase() 的初始调用发生在 Application.onCreate() 期间
  • 该调用在调用我们的 SQLiteOpenHelper.onCreate() 方法之前失败

第一次调用 getWritableDatabase() 时出现异常。这应该回调我们的 onCreate 但在此之前它失败了:

Caused by: android.database.sqlite.SQLiteException: unable to open database file
at android.database.sqlite.SQLiteDatabase.dbopen(Native Method)
at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1880)
at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:851)
at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:885)
at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:878)
at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:599)
at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:234)
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:149)
at com.lootworks.swords.db.SwSqlDbOpenHelper.getDb(SourceFile:379)
at com.lootworks.swords.db.SwSqlDbOpenHelper.getOpenHelper(SourceFile:88)
at com.lootworks.swords.db.SwSqlDb.prepareDatabase(SourceFile:66)
at com.lootworks.swords.SwApplication.onCreate(SourceFile:291)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1004)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:3372)
at android.app.ActivityThread.access$2200(ActivityThread.java:155)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1031)
at android.os.Handler.dispatchMessage(Handler.java:130)
at android.os.Looper.loop(SourceFile:351)
at android.app.ActivityThread.main(ActivityThread.java:3818)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:538)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:659)
at dalvik.system.NativeStart.main(Native Method)

我已经检查过的事情:

  • 一些用户被侧载(一些CN文件共享的东西?)但有安装程序是com.android.vending(GPlay)的例子
4

1 回答 1

1

包目录上的 --x 是 db create 失败的原因吗?

那将是我的猜测。您的进程甚至无法查看是否databases/存在,更不用说创建它了。

一些用户被侧载(一些CN文件共享的东西?)但有安装程序是com.android.vending(GPlay)的例子

请记住,Play 商店被盗版了很多,所以仅仅因为声称由 Google Play 安装的应用程序并不意味着该设备与 Play 商店兼容。

于 2013-02-02T20:13:51.613 回答