田海立

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 LowLevelPRODUCT_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的模式。


更多相关文章

  1. android随心笔记-part2-第1个android应用程序
  2. Android下用程序的方法为ListView设置分割线Divider样式
  3. Android中获取应用程序(包)的大小-----PackageManager的使用(二)
  4. Ubuntu 开启 Android 的 USB 调试模式
  5. Google将推出Android手机版Voice应用程序
  6. android中完全退出当前应用程序的四种方法
  7. 安卓加载模式(Android LauncherMode)

随机推荐

  1. Android Studio 4.0版本创建Activity无法
  2. android salite3 使用实例
  3. 新版eclipse中NDK环境搭建(免Cygwin,超级
  4. Android图像格式类及图像转换方法
  5. Xamarin Mono For Android(安卓)4.6.0700
  6. android数据共享之Content Provider(概念
  7. Android面试题目及其答案
  8. android apk广告去除
  9. android 系统平台的架构
  10. Android框架简介