Huawei dynamic feature 安装失败:No silent install permission
结论
这次安装请求在华为应用市场处理时失败。应用市场返回 No silent install permission 后,SDK 通过失败回调报告了 FeatureInstallException。添加 android.permission.REQUEST_INSTALL_PACKAGES 无法解决这个权限问题。
如果测试方式是在模拟器中安装 HMS services,再运行本地构建,应先检查应用市场的安装能力和应用分发路径。建议通过 AppGallery Connect 的开放式测试(Open Testing)分发包含动态模块的 AAB,再从 AppGallery 安装测试版本,验证完整的按需安装流程。当前日志还不足以确定权限受限的具体原因,也不能据此断定所有模拟器都不支持该功能。
SDK 对应的公开错误码是 FeatureInstallErrorCode.NO_INSTALL_PERMISSION,值为 903。日志中的 marketErrorCode = 8 是应用市场侧的返回值,不能直接按这个数字在 SDK 的错误码类中查找。华为错误码文档
日志说明了什么
Ready to installFeature from the market.
Binding to the service success
onServiceConnected successed , check permission successed
Get error from hw marke , marketErrorCode is 8,
errorMsg is No silent install permission.
SDK 已连接到应用市场服务,但应用市场随后拒绝了安装请求。前面的 check permission successed 只表示前一个检查步骤通过,不能说明后续安装所需的权限也已满足。
这段日志没有直接表明 FeatureInstallRequest 的构造方式或模块名有误,应先排查安装环境。
这里需要区分三个值:
marketErrorCode = 8:当前日志中应用市场侧的错误码。FeatureInstallErrorCode.NO_INSTALL_PERMISSION = 903:SDK 公开的安装权限错误。FeatureInstallSessionStatus.REQUIRES_USER_CONFIRMATION = 8:安装会话状态,表示需要用户确认。
REQUIRES_USER_CONFIRMATION 的值虽然也是 8,但它属于另一套状态定义,不能根据当前日志中的数字 8 直接调用用户确认接口。华为 Dynamic Ability FAQ
为什么添加安装权限没有效果
下面的声明允许应用请求安装软件包,但不会直接授予静默安装能力:
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
Android 的“允许安装未知应用”设置也不能保证应用获得无用户交互的安装能力。当前请求通过 AppGallery 安装动态模块,应用自身增加这个声明,无法改变应用市场受到的安装限制。Android 安装权限说明
如果只是为了修复本次错误才添加这个权限,应重新评估是否需要保留,也不要继续尝试通过增加安装权限声明来解决。
按什么顺序排查
1. 检查 AppGallery 环境
仅安装 HMS services,还不能说明动态模块分发所需的环境已经具备。Dynamic Ability SDK 会查找并校验设备上的 AppGallery,再调用其服务。华为 Dynamic Ability FAQ
先确认 AppGallery 能正常启动和使用,并完成必要的用户协议确认,再在 AppGallery 环境正常的华为真机上做对照测试。
如果只有模拟器失败,继续检查模拟器中的应用市场及其系统安装能力。手动安装了 HMS services 或 AppGallery,并不意味着该环境已具备完整的静默安装条件。
2. 通过测试分发验证安装流程
按以下步骤验证,排除本地侧载带来的差异:
- 构建 Huawei flavor 的 AAB,确认其中包含
esp32_sdk动态模块。 - 上传到 AppGallery Connect,配置开放式测试。
- 使用有测试资格的账号,通过 AppGallery 安装对应测试版本。
- 在该版本中重新发起动态模块安装。
测试时要实际运行从测试渠道安装的版本。如果只上传 AAB,仍然运行通过 Android Studio 或 adb 安装的本地构建,就无法排除安装来源的影响。这个流程用于排查和验证,上传 AAB 并不能保证所有环境都获得安装能力。
3. 核对 flavor、模块和签名配置
如果通过测试渠道安装后仍然失败,再检查以下配置:
- Huawei flavor 的
applicationId是否与 AppGallery Connect 中的应用一致。 - 请求的
esp32_sdk是否存在于上传的 AAB 中,并配置为按需交付。 - 基础应用与动态模块是否来自匹配的构建,版本和签名是否一致。
- 当前运行的是否为预期测试版本,是否仍引用了 Google flavor 的模块配置。
当前日志尚未证明这些配置中有哪一项出错,因此将它们放在后续检查。
如何记录 SDK 的真实错误码
保留失败回调,从 FeatureInstallException 中读取错误码。使用问题中已有的 Task 封装时,可以这样记录:
startInstall(sdkInfo.moduleName)
.addOnSuccessListener { sessionId ->
Log.i("DynamicFeature", "Install request accepted: $sessionId")
// 继续通过安装状态监听器确认模块是否安装完成。
}
.addOnFailureListener { exception ->
if (exception is FeatureInstallException) {
Log.e(
"DynamicFeature",
"Install failed: code=${exception.errorCode}, " +
"message=${exception.message}",
exception
)
} else {
Log.e("DynamicFeature", "Install request failed", exception)
}
listener?.onError(sdkInfo, exception, null)
}
exception.errorCode 是 Kotlin 对 Java getErrorCode() 的属性访问写法。华为示例也通过这个方法读取任务失败码。华为 SDK 示例
如果读到 903,即可按 NO_INSTALL_PERMISSION 处理。业务判断应使用项目实际依赖中的常量,不要硬编码应用市场日志里的 8。
这段监听器代码使用了问题中的封装。如果直接使用 SDK 返回的任务类型,应以所用版本的接口为准。Google SDK 的调用形式相近,也不能说明两者的任务 API 完全一致。
注意事项
任务失败回调和安装状态监听器都要保留。请求可能在建立有效安装会话之前就被拒绝,因此不能只等待状态监听器报告失败。
成功取得 sessionId 后,仍需根据安装状态确认模块是否可用。华为 FAQ 给出的判断方式包括监听 FeatureInstallSessionStatus.INSTALLED,或检查已安装模块列表。华为 Dynamic Ability FAQ
如果在正常真机上运行通过 AppGallery 测试分发安装的版本,仍出现相同错误,应整理 SDK、AppGallery 和系统的版本信息,以及异常中的 errorCode、完整日志和应用安装来源,提交给华为技术支持。仅凭 marketErrorCode = 8,还无法进一步定位具体的权限限制。
备注:内容仅供参考。
