GSI testGetDefaultDialerPackage失败以及解决

先总结下GTS GSI CTS 区别

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)

出错代码

GSI testGetDefaultDialerPackage失败以及解决_第1张图片

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目录。

GSI testGetDefaultDialerPackage失败以及解决_第2张图片
GSI testGetDefaultDialerPackage失败以及解决_第3张图片
相当于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不一致,出现问题,导致测试不过。

解决方案

当时思考了不同的解决方案:

  1. QtiDialer.apk 加载到vendor目录下。

  2. TelecomResCommon.apk 加载到system目录下。

  3. 维持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目录下了。

相关adb 命令

adb shell 进入终端控制台后。输入telecom 获取:
GSI testGetDefaultDialerPackage失败以及解决_第4张图片

你可能感兴趣的:(android移动网络通讯)