やりたいこと
色々と記事があるけど、BootCompleteの動作の整理を行いたい
Step1.通常設定(BootCompleteの受信)
(出尽くしている内容だが)以下を追加する
AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:sharedUserMaxSdkVersion="31">
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application
<activity></activity>
<receiver
android:name=".StartReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
StartReceiver.java
public class StartReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
:(起動時に実行したい処理)
}
}
}
Step2.実行結果
Activity起動などを実行した結果は以下の通り
実行処理 | 結果 |
---|---|
Activity起動(StartActivity) | 起動しない |
Service起動(StartService) | 起動しない |
SharedPreferencesの書き込み | 起動する |
解説
- Activity起動/Service起動:単純に起動制限がかかっているため(https://developer.android.com/guide/components/activities/background-starts?hl=ja)
- SharedPreference書き込み:起動制限対象外のため、書き込みができていると思われる
起動直後にActivityなどの起動は行えないが、「端末が起動したか?」の状態を管理することぐらいはできると思われる
Step3.それでもActivity/Serviceを起動させたい!
条件を整えることができれば、上記の制限を突破することが可能
条件 | 概要 |
---|---|
端末の証明書ファイル | 対象となる端末の証明書ファイルを用いてAPKを生成する |
システム管理権限 | AndroidManiestで android:sharedUserId="android.uid.system"を定義する |
AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:sharedUserMaxSdkVersion="31"
android:sharedUserId="android.uid.system">
証明書があれば、上記をAndroidManifestに設定することで、システム管理者に昇格することが可能。
ただ、ハードの製造元でもなければ証明書ファイルを入手することは不可能と思われる。
どちらかというと、自社でハードを製造しているような場合でしかできない手法だと思われます。
なお、システム管理者になることでWebViewがセキュリティ上の理由から使用できなくなるなど制約もあり一長一短(…実は抜け道もある)
最後に
BootCompleteでの処理は、あまり現実的なことはできないかんというのが感想
年々制限が厳しくなっており、実現したいことが実現しにくくなっている気がします