ホームアプリ作ったら戻れなくなった

 Android 8環境のTHINKLETで、Flutterでホームアプリを書いてみた。

 Gemini 1.5 proに聞いてみたら、Flutterでは作れないとか言いおった。そんなわけないっしょ... アプリリストを取ったりするののパーミッションが厳しくなっているのは確かだけどね。

 作った代替ホームアプリは、起動するとカメラアプリをラウンチするだけのシンプルなもの。一応画面はある。

 ビルドして起動すると、カメラアプリに遷移したので機能的には問題ない。

 backボタンでカメラアプリから出ようとすると、ホームアプリの選択画面が出てくる。ここで「別のアプリをの使用」を選ぶと代替ホームアプリがデフォルトになる。

 代替ホームアプリが起動してくる。このときは、カメラアプリに遷移しない。

 ホームボタンを押すと、またホームアプリ選択画面になる。ここで「常時」を選ぶと確定して、代替ホームがホームアプリになる。ホームアプリの選択画面は二度と出てこない。

 選ぶと真っ黒な画面になる。

 Backボタンを押すと「メニューです」という音声が出るので、デフォルトホームが残って起動されているのだけど、フロントには来ない。

 ホームボタンを押すと代替ホームが起動されてカメラアプリに遷移する。

 カメラアプリを終了すると、代替ホームの画面になる。カメラアプリに自動遷移しない。

 再起動しても、代替ホームがホームアプリという状態は維持される。

 もう、デフォルトホームアプリは起動していないので、Backボタンで戻ってもカメラアプリが起動するようになる。

 カメラアプリからホームボタンでは、代替ホームの画面になる。

 電源ボタンを短く押したときも、代替ホームが起動してくる。

 ライフサイクルのどこにいるかで挙動が違ってしまって少し困る。カメラにラウンチするときと、代替ホームの画面が出るときとがある。もっと条件を厳密に書かないとダメね。

 代替ホームをホームアプリに指定してやると、再起動してもホームとして起動してくる。初回起動時にはカメラアプリをラウンチするので、動作的には想定した動きになるので問題ないかな?

 で、この状態で、もうデフォルトのホームを起動する方法はない。他のアプリも起動できないw 「ホーム画面に戻る」というボタンは、いまはダミーで何も実装していないw

 元に戻すには、いくつかのAndroidではホームボタンを長押しで切り替え画面に遷移できるようになっているのだけど、THINKLETにはホームボタンはない。電源ボタンは長押しすると電源が切れてしまう。

 代替ホームアプリを削除したらいいのかな? やってみる。

 % adb uninstall com.kinneko.homeapp.my_home_app

 Success

 デフォルトのホームが起動してきた。

 設定で確認しても、デフォルトアプリがホームになっている。

 入れた代替ホームを削除したくないときにはどうしたらいいんだろう? ここから先が結構迷路だった。

 代替ホームの設定をクリアしてみる。

 % adb shell cmd package clear com.kinneko.homeapp.my_home_app

 Unknown command: clear

 失敗。

 pmでならどうかな?

 % adb shell pm clear com.kinneko.homeapp.my_home_app

 Success

 おお、戻った? と思ったのだけど、ホームボタンを押すと、代替ホームが起動して、カメラアプリに遷移した。

 もとのホームアプリを直接叩いてみる。アプリ名を知らないので、調べる。

 どれがホームアプリだ? 長すぎるので略。

 % adb shell pm list packages

(snip)

 どうやら、ai.fd.thinklet.app.launcher のようだ。

 呼び出すアクティビティを調べる。1個しかないのね。

 % adb shell dumpsys package ai.fd.thinklet.app.launcher | grep -i activity

 Activity Resolver Table:

 e9bdb1e ai.fd.thinklet.app.launcher/.ThinkletLauncherActivity filter e432fa4

 e9bdb1e ai.fd.thinklet.app.launcher/.ThinkletLauncherActivity filter f38fe37

 amコマンドで呼んでみる。起動してきた。でも、音声は初回起動の「電源を付けました」なのね。しかし、すぐに代替ホームにオーバーライドされてしまう。あらら、やばい。

 % adb shell am start -n ai.fd.thinklet.app.launcher/.ThinkletLauncherActivity

 Starting: Intent { cmp=ai.fd.thinklet.app.launcher/.ThinkletLauncherActivity }

 ホームボタンとしての設定を強制してみる。コマンド実行後、ホームボタンを押すと、指定したアプリがホームアプリとして起動するのだけど、ならない...

 % adb shell cmd package set-home ai.fd.thinklet.app.launcher

 Unknown command: set-home

 デフォルトのホームアプリに戻す方法も試す。これも失敗。

 % adb shell cmd package set-home ""

 Unknown command: set-home

 Android 12以降では、セキュリティ強化のため、adb shell cmd package set-home コマンドは制限されているそうだけど、これは8だよ。なんで動かんの...

 ちなみに12では、デバイスを開発者モードにして、USBデバッグを有効にする必要があるらしい。試してないけど。

 優先アクティビティ(デフォルトで起動されるアプリ)をリセットしてみる。ダメ...

 % adb shell pm reset-preferred-activities

 Error: unknown command 'reset-preferred-activities'

 デフォルトホームアプリにホームアプリとしての設定を強制してみる。ダメ。

 % adb shell pm set-home-activity ai.fd.thinklet.app.launcher/.ThinkletLauncherActivity

 Error: unknown command 'set-home-activity'

 pm reset-preferred-activitiesやpm set-home-activityが認識されないということは、使用しているAndroidバージョンがかなり古い? まぁ、8なので古いけど。

 最近は非推奨だそうだけど、set-preferred-activityを使ってみる。コンポーネント名(アプリ名とアクティビティ名)を指定しないと、デフォルトのランチャーに戻すそう。古いAndroidでは有効みたい。ダメ。そこまで古くなかったかw

 % adb shell cmd activity set-preferred-activity

 Unknown command: set-preferred-activity

 % adb shell cmd activity set-preferred-activity ai.fd.thinklet.app.launcher/.ThinkletLauncherActivity

 Unknown command: set-preferred-activity

 アクティビティを新しいタスクでクリアトップで起動するオプションを強制してみる。これは、うまくいった。デフォルトホームが起動してきた。

 % adb shell am start -a android.intent.action.MAIN -c android.intent.category.HOME -n ai.fd.thinklet.app.launcher/.ThinkletLauncherActivity -f 0x10200000

 Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10200000 cmp=ai.fd.thinklet.app.launcher/.ThinkletLauncherActivity }

 でも、デフォルトホームはアプリとして起動しただけで、ホームになったわけではないようだ。とりあえず、このまま再起動してみたけれど、ホームの切り替えは起きていない。ヤバいw

 ホームアプリは起動はしているけど、優先順位で代替ホームに負けている。

 しょうがないので、さきほどのコマンドでメニューを起動して、設定アプリから手動で切り替えた。なかなかにつらい。

 というわけで、代替ホームには、設定アプリを開くボタンは必須ということのようだ。

 設定アプリのホーム切り替えの画面を直接呼べないかと思って、logcatして設定アプリを操作してみたけど、固有の画面名は持たないようで「com.android.settings/com.android.settings.SubSettings」が呼ばれていた。これは、ただの詳細画面を呼ぶだけなのよ。

 「設定->アプリと通知->デフォルト アプリ->ホームアプリ」と手でたどるしかなくて、とてもダサい。adbからは操作できずに、そんな解決方法しかないということはわかったよ。

 しかし、THINKLETではGUIがないのよ... トホホ...


オリジナル投稿:
ホームアプリ作ったら戻れなくなった|kinneko|pixivFANBOX
https://kinneko.fanbox.cc/posts/9253238