文章目录

  • 1.简介
  • 2.修改wizard_script.xml
  • 3.编写自己的Activity
    • 3.1 AndroidManifest.xml声明action
    • 3.2 如何退出Activity
  • 4 开机向导调试方法

1.简介

Google开机向导com.google.android.setupwizard是没有源码的,但Google提供了客制化接口,可以做OEM定制。开机向导应用以APK的形式存放在vendor/partner_gms/apps/SetupWizard

下面以Android10为例,讲述开机向导客制化的方法。

2.修改wizard_script.xml

vendor/partner_gms/apps/GmsSampleIntegration/res/raw/wizard_script.xml

--- a/idh.code/vendor/partner_gms/apps/GmsSampleIntegration/res/raw/wizard_script.xml
+++ b/idh.code/vendor/partner_gms/apps/GmsSampleIntegration/res/raw/wizard_script.xml
@@ -190,11 +190,13 @@<WizardAction id="qr_provision_flow"wizard:script="android.resource://com.google.android.gmsintegration/raw/wizard_script_qr_provision_flow" /><!-- OEM completion [CUSTOMIZABLE] --><WizardAction id="oem_post_setup"wizard:uri="intent:#Intent;action=com.android.setupwizard.OEM_POST_SETUP;end" />+    <!-- MY completion [CUSTOMIZABLE] -->
+    <WizardAction id="my_post_setup"
+        wizard:uri="intent:#Intent;action=com.android.setupwizard.MY_POST_SETUP;end" />

参考oem_post_setup,在后面添加自定义的action。注意,如果客制化应用有多个Activity,就要在这里定义多个action,不能在自己的应用内跳转!

3.编写自己的Activity

怎样编写Activity属于应用开发,不是本篇讨论的范畴。我们主要看下如何才能将自己的Activity添加到开机向导。

3.1 AndroidManifest.xml声明action

        <activity android:name="com.my.mysetupwizard.Activity" ><intent-filter><action android:name="com.android.setupwizard.MY_POST_SETUP" /><category android:name="android.intent.category.DEFAULT" /></intent-filter></activity>

测试一下,看看能否通过命令调起这个Activity:

am start -a com.android.setupwizard.MY_POST_SETUP

到这一步,客制化Activity已经成功地添加到开机向导了,它将在Google开机向导的最后一步被调起。但还有一个问题,此时无法退出开机向导。

3.2 如何退出Activity

(1) 首先想到的是finish()。然而事与愿违,finish()是不行的。测试结果:finish()结束了当前Activity之后,会跳回上一个页面,而不是结束开机向导;此时点击下一步,又进入了客制化Activity;这样就进入了死循环,开机向导永远无法结束。

(2) 参考博客 https://blog.csdn.net/u012824529/article/details/90109914 添加下面这段跳转代码,实测点击跳转,开机向导会crash。看来Android10已经不能这么干了(其他Android版本没有验证)。

    // Google Wizard Manager Constantsprivate static final String ACTION_NEXT = "com.android.wizard.NEXT";private static final String EXTRA_ACTION_ID = "actionId";private static final String EXTRA_SCRIPT_URI = "scriptUri";private static final String EXTRA_RESULT_CODE = "com.android.setupwizard.ResultCode";public static void onNext(Intent intent, Activity activity, int resultCode) {Intent nextIntent = new Intent(ACTION_NEXT);nextIntent.putExtra(EXTRA_SCRIPT_URI, intent.getStringExtra(EXTRA_SCRIPT_URI));nextIntent.putExtra(EXTRA_ACTION_ID, intent.getStringExtra(EXTRA_ACTION_ID));nextIntent.putExtra(EXTRA_THEME, intent.getStringExtra(EXTRA_THEME));nextIntent.putExtra(EXTRA_RESULT_CODE, resultCode);activity.startActivityForResult(nextIntent, 10000);}

(3) 正确的跳转办法,使用Android原生方法WizardManagerHelper.getNextIntent

    class MyClickListner implements OnClickListener {@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.button:try {onNext(Activity.RESULT_OK);} catch (Exception e) {e.printStackTrace();}break;default:break;}}}public void onNext(int requestCode) {int resultCode = Activity.RESULT_OK;Intent intent = WizardManagerHelper.getNextIntent(getIntent(), resultCode);try {startActivityForResult(intent, requestCode);} catch (ActivityNotFoundException e) {Log.e(TAG, e.getMessage());}}

关键代码是这句:

Intent intent = WizardManagerHelper.getNextIntent(getIntent(), resultCode);

代码位于frameworks/opt/setupwizard/library/main/src/com/android/setupwizardlib/util/WizardManagerHelper.java

遗憾的是,这个方法没有开放到sdk里面供普通应用使用。既然没法直接调用,我们就把它抽出来,做成一个工具类吧。

自定义WizardManagerHelper.java

package com.my.mysetupwizard;import java.util.Arrays;import android.content.Intent;public class WizardManagerHelper {private static final String ACTION_NEXT = "com.android.wizard.NEXT";static final String EXTRA_SCRIPT_URI = "scriptUri";static final String EXTRA_ACTION_ID = "actionId";private static final String EXTRA_RESULT_CODE = "com.android.setupwizard.ResultCode";public static final String EXTRA_THEME = "theme";static final String EXTRA_WIZARD_BUNDLE = "wizardBundle";static final String EXTRA_IS_FIRST_RUN = "firstRun";static final String EXTRA_IS_DEFERRED_SETUP = "deferredSetup";static final String EXTRA_IS_PRE_DEFERRED_SETUP = "preDeferredSetup";public static final String EXTRA_IS_SETUP_FLOW = "isSetupFlow";public static Intent getNextIntent(Intent originalIntent, int resultCode) {return getNextIntent(originalIntent, resultCode, null);}public static Intent getNextIntent(Intent originalIntent, int resultCode, Intent data) {Intent intent = new Intent(ACTION_NEXT);copyWizardManagerExtras(originalIntent, intent);intent.putExtra(EXTRA_RESULT_CODE, resultCode);if (data != null && data.getExtras() != null) {intent.putExtras(data.getExtras());}intent.putExtra(EXTRA_THEME, originalIntent.getStringExtra(EXTRA_THEME));return intent;}public static void copyWizardManagerExtras(Intent srcIntent, Intent dstIntent) {dstIntent.putExtra(EXTRA_WIZARD_BUNDLE, srcIntent.getBundleExtra(EXTRA_WIZARD_BUNDLE));for (String key :Arrays.asList(EXTRA_IS_FIRST_RUN,EXTRA_IS_DEFERRED_SETUP,EXTRA_IS_PRE_DEFERRED_SETUP,EXTRA_IS_SETUP_FLOW)) {dstIntent.putExtra(key, srcIntent.getBooleanExtra(key, false));}for (String key : Arrays.asList(EXTRA_THEME, EXTRA_SCRIPT_URI, EXTRA_ACTION_ID)) {dstIntent.putExtra(key, srcIntent.getStringExtra(key));}}}

4 开机向导调试方法

开机向导只在首次开机时启动,想要再次启动开机向导,只能重刷固件或者恢复出厂设置,这个太麻烦了,不适合调试。

Google开机向导SetupWizard没有源码,不好分析。我们从Android原生开机向导Provision的代码里面得到了一些信息。

packages/apps/Provision/src/com/android/provision/DefaultActivity.java

    private void setProvision() {// Add a persistent setting to allow other apps to know the device has been provisioned.Settings.Global.putInt(getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 1);Settings.Secure.putInt(getContentResolver(), Settings.Secure.USER_SETUP_COMPLETE, 1);// remove this activity from the package manager.PackageManager pm = getPackageManager();ComponentName name = new ComponentName(this, DefaultActivity.class);pm.setComponentEnabledSetting(name, PackageManager.COMPONENT_ENABLED_STATE_DISABLED,PackageManager.DONT_KILL_APP);// terminate the activity.finish();}

可见,完成开机向导的时候,做了3件事,

(1) Settings.Global.DEVICE_PROVISIONED 设置为1;

(2) Settings.Secure.USER_SETUP_COMPLETE 设置为1;

(3) DISABLE自己。

根据以上分析,想要使能开机向导,我们做一下这3件事的反向操作,就可以了。

1.通过命令使能开机向导
adb shell
settings put global device_provisioned 0
settings put secure user_setup_complete 0
pm enable com.google.android.setupwizard/com.google.android.setupwizard.SetupWizardActivity
sync
reboot2.查询settings的值
settings get global device_provisioned
settings get secure user_setup_complete3.通过代码实现
+Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 0);
+Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.USER_SETUP_COMPLETE, 0);
+ComponentName name = new ComponentName("com.google.android.setupwizard", "com.google.android.setupwizard.SetupWizardActivity");
+mContext.getPackageManager().setComponentEnabledSetting(name,PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);

Android10定制Google开机向导相关推荐

  1. 完成谷歌Android设置向导,Android RRO机制的运用-----google开机向导客制化

    上周五的时候领导分了一个任务,客户让在google开机向导里面增加一页,首先就想到了android的Overlay,然后网上搜了下,发下有很多人写了这方面的技术.而且写的都还不错,所以本篇只当记录作用 ...

  2. [MTK项目] 如何客制化谷歌开机向导

    最近项目中有个任务,要在gms中的谷歌开机向导(SUW,SetupWizard)中加入客制化页面.之前没有做过相关的东西,第一反应这是不行的,因为gms包的谷歌软件我们都没有源码,不能做任何修改.接到 ...

  3. Android10开机向导中复用设置中的Wifi界面

    很多时候我们需要定制开机向导,在开机向导界面我们一般会实现联网和设置时间等功能,考虑复用与稳定性问题,我们最好复用设置中的WiFi设置和日期设置.但是设置中的wifi设置界面默认是没有下一步按钮的,这 ...

  4. Android10系统开发实现跳过开机向导、插电源线不休眠等默认配置

    一.前言 在刷机玩机过程中,常常遇到刷机之后烦人的开机引导设置.特别是有强迫症的人,多希望开机之后就跳转到主界面.经过研究了一下,可以通过修改安卓源码中的默认设置跳过开机引导,此外还有很多其他功能,比 ...

  5. Android10 开机向导流程

    最近在弄开机向导,网上查了查,基本都是参照系统的​​​​​​Provision应用来做的,而且还要将apk打包到系统目录下的pri-app目录下,打包到其他目录下不行,参照着做是没问题,但是好奇为什么 ...

  6. Android 定制Google SetupWizard

    ##Android 定制Google SetupWizard #####google setupwizard(开机向导) 是可以定制,我们可以替换掉里面的页面,也可以新添加页面,也可以修改原有页面的部 ...

  7. Android开机向导setupwizard,设置系统语言,WiFi向导

    Android的框架设计有考虑到开机向导这一场景,因此我们实现开机向导参考Android的Provision.apk Provision: MSM8976/repo/packages/apps/Pro ...

  8. android 开机向导加载过程,开机向导启动流程分析

    开机向导启动流程 首先来看Android启动流程: 1.Bootloader(系统启动加载器,将Linux加载到RAM): 2.Kernel 3.init进程 4.Zygote(Zygote进程是整个 ...

  9. Android开机向导启动流程分析

    Android开机向导启动流程 首先来看Android启动流程: 1.Bootloader(系统启动加载器,将Linux加载到RAM): 2.Kernel 3.init进程 4.Zygote(Zygo ...

最新文章

  1. SSH访问控制,多次失败登录即封掉IP,防止暴力破解
  2. MySQL数据库-笔记06【SQL的4种连接查询、事务】
  3. 前端学习(515):两列布局第二种方案得优缺点
  4. python中为什么不支持char_python支持char吗
  5. H5实现俄罗斯方块(一)
  6. python命令行进入帮助模式_Python 命令行之旅:深入 click 之选项篇
  7. 微软Windows家族一览 从1.0到Longhorn
  8. DOM元素的大小和位置
  9. spring学习--JdbcTemplate-查询返回-批量操作
  10. python学习-(__new__方法和单例模式)
  11. 牛客NOIP提高组(三)题解
  12. php循环产生复选框,史上最详细的vue动态生成checkbox的选项并实现多选框的保存回显...
  13. 【机器人学导论】第四章.传感器
  14. 鼠标移入显示图片案例
  15. 投票计数python
  16. vmware下虚拟机自动换ip的解决办法
  17. 71、不同灭火器的适用范围
  18. M1 MacBook Pro外扩多屏显示器方法
  19. 【C】C语言文件(包括:文件各种读写方式)
  20. 姜小白的Python日记Day10 装饰器

热门文章

  1. gitee使用中的一些问题
  2. 图像处理----美白
  3. 神州租车确定将从港股退市:上半年亏43亿元,联想控股彻底退出
  4. 2016百度之星 - 测试赛(热身,陈题) 列变位法解密IP聚合放盘子
  5. S-属性定义与L-属性定义
  6. 20171029 勇于挑战自己
  7. vlc推流的方法总结
  8. 网易企业邮箱用Python发邮件
  9. 手机4g信号强的服务器,国内三大运营商到底谁的4G网络信号最强?很多人都搞错了,望周知...
  10. Nature Gradient 自然梯度