通过App Center分发App Bundle时Wear OS应用找不到配套手机应用
问题根源
你遇到的核心问题是:存放android_wear_capabilities的wear.xml被资源压缩工具判定为“未使用文件”,直接被整体删除了。虽然你在文件里加了tools:keep,但资源压缩的处理逻辑是先扫描未使用文件,再处理单个资源的保留规则——文件都没了,规则自然无效。
解决办法
1. 用全局资源保留文件锁死目标资源
创建res/raw/keep.xml(没有就新建),这是资源压缩的全局配置文件,优先级比单个资源文件里的规则高:
<?xml version="1.0" encoding="utf-8"?> <resources xmlns:tools="http://schemas.android.com/tools"> <!-- 强制保留穿戴能力数组 --> tools:keep="@array/android_wear_capabilities" <!-- 可选:开启严格模式,只保留明确指定的资源,避免误删 --> tools:shrinkMode="strict" </resources>
2. 给资源加个“假引用”骗过程序
因为android_wear_capabilities是系统通过资源ID识别的,不是代码直接调用的,压缩工具会觉得它没用。你可以在Wear应用的任意类里加一行无意义的代码,让工具认为这个资源被使用了:
// Kotlin随便找个类加 private val dummyCap = R.array.android_wear_capabilities
// Java版本 private static final int DUMMY_CAP = R.array.android_wear_capabilities;
这种“假引用”不会影响功能,但能保住资源不被删。
3. 在Build Gradle里直接配置保留规则
在Wear模块的build.gradle的release构建块里,直接告诉构建工具要保留这个数组:
android { buildTypes { release { shrinkResources true // 强制保留目标数组 keepResources.add("@array/android_wear_capabilities") proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } }
4. 换个地方存能力数组
如果上面的方法都不好使,干脆把android_wear_capabilities数组移到res/values/strings.xml里——这个文件肯定不会被判定为未使用,再加上原来的属性就行:
<resources xmlns:tools="http://schemas.android.com/tools"> <!-- 你的其他字符串资源 --> <string-array name="android_wear_capabilities" tools:ignore="UnusedResources" translatable="false"> <item>CapabilityName</item> </string-array> </resources>
验证步骤
用bundletool从App Bundle里提取Wear的APK,检查res/values下有没有包含目标数组的文件,或者直接安装测试,确认设备间的能力识别正常。
内容的提问来源于stack exchange,提问作者Mahesh Mohandasan
相关产品推荐
相关产品推荐

