Android FactoryTest框架

田海立

2012/10/9

本文简析Android内置的Factory Test(有测试模式/工厂模式/工程模式等叫法)框架,并非讲解FactoryTest中的每个测试该怎么写。

Android框架中已经对FactoryTest做了支持,通过一些配置和开发工作就可以把FactoryTest代码融入到Android系统中。


一、FactoryTest级别的定义


Android系统中在com.android.server.SystemServer(loc:frameworks/base/services/java/)中对FactoryTest的级别做了定义:

public static final int FACTORY_TEST_OFF =0;
public static final int FACTORY_TEST_LOW_LEVEL = 1;
public static final int FACTORY_TEST_HIGH_LEVEL= 2;
  • FACTORY_TEST_OFF是正常模式;
  • FACTORY_TEST_LOW_LEVEL是工程模式做在较低的级别,也就是运行工程模式的时候,很多的service并不需要启动;
  • FACTORY_TEST_HIGH_LEVEL是工程模式做在较高的级别,也就是运行工程模式的时候,基本的Android运行环境是同正常模式是相同的。在原生的实现中,与正常模式相比除了ActivityManagerService外并没有太多不同。

后面着重来看FACTORY_TEST_LOW_LEVEL,也用此模式来代替FactoryTest的表述。


二、FactoryTest不需要启动的服务


系统从FACTORY_TEST_LOW_LEVEL模式启动,下列服务或Observer根本就不会被启动:

BluetoothService

BluetoothA2dpService

DevicePolicyService

StatusBarManagerService

ClipboardService

InputMethodManagerService

NetStatService

NetworkManagementService

ConnectivityService

ThrottleService

AccessibilityManagerService

MountService

NotificationManagerService

DeviceStorageMonitorService

LocationManagerService

SearchManagerService

DropBoxManagerService

WallpaperManagerService

AudioService

HeadsetObserver

HookSwitchObserver

HdmiObserver

DockObserver

UsbService

UiModeManagerService

BackupManagerService

AppWidgetService

RecognitionManagerService

DiskStatsService

而下列基本的服务会在FACTORY_TEST_LOW_LEVEL模式时执行的路径有所不同:

ActivityManagerService

FACTORY_TEST_LOW_LEVEL模式时,不会发出BOOT_COMPLETED广播;启动第一个程序不是通过Acrtion为MAIN,Category为Home的Intent来启动第一个程序,而是通过Acrtion为Intent.ACTION_FACTORY_TEST (“android.intent.action.FACTORY_TEST)的Intent来启动。

PackageManagerService

FACTORY_TEST_LOW_LEVEL模式时,对包含FACTORY_TEST这个Permission的包,加上ApplicationInfo.FLAG_FACTORY_TEST的标志。

ContentService

FACTORY_TEST_LOW_LEVEL模式时,SyncManager会因为FactoryTest模式下的差异,而表现不同。

WindowManagerService

FACTORY_TEST_LOW_LEVEL模式时,没有输入法。


三、FactoryTest的配置


由上面简要分析知道,FACTORY_TEST_LOW_LEVEL模式下,要对FactoryTest程序进行配置。另外,如何进入FactoryTest模式也要进行配置。

3.1 FactoryTest应用的配置


由上面简要分析知道,FACTORY_TEST_LOW_LEVEL模式下,第一个被启动的程序就是工程模式的测试程序,而这个程序必须:

  • 有响应Action为Intent.ACTION_FACTORY_TEST(“android.intent.action.FACTORY_TEST”)的Activity;
  • 另外,这个程序还必须获取“android.permission.FACTORY_TEST”;
  • 这个程序必须为系统内置程序(安装在/system/app/)

响应Action为Intent.ACTION_FACTORY_TEST (“android.intent.action.FACTORY_TEST”)的Activity在开机之后就被执行。

3.2 启动模式设置


启动模式是由“ro.factorytest”这个系统属性来决定的,取值范围是0/1/2,对应第一部分定义的三个级别模式。可在在.mk文件中通过PRODUCT_PROPERTY_OVERRIDES或ADDITIONAL_DEFUALT_PROPERTIES追加一个这样的属性。比如:

#FactoryTest LowLevel
PRODUCT_PROPERTY_OVERRIDE += ro.factorytest=1

3.3 内核启动模式

有些实现通过上面的设置还不起作用,那是因为在内核启动时,通过启动模式对“ro.factorytest”这个系统属性进行了设置。

理想状态是由内核来决定启动模式,而不需要上小节的设置。

内核通过参数“androidboot.mode”来决定工厂模式(”factory”对应FACTORY_TEST_LOW_LEVEL;”factory2”对应FACTORY_TEST_HIGH_LEVEL;其他值或未设置对应”factory”对应FACTORY_TEST_OFF)。


上面需要内核支持,不支持的话就固定为正常模式。

所以,如果内核不支持,可以直接把init.c中判断“androidboot.mode”而设置“ro.factorytest”的代码暂时屏蔽,直接用上节所说的“ro.factorytest”来决定Factory的模式。


总结


本文分析了:

1.Android原生实现中已有的FactoryTest的框架:屏蔽了一些服务和功能;

2.并通过下列方式就可实现工厂测试模式:

1)写一个FactoryTest的应用;

2)设定“ro.factorytest”系统属性,并屏蔽由内核来设定的设置,

或者

3)通过内核启动参数“androidboot.mode”决定FactoryTest的模式。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值