这些不是有效的mnc或mcc值。您可以在提供替代资源页面上看到mcc范围从 0 到 999,而mnc范围从 1 到 999。
基于框架的命名。看来您正在处理一个 MIUI 框架。这意味着 MIUI 完全有可能修改 AOSP 限定符以允许这样的值。这意味着 MIUI 将从aapt可以处理那些非标准限定符的那些更改中进行自己的修改。
我检查了ResourceTypes.h数据类型mcc和数据类型mnc。
union {
struct {
// Mobile country code (from SIM). 0 means "any".
uint16_t mcc;
// Mobile network code (from SIM). 0 means "any".
uint16_t mnc;
};
uint32_t imsi;
};
如您所见,它们都是uint16_t. 所以我们的最大值是65535。因此,我们可以轻松地存储9998更多内容,而无需修改限定符本身。这将问题指向aapt验证。
如果我们看一下AaptConfig.cpp,aapt我们会看到parseMcc和parseMnc方法都有这个检查的变体
if (c-val == 0 || c-val > 3) return false;
所以基本上任何大于 3 位的值都会失败,从而给你这个错误。
现在我不知道 MIUI 如何利用这些限定符,但您有两个选择。
从源代码构建您自己的aapt,删除该检查。您将需要这个commit,它增加了对其他 MIUI 限定符更改的支持。为了安全。我会aapt从我的platform_frameworks_base repo构建你的。由于不断适应的特性aapt,应用程序变得越来越难以正确重新编译。我的 forkaapt删除了一些不必要的验证。(我这样做是因为如果你正在反编译一个 apk,它已经编译过一次,所以它不是 apktool 来确保 100% 的兼容性,比如更新aapt的尝试强制执行)。
删除那些目录res/values-mcc9998-mnc9999和values-mcc9466-mnc9999.