プロジェクトでコンテンツ プロバイダを宣言するときに奇妙な問題に直面しています。自分の別のプロジェクトからクラスとマニフェスト宣言をコピーしています。私の他のプロジェクトでは問題なく動作しています。
これが私のマニフェストの一部です:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.qr"
android:installLocation="auto"
android:versionCode="540"
android:versionName="5.4" >
(...)
<application
android:name=".Application"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:logo="@drawable/ic_launch" >
(...)
<provider
android:name=".provider.HistoryProvider"
android:authorities="com.example.qr.History"
android:exported="true"
android:multiprocess="true"
android:readPermission="com.example.qr.History.read"
android:writePermission="com.example.qr.History.write" />
(...)
</application>
</manifest>
アプリを実行すると、次のスタック トレースが表示されます。
FATAL EXCEPTION: main
java.lang.NullPointerException
at android.app.ActivityThread.installProvider(ActivityThread.java:4783)
at android.app.ActivityThread.installContentProviders(ActivityThread.java:4430)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4372)
at android.app.ActivityThread.access$1300(ActivityThread.java:141)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1294)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5039)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
at dalvik.system.NativeStart.main(Native Method)
これはスタック トレース全体です。「com.example」トレースは含まれません。もちろん、私のアプリの一部のコードはこれを生成していますが、実際のクラッシュは Android で発生します。
自分のクラスはスタック トレースに含まれていないため、どこを見ればよいかわかりません。
Android 4.2 のエミュレーターでコードを実行し、そのバージョンの Android のソース コードと比較したので、ActivityThread の次の行でクラッシュが発生することがわかりました。
4782 ApplicationInfo ai = info.applicationInfo;
4783 if (context.getPackageName().equals(ai.packageName)) {
コンテンツ プロバイダーを宣言しない場合 (つまり、私のマニフェストから)、アプリは完全に動作します。
Application クラスとメインの Activity クラスにいくつかのログを追加しました。クラッシュは、いずれかが起動される前に発生します。
したがって、私の質問は次のとおりです。私のコードでは、インストール中にcontext、context.getPackageName()またはinfo.applicationInfoをnullにすることができるものは何ですか?
編集
エミュレーターでスタック トレースを数回トリガーすると、トレース間でのみ次のようになります。
09-11 23:10:21.250: E/AndroidRuntime(933): at dalvik.system.NativeStart.main(Native Method)
09-11 23:10:21.470: D/dalvikvm(933): GC_CONCURRENT freed 142K, 9% free 2951K/3224K, paused 78ms+3ms, total 225ms
09-11 23:10:44.030: I/Process(933): Sending signal. PID: 933 SIG: 9
09-11 23:10:46.940: D/dalvikvm(947): GC_CONCURRENT freed 164K, 10% free 2711K/2996K, paused 13ms+114ms, total 201ms
09-11 23:10:47.170: I/ActivityThread(947): Pub com.example.qr.History: com.example.qr.provider.HistoryProvider
09-11 23:10:47.170: D/AndroidRuntime(947): Shutting down VM
09-11 23:10:47.170: W/dalvikvm(947): threadid=1: thread exiting with uncaught exception (group=0x40a70930)
09-11 23:10:47.180: E/AndroidRuntime(947): FATAL EXCEPTION: main