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..." 时选择的发布密钥(证书)进行签名。因此,您有两个选择:
将发布证书添加到安全元素上您的小程序允许的应用程序列表。
将安全元素上的访问条件更改为全部允许,以允许从任何设备应用程序访问任何小程序。
根据您的安全元素,您通常需要更新 ARA(GlobalPlatform 访问控制)小程序 (AID A00000015141434C00
) 或位于 PKCS#15 应用程序 (AID) 中的访问规则文件 (ARF) A000000063504B43532D3135
) 或在具有新访问条件的 SIM 文件系统中。
我正在使用来自 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..." 时选择的发布密钥(证书)进行签名。因此,您有两个选择:
将发布证书添加到安全元素上您的小程序允许的应用程序列表。
将安全元素上的访问条件更改为全部允许,以允许从任何设备应用程序访问任何小程序。
根据您的安全元素,您通常需要更新 ARA(GlobalPlatform 访问控制)小程序 (AID A00000015141434C00
) 或位于 PKCS#15 应用程序 (AID) 中的访问规则文件 (ARF) A000000063504B43532D3135
) 或在具有新访问条件的 SIM 文件系统中。