我正在使用 aapt 工具从我的 apk 的不同文件夹中删除一些文件。这工作正常。
但是当我想将文件添加到 apk 时,aapt 工具 add 命令不允许我指定要添加文件的路径,因此我只能将文件添加到 apk 的根文件夹。这很奇怪,因为我认为开发人员永远不会想要将文件添加到 apk 的子文件夹(例如 res 文件夹)。这可以通过 aapt 或任何其他方法实现吗?因为从任何文件夹中删除文件都可以正常工作,而添加文件仅适用于 apk 的根文件夹。不能用于任何其他文件夹。
谢谢
aapt 工具保留 add 命令中指定的目录结构,如果您想在 apk 中的现有文件夹中添加内容,您只需在系统上有一个类似的文件夹,并且必须指定每个文件以完整列出目录。例子
$ aapt list test.apk
res/drawable-hdpi/pic1.png
res/drawable-hdpi/pic2.png
AndroidManifest.xml
$ aapt remove test.apk res/drawable-hdpi/pic1.png
$ aapt add test.apk res/drawable-hdpi/pic1.png
将添加的 pic1.png 位于终端 res/drawable-hdpi/ 的当前工作目录中的文件夹中,希望这能回答您的问题
实际上有一个错误aapt
会使这随机不可能。它应该工作的方式正如另一个答案所声称的那样:保留路径,除非你通过-k
. 让我们看看这是如何实现的:
控制路径是否被忽略的标志是mJunkPath
:
bool mJunkPath;
这个变量在一个名为 的类中Bundle
,由两个访问器控制:
bool getJunkPath(void) const { return mJunkPath; }
void setJunkPath(bool val) { mJunkPath = val; }
如果用户-k
在命令行指定,则设置为true
:
case 'k':
bundle.setJunkPath(true);
break;
并且,当数据被添加到文件中时,它会被检查:
if (bundle->getJunkPath()) {
String8 storageName = String8(fileName).getPathLeaf();
printf(" '%s' as '%s'...\n", fileName, storageName.string());
result = zip->add(fileName, storageName.string(),
bundle->getCompressionMethod(), NULL);
} else {
printf(" '%s'...\n", fileName);
result = zip->add(fileName, bundle->getCompressionMethod(), NULL);
}
不幸的是,应用程序使用的一个实例Bundle
是在栈上分配的,构造函数main
中没有初始化mJunkPath
,所以变量的值是随机的;没有办法将其显式设置为false
,在我的系统上,我(似乎是确定性的)无法在指定路径添加文件。
但是,您也可以只使用zip
APK,因为 APK 只是一个 Zip 文件,并且该zip
工具可以正常工作。
(作为记录,我还没有将这个微不足道的修复程序作为补丁提交给 Android,如果其他人想要这个世界可能会是一个更好的地方。我在 Android 代码提交过程中的经验是不得不忍受令人难以置信的复杂提交机制,最终有人花了六个月的时间才回复我,在某些情况下,他们可能刚刚进行了微小的修改,他们的提交过程并没有那么复杂。鉴于有一个非常简单的解决这个问题的方法,我认为它不够重要,不能再次打扰所有这些。)