技术记录----开机向导的问题解决以及流程整理
来源:互联网 发布:网络防火墙怎么关闭 编辑:程序博客网 时间: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哈)
- 技术记录----开机向导的问题解决以及流程整理
- 开机向导的制作思路
- android开机向导的实现
- android开机向导的实现
- 跳过 google的开机向导 SetupWizard
- 如何客制化自己的开机向导
- 如何客制化自己的开机向导
- 【个人整理】计算机改名后ORACLE的设置以及问题解决
- Android的开机流程
- Android的开机流程
- Android的开机流程
- Android的开机流程
- Android的开机流程
- Android的开机流程
- Android的开机流程
- Android的开机流程
- Linux的开机流程
- Android的开机流程
- 二进制中1的个数统计
- ios null
- STL笔记(6)——Traits编程技法(一)
- 程序员,怎么样面对自己三十岁后的下坡路
- GIT常用命令
- 技术记录----开机向导的问题解决以及流程整理
- C++ 多态
- Redis内存使用优化与存储
- ZOJ 2829 Beautiful Number
- iOS-MJRefresh
- 大龄程序员出路在哪里?
- qsort函数用法 (自己加了注释)
- 机器学习基础(三十六)—— 非规整数据(值缺失、异常值)的处理
- 【九度】题目1185:特殊排序