我正在使用aapt工具从我的apk的不同文件夹中删除一些文件。这很好。
但是当我想将文件添加到apk时,aapt工具添加命令不允许我指定我想要添加文件的路径,因此我只能将文件添加到apk的根文件夹。 这很奇怪,因为我不认为开发人员永远不会想要将文件添加到apk的子文件夹(例如res文件夹)。这是可能的aapt或任何其他方法?导致从任何文件夹中删除文件的工作正常,并且添加文件仅适用于apk的根文件夹。不能将它用于任何其他文件夹。
由于
答案 0 :(得分:11)
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 /的当前工作目录中的文件夹中,希望这能回答您的问题
答案 1 :(得分:8)
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只是一个Zip文件,zip
工具可以正常工作。
(为了记录,我还没有提交这个简单的修补程序作为Android的补丁,如果其他人想要这个世界可能会更好的地方。我对Android代码提交过程的体验不得不放有一个非常复杂的提交机制,最终需要六个月的时间让某人回到我身边,在某些情况下只需稍作修改就可以在他们的最后完成他们的提交过程并不是那么复杂。鉴于有这个问题非常容易解决,我不认为重要的是再次打扰所有这些。)