应用自启¶
本章节介绍安卓系统开机后自动启动指定应用的两种实现方式:属性配置方式和 Launcher 桌面方式。前者通过系统属性指定启动的应用,后者通过将应用设为桌面应用实现开机自启。
属性配置¶
Tip
属性配置是 KICKPI 安卓系统客制功能(部分系统镜像未支持,如果无法正常使用请咨询 KICKPI 官方技术支持)。
用户通过配置系统属性指定开机自启应用,不替换系统桌面。
ADB 配置¶
用户可通过 ADB 命令设置系统属性,开机时指定应用将自动启动。仅对当前设备生效,刷机或恢复出厂后需重新设置。
1. 通过接入 U 盘、ADB 等方式安装应用。
2. 打开应用后执行 ADB 命令,获取当前页面应用的包名和页面类名。
输出格式为 包名/类名,例如打开设置,能够获取到 com.android.settings/com.android.settings.Settings。(更多获取方式见附录)
3. 配置属性后重启设备生效。
Note
packname :包名
classname: 页面类名
adb shell
setprop persist.sys.bootAppPack $packname
setprop persist.sys.bootAppClass $classname
reboot
adb shell
setprop persist.sys.bootAppPack com.android.settings
setprop persist.sys.bootAppClass com.android.settings.Settings
reboot
SDK 配置¶
用户在 SDK 源码中配置开机自启属性,并将将应用预装为系统应用,编译烧录后开机自启应用。
1. SDK 预装应用。
2. 获取应用的包名和页面类名。(获取方式见 附录)
3. 根据对应的 SDK 源码,查看对应以及应用预装路径。
// rk-android13.0
device/rockchip/common/device.mk
// rk-android14.0
device/rockchip/common/device.mk
// h618-android12.0
vendor/aw/homlet/homlet.mk
// t527-android13.0
device/softwinner/saturn/t527-demo/device-common.mk
// a133-android10.0-v2.0
android/device/softwinner/ceres-c3/ceres_c3.mk
// a733-android13.0
device/softwinner/jupiter/a733-demo-aiot/device-common.mk
4. 以 RK3568 K1 为例,在编译配置 .mk 文件末尾添加开机自启属性(替换为你的应用包名和类名)
--- a/device/rockchip/common/device.mk
+++ b/device/rockchip/common/device.mk
@@ -1030,6 +1030,10 @@ PRODUCT_PACKAGES += \
PRODUCT_PROPERTY_OVERRIDES += \
service.adb.tcp.port=5555
+PRODUCT_PROPERTY_OVERRIDES += \
+ persist.sys.bootAppPack=com.android.TestLauncher \
+ persist.sys.bootAppClass=com.android.TestLauncher.Activity
+
4. 编译 SDK,烧录镜像。
Launcher 桌面¶
Android 系统开机后会自动启动带 HOME 属性的应用。
应用配置¶
1. 在应用的 AndroidManifest.xml 中添加 HOME 属性,使应用具备桌面应用的资格:
<activity android:name=".MainActivity" android:directBootAware="true">
<intent-filter>
<category android:name="android.intent.category.HOME"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
2. 重新编译生成带 HOME 属性的应用。部分应用涉及系统权限,添加系统签名。
3. 安装应用,并在设置中 > Apps > Default apps > Home app 修改成你的应用。
4. 重启设备,确认开机后自动进入自定义桌面。
SDK 预装桌面¶
在 SDK 中将自定义应用预装为系统桌面应用,覆盖系统默认桌面,编译烧录后开机将直接进入自定义桌面。
1. SDK 预装应用。
2. 在你的应用的 Android.mk 或 Android.bp 编译构建脚本中添加桌面优先级覆盖,以及系统签名。
Android.mk 方式 — 在模块声明中添加:
--- a/vendor/rockchip/common/apps/TestLauncher/Android.mk
+++ b/vendor/rockchip/common/apps/TestLauncher/Android.mk
+ LOCAL_CERTIFICATE := platform
+ LOCAL_OVERRIDES_PACKAGES := \
+ Launcher2 \
+ Launcher3 \
+ Launcher3QuickStep \
+ Launcher3QuickStepGo
Android.bp 方式 — 在 android_app_import 中添加 overrides:
--- a/vendor/rockchip/common/apps/TestLauncher/Android.bp
+++ b/vendor/rockchip/common/apps/TestLauncher/Android.bp
+ certificate: "platform"
+ overrides: [
+ "Launcher2",
+ "Launcher3",
+ "Launcher3QuickStep",
+ "Launcher3QuickStepGo",
+ ],
Warning
H618 (K2B / K2C) 还需额外覆盖 TvLauncher。
3. 编译 SDK,烧录镜像。
附录¶
获取应用包名和类名 ¶
dumpsys window 获取当前界面的包名和类名
手动打开应用的目标界面后执行:
操作示例:获取设置界面的包名和类名。
命令输出会包含类似 com.android.settings/com.android.settings.Settings 的信息,其中 / 前面是包名,后面是 Activity 类名。
dumpsys package 获取应用的包名和界面类名
查看已安装应用:
shell
adb shell pm list packages
查看应用的 Activity 信息:
操作示例:
常见问题¶
- 应用特殊权限如何处理?
桌面级应用是特殊应用,添加特殊权限,系统可能无法启动,需要抓取应用相关 log 日志:
# logcat | grep LauncherTest
09-14 10:36:06.662 3826 3826 W PackageManager: Privileged permission android.permission.INSTALL_PACKAGES for package com.example.myapplication (/system/priv-app/LauncherTest) not in privapp-permissions allowlist
09-14 10:36:08.437 3826 3826 W PackageManager: Privileged permission android.permission.INSTALL_PACKAGES for package com.example.myapplication (/system/priv-app/LauncherTest) not in privapp-permissions allowlist
- 如何在 SDK 源码修改特殊权限 ?
根据 log 修改 android.permission.INSTALL_PACKAGES 内容如下,其他报错类似参考以下添加:
--- a/frameworks/base/data/etc/privapp-permissions-platform.xml
+++ b/frameworks/base/data/etc/privapp-permissions-platform.xml
@@ -550,4 +550,8 @@ applications that come with the platform
<privapp-permissions package="com.android.calllogbackup">
<permission name="com.android.voicemail.permission.READ_VOICEMAIL"/>
</privapp-permissions>
+
+ <privapp-permissions package="com.example.myapplication">
+ <permission name="android.permission.INSTALL_PACKAGES"/>
+ </privapp-permissions>
主板路径:
- 编译失败?
编译失败的问题根据不同应用会存在不同表现,如库缺失、应用路径错误等问题。
通用解决方法:将编译报错的日志,复制给 AI 进行解答,一般都能得到正确的解决方法。一般体现为 Android.mk 或 Android.bp 添加对应配置。