Android系统级开发-将APK打包进SDK并设置为默认Launcher,自动开启无障碍权限

本文记录工作中,在rk3568安卓13的SDK中如何干掉官方Launcher,将自己的apk设为Launcher应用。


目录

前言

一、认识Android的Launcher与Home机制

1 什么是Launcher?

2 Home机制的Intent匹配规则

3 系统默认Launcher与优先级

二、实现自己的Home应用:完整步骤

1 第一步:准备APK并配置AndroidManifest

2 第二步:在SDK源码中创建预置目录

3 第三步:编写Android.bp编译配置文件

4 第四步:修改产品配置device.mk

5 第五步:自动授予无障碍权限(核心)

5.1 确认无障碍服务的组件名

5.2 修改defaults.xml

5.3 验证权限是否生效

总结


前言

在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.MAINandroid.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上均适用,尤其适合工业平板、车载中控、智能收银机、教育学习机等需要深度定制的场景。通过系统级集成,不仅提升了用户体验(开机即用,无需手动设置),还增强了应用的安全性(作为特权应用运行)。希望这篇文章能帮助到正在做系统定制的开发者们。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值