为了方便的进行CTS测试和验证,将CTS测试用例导入Android studio能够提高效率。
备注:此文章也适合将安卓原生应用导入Android Studio步骤
在开始之前先安装JDK和ndk,并配置好jdk和ndk环境变量。
CTS测试用例所在目录:安卓源码根目录\cts\tests和\cts\tests\tests,此处以camera测试用例为例子。
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
// 其中src,utils为默认camera源码,多个时以逗号隔开;后面几个为依赖的源码,从安卓源码中复制到工程中
java.srcDirs = ['src', 'utils', 'test-annotations', 'test-runner-src', 'test-mock-src']
res.srcDirs = ['res']
aidl.srcDirs = ['src']
assets.srcDirs = ['assets']
//若有jni源码,但是又不想使用,仅用于修改并生成so,可以如下设置
jni.srcDirs = []
jniLibs.srcDirs = ['libs']
//.rs文件目录
renderscript.srcDirs = ['src']
}
}
首先看依赖的静态java库,找到LOCAL_STATIC_JAVA_LIBRARIES关键字,这是工程依赖的jar包。工程的依赖包在源码全编译后的out\target\common\obj\JAVA_LIBRARIES或者out\target\product\xxx(产品型号)\obj\JAVA_LIBRARIES中可以找到,比如此例子中的依赖有compatibility-device-util,mockito-target-minus-junit4,android-ex-camera2等,在common\obj\JAVA_LIBRARIES\目录中找到compatibility-device-util_intermediates\classes.jar,将此jar包改名成compatibility-device-util.jar后复制到CTSCamera\app\libs目录下,其他jar包也类似方式添加到libs目录下。若xxx_imtermediates目录下没有classes.jar,或者jar包中没有java文件编译后的.class文件,则只能找到相关的源码,以源码方式引入工程,作为主工程的依赖库导入。有些jar没有在mk中列出来,那么可在JAVA_LIBRARIES目录下搜索找不到的类,从而定位jar包。
其次看依赖的动态库,在app/Android.mk中有LOCAL_JNI_SHARED_LIBRARIES关键字,表明应用还需要调用so库,在工程中的jni目录(app\jni,且包含Android.mk),则需要通过ndk-build命令将cpp代码编译成so。方法是打开命令行窗口,进入到工程jni目录,执行ndk-build命令,成功后在app\libs目录下生成arm64-v8a,armeabi-v7a等so库。或者更简单的方法是直接把cts测试后生成的testcase/CtsCameraTestCases.apk解压,把libs中的so库复制到工程目录,省去自己编译。
解决方法:将包含重复类的jar解压,删除重复类(包)之后,打开命令行窗口,进入到解压后文件夹根目录,执行:jar -cvf android.jar . 命令,其中android.jar为重新打包后的jar包名称,“.”表示将当前目录所有文件打包,如图1所示,最后将重新打包的jar覆盖libs中原来的jar。
图1 重新打包jar
解决方法:打开AS安装目录的bin目录,打开idea.properties,将idea.max.intellisense.filesize=2500中的2500改成5000
参考:https://jingyan.baidu.com/article/870c6fc3655fd1b03fe4bed5.html
解决方法:假设framework.jar放在app/libs目录下,在工程的build.gradle中加入如下语句:
allprojects {
repositories {
google()
jcenter()
}
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs.add('-Xbootclasspath/p:app/libs/framework.jar')
// 多个时用分号隔开,形如
// options.compilerArgs.add('-Xbootclasspath/p:app/libs/framework.jar;app/libs/telephony-common.jar')
}
}
}
在模块的build.gradle的最外层(不包含于任何标签内)加上如下语句:
// make SDK directory's android.jar set in libs behind
preBuild {
doLast {
def imlFile = file(project.name + ".iml")
println 'Change ' + project.name + '.iml order'
try {
def parseXml = new XmlParser().parse(imlFile)
def jdkNode = parseXml.component[1].orderEntry.find { it.'@type' == 'jdk' }
parseXml.component[1].remove(jdkNode)
def sdkString = "Android API " + android.compileSdkVersion.substring("android-".length()) + " Platform"
new Node(parseXml.component[1], 'orderEntry', ['type': 'jdk', 'jdkName': sdkString, 'jdkType': 'Android SDK'])
groovy.xml.XmlUtil.serialize(parseXml, new FileOutputStream(imlFile))
} catch (FileNotFoundException e) {
//nop, iml not found.
}
}
}
在能够正常打包apk后,配置Run参数。菜单Run--Edit Configrations中进行如图2配置。
图2配置测试类
最后,点击Run图标即可测试图2所配置的测试类,首次测试会提示权限拒绝错误,先在手机设置--应用中将android.camera.cts应用的所有权限打开,然后在点击Run图标即可正常测试,用例测试成功如图3,用例测试失败如图4。
图3测试用例成功
图4 测试用例失败
若要更换测试类,在Edit Configrations选择其他测试类,再次运行即可。