0

当我试图编译一些apkframework-res.apk时,或者FileExplorer.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不重命名这些文件夹的情况下构建?

谢谢。

4

1 回答 1

1

这些不是有效的mncmcc值。您可以在提供替代资源页面上看到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.cppaapt我们会看到parseMccparseMnc方法都有这个检查的变体

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

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

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

  1. 从源代码构建您自己的aapt,删除该检查。您将需要这个commit,它增加了对其他 MIUI 限定符更改的支持。为了安全。我会aapt从我的platform_frameworks_base repo构建你的。由于不断适应的特性aapt,应用程序变得越来越难以正确重新编译。我的 forkaapt删除了一些不必要的验证。(我这样做是因为如果你正在反编译一个 apk,它已经编译过一次,所以它不是 apktool 来确保 100% 的兼容性,比如更新aapt的尝试强制执行)。

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

于 2015-04-12T14:05:50.473 回答