Android打开手机API发布困难

Android Open Mobile API Release Difficulties

我正在使用来自 SDK 的 "org.simalliance.openmobileapi.jar" 文件。我将它复制到我的 libs 文件夹并添加了这样的依赖项

案例 #1:工作正常(在调试模式下)

在应用 Gradle 文件中我有:

provided files('libs/org.simalliance.openmobileapi.jar')

案例 #2:不工作(在发布模式下 - 没有 minifyEnabled)

在应用 Gradle 文件中我有:

compile files('libs/org.simalliance.openmobileapi.jar')

在案例 #2 中出现以下异常:

(java.lang.SecurityException: Access Control Enforcer: no APDU access allowed!)

什么可能导致问题?

首先,您需要在 build.gradle 文件中使用 "provided" 范围进行调试和发布构建:

dependencies {
    <i>[...]</i>
    provided files('libs/org.simalliance.openmobileapi.jar')
}

更新

"provided" 已过时,已被 "compileOnly" 取代,因此对于当前的 gradle 版本,您需要使用(如 TT 评论):

dependencies {
    <i>[...]</i>
    <b>compileOnly</b> files('libs/org.simalliance.openmobileapi.jar')
}

此外,您需要在 AndroidManifest.xml 中有一个 uses-library 条目:

<uses-library android:name="org.simalliance.openmobileapi"
              android:required="true" />

但是,由于您得到了 SecurityException,原因是 "Access Control Enforcer: no APDU access allowed!",这清楚地表明链接和使用系统提供的 Open Mobile API 库按预期工作并且您已成功连接到设备上的 SmartcardService 系统服务。因此,您的构建似乎按预期工作。

所以SecurityException已经很清楚的告诉你问题是什么了:

Access Control Enforcer: no APDU access allowed!

这意味着安全元素上的访问控制列表配置不正确。由于您的调试版本有效,您可能确实在安全元素上使用 ARA 小程序(and/or ARF 文件)为您的调试环境注册了证书。但是,发布版本未使用相同的调试密钥(证书)进行签名。相反,它们使用您在 Android Studio 中选择 "Generate Signed APK..." 时选择的发布密钥(证书)进行签名。因此,您有两个选择:

  1. 将发布证书添加到安全元素上您的小程序允许的应用程序列表。

  2. 将安全元素上的访问条件更改为全部允许,以允许从任何设备应用程序访问任何小程序。

根据您的安全元素,您通常需要更新 ARA(GlobalPlatform 访问控制)小程序 (AID A00000015141434C00) 或位于 PKCS#15 应用程序 (AID) 中的访问规则文件 (ARF) A000000063504B43532D3135) 或在具有新访问条件的 SIM 文件系统中。