ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

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

Android系统级开发-将APK打包进SDK并设置为默认Launcher,自动开启无障碍权限 本文记录工作中在rk3568安卓13的SDK中如何干掉官方Launcher将自己的apk设为Launcher应用。目录前言一、认识Android的Launcher与Home机制1 什么是Launcher2 Home机制的Intent匹配规则3 系统默认Launcher与优先级二、实现自己的Home应用完整步骤1 第一步准备APK并配置AndroidManifest2 第二步在SDK源码中创建预置目录3 第三步编写Android.bp编译配置文件4 第四步修改产品配置device.mk5 第五步自动授予无障碍权限核心5.1 确认无障碍服务的组件名5.2 修改defaults.xml5.3 验证权限是否生效总结前言在Android系统级开发中我们经常需要将特定应用预置到系统中并使其作为默认桌面Launcher启动。这种需求常见于企业定制设备、教育平板、智能家居控制中心等场景——设备开机后直接进入定制应用界面屏蔽原生桌面为用户提供沉浸式体验。同时很多辅助功能类应用如屏幕控制、全局手势、自动化脚本等需要依赖无障碍服务AccessibilityService才能正常工作。在普通用户手中开启无障碍权限需要手动进入设置界面操作步骤繁琐且容易失败。但在系统级开发中我们可以通过修改源码在开机时自动授予该权限。本文将详细介绍如何在Android SDK源码环境中将自定义APK打包进系统替换原生Launcher并开机自动开启无障碍服务。无论你是负责系统定制的ROM开发者还是需要深度集成设备功能的应用开发者本文都提供了一套完整的实操方案。一、认识Android的Launcher与Home机制1. 什么是LauncherLauncher是Android系统中的一个特殊应用它负责显示桌面、应用列表和启动应用。当我们按下Home键时系统会启动Launcher当系统开机完成后第一个显示给用户的界面也是Launcher。本质上Launcher就是一个声明了特定Intent-Filter的普通APK。系统通过解析所有已安装应用的AndroidManifest.xml找出符合Home类别Category的应用并将其作为候选桌面。2. Home机制的Intent匹配规则当系统启动或按下Home键时会发送一个隐式Intentintent-filter action android:nameandroid.intent.action.MAIN / category android:nameandroid.intent.category.HOME / category android:nameandroid.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:exportedtrue android:themestyle/Theme.AppCompat.NoActionBar intent-filter action android:nameandroid.intent.action.MAIN / category android:nameandroid.intent.category.HOME / category android:nameandroid.intent.category.DEFAULT / category android:nameandroid.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-dirout . ./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.mk5. 第五步自动授予无障碍权限核心无障碍服务需要在系统设置中手动开启但作为系统级定制我们可以修改默认设置数据库让系统在首次开机时自动启用。5.1. 确认无障碍服务的组件名我这里AccessibilityService类全路径为com.board.box.control.util.MyAccessibilityService那么组件名ComponentName格式为com.board.box.control/.util.MyAccessibilityService格式规则包名/类名如果类名以包名开头可用.简写。5.2. 修改defaults.xml在以下路径XML配置文件末尾处添加以下内容device/rockchip/rk356x/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml !-- 启用无障碍服务列表多个服务用 : 分隔 -- string namedef_enabled_accessibility_services translatablefalse com.board.box.control/.util.MyAccessibilityService /string !-- 确保无障碍功能总开关也是开启的 -- bool namedef_accessibility_enabledtrue/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上均适用尤其适合工业平板、车载中控、智能收银机、教育学习机等需要深度定制的场景。通过系统级集成不仅提升了用户体验开机即用无需手动设置还增强了应用的安全性作为特权应用运行。希望这篇文章能帮助到正在做系统定制的开发者们。
返回列表