1

新規ユーザーの約1%がアプリを起動しようとすると、データベースの作成に失敗します。主に中国で発生し、ロシアやその他の地域で発生することもあります。どのデバイスでも再現できませんが、ログのアップロードから情報を収集しました。

私が気づいたことの1つは、db createが失敗すると、パッケージディレクトリ/data/data/com.lootworks.swordsのファイルパーミッションが--x、つまり読み取り/書き込みができないことです。これは、rwxアクセス権を持つ私のテストデバイスとは異なります。

パッケージディレクトリに--xがあるのに、db createが失敗するのはなぜですか?SQLiteがアクセスしようとしたときにOSがパーミッションの変更などのファンキーなことをしない限り、それは確かに私には悪いことのように聞こえます。誰かがこれを見たことがありますか?

より詳しい情報:

  • アプリはサブクラス化された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 に答える