本文记录工作中,在rk3568安卓13的SDK中如何干掉官方Launcher,将自己的apk设为Launcher应用。
目录
前言
在Android系统级开发中,我们经常需要将特定应用预置到系统中,并使其作为默认桌面(Launcher)启动。这种需求常见于企业定制设备、教育平板、智能家居控制中心等场景——设备开机后直接进入定制应用界面,屏蔽原生桌面,为用户提供沉浸式体验。
同时,很多辅助功能类应用(如屏幕控制、全局手势、自动化脚本等)需要依赖无障碍服务(AccessibilityService)才能正常工作。在普通用户手中,开启无障碍权限需要手动进入设置界面操作,步骤繁琐且容易失败。但在系统级开发中,我们可以通过修改源码,在开机时自动授予该权限。
本文将详细介绍如何在Android SDK源码环境中,将自定义APK打包进系统,替换原生Launcher,并开机自动开启无障碍服务。无论你是负责系统定制的ROM开发者,还是需要深度集成设备功能的应用开发者,本文都提供了一套完整的实操方案。
一、认识Android的Launcher与Home机制
1. 什么是Launcher?
Launcher是Android系统中的一个特殊应用,它负责显示桌面、应用列表和启动应用。当我们按下Home键时,系统会启动Launcher;当系统开机完成后,第一个显示给用户的界面也是Launcher。
本质上,Launcher就是一个声明了特定Intent-Filter的普通APK。系统通过解析所有已安装应用的AndroidManifest.xml,找出符合Home类别(Category)的应用,并将其作为候选桌面。
2. Home机制的Intent匹配规则
当系统启动或按下Home键时,会发送一个隐式Intent:
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
系统会查找所有声明了android.intent.action.MAIN和android.intent.category.HOME的Activity。如果存在多个符合条件应用,系统会弹出选择器让用户选择默认桌面;如果只有一个,则直接启动它。
3. 系统默认Launcher与优先级
在AOSP源码中,默认的Launcher通常是Launcher3(或Google Pixel设备上的Launcher3QuickStep)。在系统预置时,如果存在多个Home应用,系统会在首次开机时弹出选择对话框。为了避免这种情况,我们需要在编译层面移除原生的Launcher,将我们的应用设置为系统默认。
二、实现自己的Home应用:完整步骤
1. 第一步:准备APK并配置AndroidManifest
首先,准备一个已经编译好的APK文件。确保该APK的AndroidManifest.xml中,主Activity声明了Home类别:
<activity
android:name=".MainActivity"
android:exported="true"
android:theme="@style/Theme.AppCompat.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
注意:category.LAUNCHER保证应用在应用列表中可见,方便调试。如果希望完全隐藏(纯桌面模式),可以移除该category。
2. 第二步:在SDK源码中创建预置目录
在Android源码树的packages/apps/目录下为应用创建文件夹,例如:
packages/apps/BoxControl/
将APK文件(假设命名为BoxControl.apk)放入该目录。
3. 第三步:编写Android.bp编译配置文件
在BoxControl/目录下创建Android.bp文件,内容如下:
packages/apps/BoxControl/Android.bp
android_app_import {
name: "BoxControl",
apk: "BoxControl.apk",
// 关键:设置为 privileged 以获取更高权限,便于后续无障碍授权
privileged: true,
// 如果 APK 是第三方签名,保留原签名;如果是系统签名,改为 platform
certificate: "platform",
// 预置到 system 分区,应用不可卸载
product_specific: false,
// 启用 dex 预优化,加快启动速度
dex_preopt: {
enabled: true,
},
// 可选:指定安装位置,默认为系统分区
// installable: true,
}
配置解读:
-
privileged:true:将应用安装为特权应用(/system/priv-app/),拥有更多系统级权限。 -
certificate:"platform":使用系统平台签名,应用获得系统级UID,便于后续无障碍授权。 -
product_specific: false:表示预置到通用系统分区,而非产品特定分区。 -
dex_preopt:预优化DEX为OAT格式,显著提升应用首次启动速度。
4. 第四步:修改产品配置device.mk
在SDK的根目录下搜索哪个*.mk打包了launch,如下
~/workspace/android-src/android-src$ grep -r "PRODUCT_PACKAGES.*Launcher3" --include="*.mk" --exclude-dir=out .
./device/rockchip/common/device.mk: PRODUCT_PACKAGES += Launcher3QuickStepGo
./device/rockchip/common/device.mk: PRODUCT_PACKAGES += Launcher3QuickStepGo
./device/rockchip/common/device.mk: PRODUCT_PACKAGES += Launcher3QuickStep
./device/linaro/hikey/device-common.mk:PRODUCT_PACKAGES += Launcher3QuickStep
./device/amlogic/yukawa/device-common.mk:PRODUCT_PACKAGES += Launcher3QuickStep
可以看出把/device/rockchip/common/device.mk文件中的Launcher3QuickStep改成BoxControl即可。
调试过程中发现,还需要在以下文件中,将包含 Launcher3QuickStep \ 的那一行删除。
build/target/product/handheld_system_ext.mk
5. 第五步:自动授予无障碍权限(核心)
无障碍服务需要在系统设置中手动开启,但作为系统级定制,我们可以修改默认设置数据库,让系统在首次开机时自动启用。
5.1. 确认无障碍服务的组件名
我这里AccessibilityService类全路径为:
com.board.box.control.util.MyAccessibilityService
那么组件名(ComponentName)格式为:
com.board.box.control/.util.MyAccessibilityService
格式规则:包名/类名,如果类名以包名开头,可用.简写。
5.2. 修改defaults.xml
在以下路径XML配置文件末尾处添加以下内容,
frameworks/base/packages/SettingsProvider/res/values/defaults.xml
<!-- 启用无障碍服务列表,多个服务用 ':' 分隔 -->
<string name="def_enabled_accessibility_services" translatable="false">
com.board.box.control/.util.MyAccessibilityService
</string>
<!-- 确保无障碍功能总开关也是开启的 -->
<bool name="def_accessibility_enabled">true</bool>
原理说明:
-
Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES:存储已启用无障碍服务列表。 -
Settings.Secure.ACCESSIBILITY_ENABLED:无障碍功能总开关。 -
系统首次启动时,SettingsProvider会从
defaults.xml读取并初始化这些值。
5.3. 验证权限是否生效
编译刷机后,进入系统,可通过以下命令验证,如果输出和我类似,就表示配置成功了。
rk3568_t:/ # settings get secure enabled_accessibility_services
com.board.box.control/com.board.box.control.util.MyAccessibilityService
rk3568_t:/ # settings get secure accessibility_enabled
1
rk3568_t:/ #
总结
本文从Android系统级开发的视角出发,详细介绍了如何将自定义APK预置到系统分区、替换默认Launcher并自动授予无障碍权限的完整流程。
这套方案在Android 12/13/14上均适用,尤其适合工业平板、车载中控、智能收银机、教育学习机等需要深度定制的场景。通过系统级集成,不仅提升了用户体验(开机即用,无需手动设置),还增强了应用的安全性(作为特权应用运行)。希望这篇文章能帮助到正在做系统定制的开发者们。
355

被折叠的 条评论
为什么被折叠?



