Apktool 因某些名为 values-mccxxxx-mncxxxx 的文件夹而崩溃

Apktool crashes with some folders called values-mccxxxx-mncxxxx

当我尝试编译一些像 framework-res.apkFileExplorer.apk 的 apk 时,我总是得到同样的错误

invalid resource directory name: /ApkTool/Decompiladas/MiuiFramework.apk/res values-mcc9998-mnc9999 
invalid resource directory name: /ApkTool/Decompiladas/MiuiFramework.apk/res values-mcc9466-mnc9999

我知道我可以修复这个错误,只用三个数字重命名文件夹,但是使用 apk,如果我编译它重命名这些文件夹 rom 不会启动。

有没有什么方法可以在不重命名这些文件夹的情况下构建 apk

谢谢。

这些不是有效的 mncmcc 值。在Providing Alternative Resources页面可以看到,mcc的取值范围是0到999,而mnc的取值范围是1到999。

基于框架的命名。看来您正在处理 MIUI 框架。这意味着 MIUI 完全有可能修改 AOSP 限定符以允许此类值。这意味着 MIUI 将对那些可以处理那些非标准限定符的更改进行自己的修改 aapt

我检查了 ResourceTypes.h 以了解 mccmnc 是什么数据类型。

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 验证。

如果我们查看 aaptAaptConfig.cpp,我们会看到 parseMccparseMnc 方法都有此检查的变体

if (c-val == 0 || c-val > 3) return false;

所以基本上任何大于 3 位的值都是失败的,从而给你这个错误。

现在我不知道 MIUI 如何使用这些限定符,但你有两个选择。

  1. 从源代码中构建您自己的 aapt,删除该检查。您将需要这个 commit, which adds support from other MIUI qualifier changes. To be safe. I would just build your aapt from my platform_frameworks_base repo。由于 aapt 的不断适应性,应用程序越来越难以正确重新编译。我的 aapt 分支删除了一些不必要的验证。 (我这样做是因为如果你正在反编译一个 apk,它已经被编译过一次,所以它不是 apktool 来确保 100% 的兼容性,就像更新的 aapt 试图强制执行的那样)。

  2. 删除那些目录res/values-mcc9998-mnc9999values-mcc9466-mnc9999