By:GentlemanTsao

文章目录

    • 问题描述:
      • Case:
      • Failure Result:
      • Log Print:
    • 问题分析
      • 测试项owner及目的:
      • 测试用例代码段:
      • 测试代码解析:
      • logcat分析
      • modem log分析
    • 解决方案:
    • 类关系图

问题描述:

Case:

android.carrierapi.cts.CarrierApiTest#testIccTransmitApduBasicChannel

Failure Result:

junit.framework.ComparisonFailure:expected:<[90]00> but was:<[6f]00>

Log Print:

07-29 06:13:32.035  5453  5553 E TestRunner: failed: testIccExchangeSimIO(android.carrierapi.cts.CarrierApiTest)07-29 06:13:32.035  5453  5553 E TestRunner: ----- begin exception -----07-29 06:13:32.036  5453  5553 E TestRunner: junit.framework.ComparisonFailure: expected:<[90]00> but was:<[6f]00>07-29 06:13:32.036  5453  5553 E TestRunner:  at junit.framework.Assert.assertEquals(Assert.java:85)07-29 06:13:32.036  5453  5553 E TestRunner:  at junit.framework.Assert.assertEquals(Assert.java:91)07-29 06:13:32.036  5453  5553 E TestRunner:  at android.carrierapi.cts.CarrierApiTest.testIccExchangeSimIO(CarrierApiTest.java:1072)07-29 06:13:32.036  5453  5553 E TestRunner:  at java.lang.reflect.Method.invoke(Native Method)07-29 06:13:32.036  5453  5553 E TestRunner:  at junit.framework.TestCase.runTest(TestCase.java:168)07-29 06:13:32.036  5453  5553 E TestRunner:  at junit.framework.TestCase.runBare(TestCase.java:134)07-29 06:13:32.036  5453  5553 E TestRunner:  at junit.framework.TestResult$1.protect(TestResult.java:115)07-29 06:13:32.036  5453  5553 E TestRunner:  at androidx.test.internal.runner.junit3.AndroidTestResult.runProtected(AndroidTestResult.java:73)07-29 06:13:32.036  5453  5553 E TestRunner:  at junit.framework.TestResult.run(TestResult.java:118)07-29 06:13:32.036  5453  5553 E TestRunner:  at androidx.test.internal.runner.junit3.AndroidTestResult.run(AndroidTestResult.java:51)07-29 06:13:32.036  5453  5553 E TestRunner:  at junit.framework.TestCase.run(TestCase.java:124)07-29 06:13:32.036  5453  5553 E TestRunner:  at androidx.test.internal.runner.junit3.NonLeakyTestSuite$NonLeakyTest.run(NonLeakyTestSuite.java:62)07-29 06:13:32.036  5453  5553 E TestRunner:  at androidx.test.internal.runner.junit3.AndroidTestSuite$2.run(AndroidTestSuite.java:101)07-29 06:13:32.036  5453  5553 E TestRunner:  at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:462)07-29 06:13:32.036  5453  5553 E TestRunner:  at java.util.concurrent.FutureTask.run(FutureTask.java:266)07-29 06:13:32.036  5453  5553 E TestRunner:  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)07-29 06:13:32.036  5453  5553 E TestRunner:  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)07-29 06:13:32.036  5453  5553 E TestRunner:  at java.lang.Thread.run(Thread.java:919)

问题分析

测试项owner及目的:

该项测试是Google新添加,目的是为了确保:
https://developer.android.com/reference/android/telephony/TelephonyManager
中对应的API得到支持。

从源码中可以看到如下commit记录:

commit 7c830e55c1bb3da5f09e6c0ac77a5426b7c8a7caAuthor: Cody Kesting <ckesting@google.com>Date:   Mon Apr 1 10:53:16 2019 -0700    Add CTS testing for TM#iccTransmitApduBasicChannel        This test makes several valid APDUs via    TelephonyManager#iccTransmitApduBasicChannel.    Bug: 122974140    Test: atest CtsCarrierApiTestCases:CarrierApiTest    Merged-In: I33128bcabbbe810e1d131d5a0fcbec5a2e53f718    Change-Id: I33128bcabbbe810e1d131d5a0fcbec5a2e53f718    (cherry picked from commit ed1c54dd425f1627c52a1512abdb78658a2beb0c)

测试用例代码段:

在下面的路径下,可以看到测试用例的参考代码段:
CarrierApiTest.java (cts\tests\tests\carrierapi\src\android\carrierapi\cts)

    /**     * This test verifies that {@link TelephonyManager#iccExchangeSimIO(int, int, int, int, int,     * String)} correctly transmits iccIO commands to the UICC card. First, the MF is selected via a     * SELECT apdu via the basic channel, then a STATUS AT-command is sent.     */    public void testIccExchangeSimIO() {        if (!hasCellular) return;        // select the MF first. This makes sure the next STATUS AT-command returns a FCP template        // for the right file.        int cla = CLA_SELECT;        int p1 = 0; // select EF by FID        int p2 = 0x0C; // requesting FCP template        int p3 = 2; // length of 'data' payload        String data = MF_FILE_ID;        String response = mTelephonyManager                .iccTransmitApduBasicChannel(cla, COMMAND_SELECT, p1, p2, p3, data);        assertEquals(STATUS_NORMAL_STRING, response); //异常发生点        。。。

测试代码解析:

发送指令:
0xA4

参数:
channel:0
cla:0x00
p1:0
p2:0x0C
p3:2
data:3F00

logcat分析

从logcat看,返回OPERATION_NOT_ALLOWED,表示该指令不被支持。

07-29 06:13:31.982  2370  2370 E PhoneInterfaceManager: [PhoneIntfMgr] iccTransmitApduBasicChannel: CommandException: com.android.internal.telephony.CommandException: OPERATION_NOT_ALLOWED

从前期分析的Exception log可以看到返回错误代号[6f]00:

07-29 06:13:32.036  5453  5553 E TestRunner: junit.framework.ComparisonFailure: expected:<[90]00> but was:<[6f]00>

该代号的涵义在如下文件中对应:
IccIoResult.java (frameworks\opt\telephony\src\java\com\android\internal\telephony\uicc)

            case 0x6F:                switch(sw2) {                    case 0x00: return "technical problem with no diagnostic given";                    default: return "The interpretation of this status word is command dependent";                }

可以看出,它提示“technical problem with no diagnostic given”——未给出诊断的技术问题。

modem log分析

从logcat的分析推断,问题指向SIM卡或modem,因而需要抓取modem log确认。

modem log中报如下错误讯息:

 User Identity Module/Error[           qmi_uim.c  10766] ADPU rejected due to securityrestrictions: logical_channel doesnt belong to client

注意测试API接口是iccTransmitApduBasicChannel,而在modem log提示“ADPU rejected due to security restrictions:”。

根据高通的解释,

We do not allow streaming APDUs on
default channel in modem. Similarly we have restrictions for other type of
commands like manage channel etc as well on modem side.

So, the APDUs are rejected at modem
level itself and not sent to the card which leads to test case failures.


所以,该问题是由于modem限制了APDU造成。

解决方案:

将NV 67312 (QMI UIM APDU Security Restrictions)置0,从而解除APU的限制。

该项NV无法通过QXDM工具修改,需写入HW MBN中以生效。

我们需在modem_proc/mcfg/mcfg_gen/generic/common/Default/mcfg_hw_gen_Default.xml文件中新增一项NV:

 <NvEfsItemData name="apdu_security_restrictions" id="67312" description="APDU Security Restrictions" comment="" category="UIM" mcfgAttributes="0x09" mcfgVariant="2" fullpathname="/nv/item_files/modem/qmi/uim/apdu_security_restrictions"> <Member name="apdu_security_restrictions" description="" comment="" sizeOf="1" type="uint8">0 </Member> </NvEfsItemData>

同时,升级HW MBN version.

再重新编译Non-Hlos.bin并导入UE验证。

类关系图

如下是该项测试AP侧的类关系图:
Android:CTS:解决android.carrierapi.cts.CarrierApiTest#testIccTransmitApduBasicChannel fail_第1张图片

更多相关文章

  1. Android地图添加标记和文字【代码片段】
  2. android studio 项目的版本问题
  3. Android中imageView图片放大缩小及旋转功能示例代码
  4. Android中代码混淆
  5. 代码实现android手机信号监听
  6. Android环形进度条(安卓默认形式)实例代码
  7. Android Studio(十一):代码混淆及打包apk
  8. Android APK瘦身之Android Studio Lint (代码审查)
  9. Android Wifi子系统源代码View

随机推荐

  1. Android(安卓)CTS 测试研究之二
  2. 大家帮忙看看简历
  3. import project后,出现Unable to get syst
  4. Android(安卓)API 中文 (52) —— ZoomButt
  5. Android(安卓)5.1 Lollipop Phone工作流
  6. 8个android 游戏引擎
  7. Android(安卓)NoHttp源码阅读指导
  8. Start from Android(安卓)Studio
  9. Android(安卓)Local Service
  10. Drozer – Android(安卓)APP安全评估工具