AOSP环境下系统应用配置与开机设置向导启动相关技术问题
AOSP环境下系统应用配置与开机设置向导启动相关技术问题
嘿,我来一步步帮你搞定这个需求——把自己的APP做成系统应用,还能修改首次开机的设置向导流程,甚至替换掉默认的那些Google相关页面。咱们分模块拆解,每一步都给你说透:
一、先把你的APP转为系统特权应用
要修改开机向导这类系统级流程,首先得让你的APP拥有最高权限,所以第一步是把它变成系统特权应用:
- 把你的APP源码放到AOSP源码根目录的
packages/apps/下,比如新建一个MySetupApp文件夹,把所有代码文件(Java/Kotlin、res、Manifest等)都移进去 - 编写
Android.bp(旧版AOSP用Android.mk)配置文件,标记为系统应用:android_app { name: "MySetupApp", srcs: ["src/**/*.java"], resource_dirs: ["res"], manifest: "AndroidManifest.xml", privileged: true, // 声明为特权系统应用 platform_apis: true, // 允许调用AOSP内部私有API certificate: "platform", // 使用AOSP平台签名 } - 修改你的
AndroidManifest.xml,添加系统应用标识和必要权限:<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.mysetupapp" android:sharedUserId="android.uid.system"> <!-- 绑定系统用户ID --> <uses-permission android:name="android.permission.MANAGE_DEVICE_PROVISIONING" /> <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <application android:label="@string/app_name" android:icon="@mipmap/ic_launcher" android:persistent="true"> <!-- 可选:让应用持久运行不被系统回收 --> <activity android:name=".MainActivity"> <!-- 后续要加的设置向导Intent Filter,后面会详细说 --> </activity> </application> </manifest> - 把你的APP加入编译目标:在设备对应的
device/<vendor>/<device>/device.mk里添加一行:
这样编译AOSP时会自动把你的APP打包进系统镜像PRODUCT_PACKAGES += MySetupApp
二、修改首次开机设置向导:加入/替换原有页面
AOSP的首次开机向导核心是SetupWizard(Android 10+)或Provision(Android 9及更早)应用,咱们分两种场景处理:
场景1:把你的MainActivity插入原有向导流程
如果你不想完全替换默认向导,只是想在Google登录、服务条款等页面前后插入自己的页面:
- 先给你的
MainActivity添加设置向导的Intent Filter,让系统识别它为向导的一部分:<activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.SETUP_WIZARD" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> <meta-data android:name="android.setupwizard.category" android:value="android.setupwizard.category.SETUP" /> <meta-data android:name="android.setupwizard.weight" android:value="50" /> <!-- 权重越小,页面越靠前 --> </activity> - 找到AOSP中
SetupWizard的流程配置文件(比如packages/apps/SetupWizard/src/com/android/setupwizard/flow/SetupWizardFlow.java),在流程列表中添加你的Activity:// 找到添加向导步骤的代码块,插入你的Activity addStep(new CustomStep.Builder() .setActivityClass(com.example.mysetupapp.MainActivity.class) .setRequired(true) // 设为必填步骤,用户必须完成才能进入下一页 .build());
场景2:完全替换原有向导,移除Google等默认页面
如果你想彻底干掉所有默认向导页面(包括Google登录、服务条款),只显示自己的MainActivity:
- 禁用原有SetupWizard:在设备的
device.mk里移除默认向导的编译项:# 移除原有向导和Google相关向导组件 PRODUCT_PACKAGES -= SetupWizard GoogleSetupWizard - 把你的APP设为唯一向导入口:在
MainActivity的Manifest里补充完整配置,确保系统启动时优先拉起它:<activity android:name=".MainActivity" android:excludeFromRecents="true" android:launchMode="singleTask"> <intent-filter android:priority="1000"> <!-- 最高优先级,确保系统第一时间拉起 --> <action android:name="android.intent.action.SETUP_WIZARD" /> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.HOME" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> <meta-data android:name="android.setupwizard.category" android:value="android.setupwizard.category.SETUP" /> </activity> - 处理向导完成逻辑:你的
MainActivity必须在用户完成操作后,标记系统已初始化完成,否则设备会一直重复启动向导。在你的完成按钮点击事件里添加:// 标记设备已完成首次设置 Settings.Secure.putInt(getContentResolver(), Settings.Secure.USER_SETUP_COMPLETE, 1); // 发送广播通知系统:向导已完成 Intent provisionedIntent = new Intent(Intent.ACTION_DEVICE_PROVISIONED); provisionedIntent.addFlags(Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND); sendBroadcast(provisionedIntent); // 跳转到系统桌面(可选,根据你的需求调整) startActivity(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME)); finish(); - 彻底移除GMS相关组件:如果你的AOSP包含Google移动服务(GMS),还需要在
device.mk里排除相关包:PRODUCT_PACKAGES -= GoogleServicesFramework PrebuiltGmsCore
三、测试与版本兼容性注意事项
- 快速调试向导流程:不用每次刷机,用adb命令直接拉起向导测试:
adb shell am start -a android.intent.action.SETUP_WIZARD - 版本差异提醒:不同AOSP版本的向导结构差异很大:
- Android 8及更早:向导核心是
packages/apps/Provision,流程配置在该目录下的代码中 - Android 10-12:
packages/apps/SetupWizard,依赖SetupWizardLib构建流程 - Android 13+:向导流程更多依赖
SettingsIntelligence,需要对应调整文件路径
- Android 8及更早:向导核心是
- 权限与签名问题:把APP放在
packages/apps/下编译时,会自动使用AOSP的平台签名,不用手动处理;如果是单独编译后推送到系统分区,需要先执行adb root && adb remount,再把APP推到/system/priv-app/MySetupApp目录
要是你遇到某个特定AOSP版本的细节问题,比如找不到对应的配置文件,随时告诉我具体版本号,我再给你针对性调整~




