Apktool 因某些名为 values-mccxxxx-mncxxxx 的文件夹而崩溃
Apktool crashes with some folders called values-mccxxxx-mncxxxx
当我尝试编译一些像 framework-res.apk
或 FileExplorer.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
?
谢谢。
这些不是有效的 mnc
或 mcc
值。在Providing Alternative Resources页面可以看到,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
验证。
如果我们查看 aapt
的 AaptConfig.cpp
,我们会看到 parseMcc
和 parseMnc
方法都有此检查的变体
if (c-val == 0 || c-val > 3) return false;
所以基本上任何大于 3 位的值都是失败的,从而给你这个错误。
现在我不知道 MIUI 如何使用这些限定符,但你有两个选择。
从源代码中构建您自己的 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
试图强制执行的那样)。
删除那些目录res/values-mcc9998-mnc9999
和values-mcc9466-mnc9999
。
当我尝试编译一些像 framework-res.apk
或 FileExplorer.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
?
谢谢。
这些不是有效的 mnc
或 mcc
值。在Providing Alternative Resources页面可以看到,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
验证。
如果我们查看 aapt
的 AaptConfig.cpp
,我们会看到 parseMcc
和 parseMnc
方法都有此检查的变体
if (c-val == 0 || c-val > 3) return false;
所以基本上任何大于 3 位的值都是失败的,从而给你这个错误。
现在我不知道 MIUI 如何使用这些限定符,但你有两个选择。
从源代码中构建您自己的
aapt
,删除该检查。您将需要这个 commit, which adds support from other MIUI qualifier changes. To be safe. I would just build youraapt
from myplatform_frameworks_base
repo。由于aapt
的不断适应性,应用程序越来越难以正确重新编译。我的aapt
分支删除了一些不必要的验证。 (我这样做是因为如果你正在反编译一个 apk,它已经被编译过一次,所以它不是 apktool 来确保 100% 的兼容性,就像更新的aapt
试图强制执行的那样)。删除那些目录
res/values-mcc9998-mnc9999
和values-mcc9466-mnc9999
。