这些不是有效的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
.