読者です 読者をやめる 読者になる 読者になる

初老のボケ防止日記

おっさんのひとりごとだから気にしないようにな。

スポンサーリンク

adb経由でandroid.intent.action.BOOT_COMPLETEDを投げるとザラキ効果がある

Android


端末起動時にサービスを自動起動して動作確認したかったんで、いちいち実機再起動とか面倒くさいなあと。ということでamコマンドでインテント投げたらいいよねって試したら、

再起動するんですよ。

あれ?自分のやり方がおかしいのかなーっと思って

と、Twitterでつぶやいたら

と、みんなが楽しみだしたのでチョット調べてみました。

死ぬパターン

adb shell am broadcast -a android.intent.action.BOOT_COMPLETED


死んだ時のlogcatを眺めたらバージョンによって死ぬ場所が違う。

4.4.4

07-16 15:02:12.762 E/AndroidRuntime(  920): *** FATAL EXCEPTION IN SYSTEM PROCESS: main
07-16 15:02:12.762 E/AndroidRuntime(  920): java.lang.IllegalArgumentException: Invalid userId -1
07-16 15:02:12.762 E/AndroidRuntime(  920):     at com.android.server.DevicePolicyManagerService.enforceCrossUserPermission(DevicePolicyManagerService.java:4148)
07-16 15:02:12.762 E/AndroidRuntime(  920):     at com.android.server.DevicePolicyManagerService.getMaximumTimeToLock(DevicePolicyManagerService.java:2957)
07-16 15:02:12.762 E/AndroidRuntime(  920):     at com.android.server.DevicePolicyManagerService.updateMaximumTimeToLockLocked(DevicePolicyManagerService.java:2863)
07-16 15:02:12.762 E/AndroidRuntime(  920):     at com.android.server.DevicePolicyManagerService.loadSettingsLocked(DevicePolicyManagerService.java:1864)
07-16 15:02:12.762 E/AndroidRuntime(  920):     at com.android.server.DevicePolicyManagerService.getUserData(DevicePolicyManagerService.java:1279)
07-16 15:02:12.762 E/AndroidRuntime(  920):     at com.android.server.DevicePolicyManagerService$1$1.run(DevicePolicyManagerService.java:395)
07-16 15:02:12.762 E/AndroidRuntime(  920):     at android.os.Handler.handleCallback(Handler.java:733)
07-16 15:02:12.762 E/AndroidRuntime(  920):     at android.os.Handler.dispatchMessage(Handler.java:95)
07-16 15:02:12.762 E/AndroidRuntime(  920):     at android.os.Looper.loop(Looper.java:212)
07-16 15:02:12.762 E/AndroidRuntime(  920):     at com.android.server.ServerThread.initAndLoop(SystemServer.java:1212)
07-16 15:02:12.762 E/AndroidRuntime(  920):     at com.android.server.SystemServer.main(SystemServer.java:1309)
07-16 15:02:12.762 E/AndroidRuntime(  920):     at java.lang.reflect.Method.invokeNative(Native Method)
07-16 15:02:12.762 E/AndroidRuntime(  920):     at java.lang.reflect.Method.invoke(Method.java:515)
07-16 15:02:12.762 E/AndroidRuntime(  920):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:902)
07-16 15:02:12.762 E/AndroidRuntime(  920):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:718)
07-16 15:02:12.762 E/AndroidRuntime(  920):     at dalvik.system.NativeStart.main(Native Method)

5.1.1

07-16 14:50:46.831 E/AndroidRuntime(30744): *** FATAL EXCEPTION IN SYSTEM PROCESS: main
07-16 14:50:46.831 E/AndroidRuntime(30744): java.lang.RuntimeException: Error receiving broadcast Intent { act=android.intent.action.BOOT_COMPLETED flg=0x10 } in com.android.server.content.SyncManager$2@d2ded80
07-16 14:50:46.831 E/AndroidRuntime(30744):     at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:876)
07-16 14:50:46.831 E/AndroidRuntime(30744):     at android.os.Handler.handleCallback(Handler.java:739)
07-16 14:50:46.831 E/AndroidRuntime(30744):     at android.os.Handler.dispatchMessage(Handler.java:95)
07-16 14:50:46.831 E/AndroidRuntime(30744):     at android.os.Looper.loop(Looper.java:135)
07-16 14:50:46.831 E/AndroidRuntime(30744):     at com.android.server.SystemServer.run(SystemServer.java:269)
07-16 14:50:46.831 E/AndroidRuntime(30744):     at com.android.server.SystemServer.main(SystemServer.java:170)
07-16 14:50:46.831 E/AndroidRuntime(30744):     at java.lang.reflect.Method.invoke(Native Method)
07-16 14:50:46.831 E/AndroidRuntime(30744):     at java.lang.reflect.Method.invoke(Method.java:372)
07-16 14:50:46.831 E/AndroidRuntime(30744):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
07-16 14:50:46.831 E/AndroidRuntime(30744):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
07-16 14:50:46.831 E/AndroidRuntime(30744): Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'java.util.Iterator java.util.List.iterator()' on a null object reference
07-16 14:50:46.831 E/AndroidRuntime(30744):     at com.android.server.content.SyncManager$SyncHandler.onBootCompleted(SyncManager.java:1953)
07-16 14:50:46.831 E/AndroidRuntime(30744):     at com.android.server.content.SyncManager$2.onReceive(SyncManager.java:227)
07-16 14:50:46.831 E/AndroidRuntime(30744):     at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:866)
07-16 14:50:46.831 E/AndroidRuntime(30744):     ... 9 more

死なないパターン

「-c」でカテゴリを追加したら死ななくなった

adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -c android.intent.category.HOME
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -c android.intent.category.DEFAULT
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -c android.intent.category.LAUNCHER

バージョンごとの挙動

自分の手持ちだと以下の動作が違う

機種 バージョン カテゴリ無 カテゴリ有
Xperia P LT22i 4.1.2 死なない 死なない
Xperia Z3 Compact 4.4.4 死ぬ 死なない
LG Nexus5 5.1.1 死ぬ 死なない

デバッグでアプリがインテントを受信しない時

端末が再起動しなくなったのはよかったけど、アプリがインテント受信しないなーと思ってたら

Yukiの枝折: Android:Broadcastを受信できないアプリのSTOP状態

Android3.1以降、アプリケーションに新たなステータス"STOP"が追加されました。アプリインストール後、一度も起動されていないアプリはSTOP状態となります。システムアプリを除いて、STOP状態のアプリはBroadcastIntentを受け取れない場合があります。
# 概要はhttp://developer.android.com/sdk/android-3.1.htmlで紹介されています。

Android4.x以降でもこれは有効です。「ブロードキャストを受信できない」といった不具合が出た場合、STOP状態となっていないか確認したほうがよいでしょう。

Android5.1.1でもこれは同じだ。

ということで、「--include-stopped-packages」をつけたら受信できた。

adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -c android.intent.category.DEFAULT --include-stopped-packages
  • あんざい先生... いつも御世話になっております

Android Pattern Cookbook マーケットで埋もれないための差別化戦略

Android Pattern Cookbook マーケットで埋もれないための差別化戦略

  • おじいちゃんのお口が臭いときはIntentじゃなくてポリデントを投げよう

酵素入り ポリデント 108錠

酵素入り ポリデント 108錠

  • Gon Boot

日清 ごんぶと 天ぷらうどん 217g×12個

日清 ごんぶと 天ぷらうどん 217g×12個

スポンサーリンク