一、说明

FactoryKit即工程测试,用于工厂在手机出厂之前的测试。

二、需求

修改vendor下的android\vendor\qcom\proprietary\qrdplus\FactoryKit的代码,其中想说的一点,先看一下,这个系统版本有没有FactoryKit,如果没有,考虑用哪个版本,要考虑版本之间的差异性,看用哪个比较合适,接下来看一下此次实现的如下

功能:

1、通过PC打开该程序,直接实现自动测试。

2、实现测试自己需要的项目。

3、测试完把数据存放在SystemProperties里面,以供PC端可以去获取该值。

4、测试完所有项自动关闭该程序。

先上一张本身的效果图,如下:

android 工厂测试模式 手机工厂模式自动测试_android 工厂测试模式


三、设计

如上图所示,其实可以看出,本身有这些测试项,而且上边看菜单按钮得知,其本身是有自动测试功能的,所以我们要做的规划如下:

1、本身是有自动测试,所以我们要把自动测试在打开该界面的时候就触发自动测试的逻辑

2、去掉没用的测试项,添加自己的测试项

3、在自己的测试项里添加储存值的逻辑

4、找到自动测试逻辑,在测试结束加上finish

要添加一个系统应用嘛,需要在系统的mk文件里添加该模块,和修改该程序Android.mk所以可以看一下前边的文章URL=,这一块就不多说了

四、实现

(1)整体逻辑了解,并添加上打开程序自动测试,与测试结束自动关闭程序。

先看一下整体的代码目录:

android 工厂测试模式 手机工厂模式自动测试_FactoryKit_02


可以看出,针对每一项测试都会有对应一个文件夹,

首先,通过AndroidManifest.xml可以看出哪个为该程序的Launcher界面,

如图:

android 工厂测试模式 手机工厂模式自动测试_自动测试_03


找到代码如下:

android 工厂测试模式 手机工厂模式自动测试_FactoryKit_04


android 工厂测试模式 手机工厂模式自动测试_android 工厂测试模式_05


android 工厂测试模式 手机工厂模式自动测试_FactoryKit_06


如图可知,它是应用了ListActivity,通过android的pull解析并去解析xml文件来获取要测试的项,所以修改测试项则会咋如下图的xml中修改:

(在res/xml中找到你当前适配你当前机型的文件,如果没有会默认到一个default的文件中)

android 工厂测试模式 手机工厂模式自动测试_FactoryKit_07


在其中,添加需要测试的项,去掉不需要的项。

接下去添加打开这个界面就开始自动检测的逻辑,你知道怎么实现自动测试的逻辑吗?其实它是通过startActivityForResult()和onActivityResult()搭配使用,如下图:

startActivityForResult():

android 工厂测试模式 手机工厂模式自动测试_android_08


onActivityResult():

android 工厂测试模式 手机工厂模式自动测试_android_09


其中会判断有没有还未测试的项,如果有会发送一个handler,mHandler.postDelayed(mRunnable,*)的方法,接着追mRuunable,看它怎么处理的,如图:

android 工厂测试模式 手机工厂模式自动测试_FactoryKit_10


由图可知,它也是判断当前测试到哪一项了,然后如果没有则重置标志位,如果有则接着去请求发送startActivityForResult()。

这是在初始化onCreate中添加这个逻辑,如图:

android 工厂测试模式 手机工厂模式自动测试_android_11


如图可知,cleanTestState()是先清除上次检测的结果:

android 工厂测试模式 手机工厂模式自动测试_系统应用_12


重置自动测试的标志位:toStartAutoTest = true,因为下面会使用(由上边的onActivityResult()中会使用到)

当你请求的这些项都测试了,就不会继续了,如果还有就会接着请求过去。。。

然后考虑在哪添加测试完这些项,去执行结束的,我是在onActivityResult()中,当判断当前判断项已经没有了,重置自动测试标志位,然后super.finish()方法(这结束方法被坑了,因为本身这个类里面重写了这个方法,然后自己写了个逻辑,点击两下返回才会退出,因此这里咱们调用父类的finish方法就可以了)。

这里整体的逻辑已经结束了,这里说一下如何添加一个自己想要测试的项,其实可以考虑别的测试项的设计,我想添加一个信号强度的测试项目。(SignalStrength)

(2)了解并添加一个测试项,并添加测试完存储逻辑

这里也要创建一个自己的文件夹SignalStrengthInfo,然后在创建SignalStrengthInfo.java,因为xml中是这样获取到要测试的项,如图:

android 工厂测试模式 手机工厂模式自动测试_自动测试_13


下面就说一下测试项的大体的思路以及对测试完的结果的存储(SystemProperties)

1、因为是自动测试,所以要考虑到耗时,需要耗时才能拿到结果

2、因此需要一个CountTimer,当计时超时的时候说明在一段时间未获取到结果,返回失败的处理

3、一般测试一个状态,需要监听手机的一个组件,当获取成功时则会有成功处理

接下来看代码:

设置一个定时器,当超过时间就返回失败

android 工厂测试模式 手机工厂模式自动测试_自动测试_14


初始化数据:

android 工厂测试模式 手机工厂模式自动测试_自动测试_15


监听listener:

android 工厂测试模式 手机工厂模式自动测试_FactoryKit_16


由图可知,当信号值变化的时候,即可获取到值,则做成功处理

失败的处理:

android 工厂测试模式 手机工厂模式自动测试_自动测试_17


成功的处理:

android 工厂测试模式 手机工厂模式自动测试_FactoryKit_18


界面onDestory的处理:

android 工厂测试模式 手机工厂模式自动测试_android_19


现在说说利用SystemProperties的存值:

1、如果你想有个默认值可以去路径android\device\qcom\msm8909_512\system.prop,初始化一个默认值如下图:

android 工厂测试模式 手机工厂模式自动测试_android 工厂测试模式_20


成功的时候存值:

android 工厂测试模式 手机工厂模式自动测试_自动测试_21


生命私有静态常量:

android 工厂测试模式 手机工厂模式自动测试_android_22


失败的时候存值:

android 工厂测试模式 手机工厂模式自动测试_自动测试_23


在这里解释一下,SystemProperties的set方法,参数第一个是key值,第二个是String,要存的值,无论你存的是int、float、boolean等等,不过你取的时候就是getInt(String keyValue)、getBoolean(String keyValue)了

另外说一点可以通过连接手机,然后通过adb shell命令读取文件值,获取到刚刚你存储的状态。