You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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里添加一行:
    PRODUCT_PACKAGES += MySetupApp
    
    这样编译AOSP时会自动把你的APP打包进系统镜像

二、修改首次开机设置向导:加入/替换原有页面

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

  1. 禁用原有SetupWizard:在设备的device.mk里移除默认向导的编译项:
    # 移除原有向导和Google相关向导组件
    PRODUCT_PACKAGES -= SetupWizard GoogleSetupWizard
    
  2. 把你的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>
    
  3. 处理向导完成逻辑:你的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();
    
  4. 彻底移除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,需要对应调整文件路径
  • 权限与签名问题:把APP放在packages/apps/下编译时,会自动使用AOSP的平台签名,不用手动处理;如果是单独编译后推送到系统分区,需要先执行adb root && adb remount,再把APP推到/system/priv-app/MySetupApp目录

要是你遇到某个特定AOSP版本的细节问题,比如找不到对应的配置文件,随时告诉我具体版本号,我再给你针对性调整~

火山引擎 最新活动