CTS 包是直接测试自己的版本。用CTS工具测试。
测试命令举例:
run cts -m CtsTelecomTestCases2 -t android.telecom.cts.DefaultDialerOperationsNoPermissionsTest#testShowInCallScreenPermissions
GSI是用VTS工具,替换谷歌img后再测试。
命令举例:
run cts-on-gsi -m CtsTelecomTestCases2 -t android.telecom.cts.DefaultDialerOperationsNoPermissionsTest#testShowInCallScreenPermissions
CTS GSI这两个测试其实都是测试CTS,CTS可以看到源码,在cts/test 目录下。
GTS是谷歌GMS包测试。这个无法看到测试包源码。用GTS工具测试。
测试命令举例:
run gts -m GtsGmscoreHostTestCases -t com.google.android.gts.security.DeviceIdAttestationHostTest#testImeiAttestation
android.telecom.cts.DefaultDialerOperationsTest#testGetDefaultDialerPackage fail:
junit.framework.ComparisonFailure: expected: but was:
at junit.framework.Assert.assertEquals(Assert.java:85)
at junit.framework.Assert.assertEquals(Assert.java:91)
at android.telecom.cts.DefaultDialerOperationsTest.testGetDefaultDialerPackage(DefaultDialerOperationsTest.java:78)
at java.lang.reflect.Method.invoke(Native Method)
at android.test.InstrumentationTestCase.runMethod(InstrumentationTestCase.java:220)
at android.test.InstrumentationTestCase.runTest(InstrumentationTestCase.java:205)
at junit.framework.TestCase.runBare(TestCase.java:134)
at junit.framework.TestResult$1.protect(TestResult.java:115)
at android.support.test.internal.runner.junit3.AndroidTestResult.runProtected(AndroidTestResult.java:73)
at junit.framework.TestResult.run(TestResult.java:118)
at android.support.test.internal.runner.junit3.AndroidTestResult.run(AndroidTestResult.java:51)
at junit.framework.TestCase.run(TestCase.java:124)
at android.support.test.internal.runner.junit3.NonLeakyTestSuite$NonLeakyTest.run(NonLeakyTestSuite.java:62)
at android.support.test.internal.runner.junit3.AndroidTestSuite$2.run(AndroidTestSuite.java:101)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:458)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:764)
TelecomManager.getDefaultDialerPackage()获得的是org.codeaurora.dialer,而SystemDialer是null。
通过设置->默认拨号盘来看确实是null。
此项GSI测试,需要替换google img。
测试版本的拨号盘用的是代码中vendor目录下的QtiDialer,其包名为org.codeaurora.dialer。QtiDialer.apk的加载目录为/system/priv-app. 原生的dialer包名是com.android.dialer, 编译时被裁掉了。 为了使默认dialer为QtiDialer,在vendor目录下的TelecomResCommon.apk 通过RRO 运行时替换 overlay了对应的资源ui_default_package. TelecomResCommon.apk装载在vendor /overlay目录。
相当于TelecomResCommon.apk 替换了 默认dialer的包名,指向QtiDialer.apk
当替换了google img后,问题出现了。QtiDialer.apk 在system目录,所以被清除了。但是google system img并不会清除vendor目录,所以TelecomResCommon.apk 目录还在。
这就导致了当前系统只存在包名为com.android.dialer的原生Dialer.apk,但是系统资源指定默认dialer的包名org.codeaurora.dialer。最终system dialer 为null。这样比较时system dialer和dafault dialer不一致,出现问题,导致测试不过。
当时思考了不同的解决方案:
QtiDialer.apk 加载到vendor目录下。
TelecomResCommon.apk 加载到system目录下。
维持QtiDialer.apk 的包名仍然为com.android.dialer
方案1 2 都是一荣俱荣,一损俱损。让TelecomResCommon.apk和QtiDialer.apk 同时存在同时消失。方案3 因为原生Dialer被编译时被裁掉,所以QtiDialer.apk仍然用com.android.dialer,ui_default_package 的overlay裁掉。
此问题提了高通case。高通提供了解决方案。按照方案2走的。并且修改很简洁:将TelecomResCommon.apk的mk脚本修改两行:
@@ -6,8 +6,9 @@ LOCAL_CERTIFICATE := platform
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
+LOCAL_MODULE_TAGS := optional debug
LOCAL_PACKAGE_NAME := TelecommResCommon
LOCAL_SDK_VERSION := current
-include $(BUILD_RRO_PACKAGE)
+include $(BUILD_PACKAGE)
重新编译后 TelecomResCommon.apk处于system/app目录下了。