技术记录----开机向导的问题解决以及流程整理

来源:互联网 发布:网络防火墙怎么关闭 编辑:程序博客网 时间:2024/06/12 01:27

前言:在华为做一个整机的项目,基于EMUI源码基础上进行的开发,由于华为代码的保密性,不得在公司内部向外部发布任何技术博客,所以,本人也是凭借记忆,回到家中,写此博客记录下解决问题的过程,仅供辅助学习用。


问题描述:整机开发,每天都有大量的代码在提交,framework,app等,所以,每天都会发布一个版本,刷机进行验证;开机向导在之前的版本中,刷机后都可以正常的启动,但是今天的版本,手机刷完机后,直接跳过开机向导,直接进入了launcher页面。哎,瞬间感觉好冤枉(因为开机向导有好几个版本没有提交过代码了);可以肯定的是,肯定不是开机向导改出来的问题,但是没办法,谁让咱负责的本模块,有问题就必须解决。


解决过程;

1、毫无疑问首先需要分析出问题根因:通过分析开机向导源码,发现入口有一个监听开机广播的receiver,然后根据一些逻辑判断,会启动开机向导首页面。所以,添加log法在receiver的onReceiver方法最上面添加一句log,然后重置手机,分析全量log,没有找到自己添加的log,可以肯定开机向导的启动不是通过检测reboot广播(后来证实,这是第一段垃圾代码),其实在这么大的项目里,垃圾代码还是比较多,会干扰人的思绪。

2、既然开机项目里面找不到,那肯定得跑到framework层了去寻找。所以,通过grep(linux查找内容命令)查找所有使用到开机向导包名com.test.startup(不是真实包名,仅用来说明问题) 的java类。结合全量log中输出开机向导的com.test.startup,发现log中有一句话 make disable startup.所以,就有可能是开机向导app被禁用掉了。接着就定位到了PackageManagerService的源码,有个makeSetupDisable()方法,为了证实揣测,通过添加log法  编译,adb push framework.jar 到手机,重置进行验证。终于见到了光明。log出现了;明白找对地方了。

3、找到地方后,通过分析代码逻辑,果然有一段 禁用app的代码,然后屏蔽此段代码,重新编译,push 到手机。然后重置手机果然进入了开机向导。根据禁用的条件,有一个是判断获取蓝牙的MAC地址,如果MAC地址为空,那么就直接跳过开机向导,至此,开机向导不能进入的原因也算是结束了,剩下的工作就需要负责蓝牙模块的兄弟去跟踪定位解决了。


总结:EMUI的代码已经对Android源码进行了深度定制,一般厂家都有自己的vendor目录,避免与原生的冲突;所以,EMUI的开机向导流程,不见得是原生的原有的。下面说下EMUI的开机流程:

  步骤1:手机开机初始化各种系统服务

  步骤2:加载PackageManagerService,在加载app时,判断MAC地址是否可用,如果可用步骤3;不可用步骤5。

  步骤3:蓝牙MAC地址可用,则根据以下条件找到 activity ,并启动。

<intent-filter android:priority="6">    <action android:name="android.intent.action.MAIN"/>    <category android:name="android.intent.category.HOME"/>    <category android:name="android.intent.category.DEFAULT"/></intent-filter>
priority的值越高,也就优先被调用到。
   步骤4:开机向导一步步设置完,然后禁用开机向导app(以后都不会再启动,除非重置手机),并设置
USER_SETUP_COMPLETE
的值为1(表示开机向导走完了),最后开机向导在kill自己时,会把launcher页面给拉起来。拉起来方式也是查找HOME。 。
   步骤5:进入手机launcher页面。
PS: 由步骤3所示,如果你的项目priority值更大,则优先级更大,开机第一次会进入你的项目(当然你的必须手机内置app哈)

0 0