如何设置aapt add命令添加文件的路径

use*_*187 11 add path aapt

我正在使用aapt工具从我的apk的不同文件夹中删除一些文件.这很好用.

但是当我想将文件添加到apk时,aapt工具添加命令不允许我指定我想要添加文件的路径,因此我只能将文件添加到apk的根文件夹.这很奇怪,因为我不认为开发人员永远不会想要将文件添加到apk的子文件夹(例如res文件夹).这是可能的aapt或任何其他方法?导致从任何文件夹中删除文件的工作正常,并且添加文件仅适用于apk的根文件夹.不能将它用于任何其他文件夹.

谢谢

Ree*_*gnE 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
Run Code Online (Sandbox Code Playgroud)

将添加的pic1.png驻留在终端res/drawable-hdpi /的当前工作目录中的文件夹中,希望这回答了你的问题

  • 我已经编写了自己的工具来替换我需要的东西.但是感谢你的想法.将来很高兴知道.我会投票给你答案,但我还没有必要的声誉. (2认同)

Jay*_*ik- 8

实际上有一个错误aapt会使这个随机变得不可能.它的工作方式与其他答案一样:路径保留,除非你通过-k.让我们看看这是如何实现的:

控制路径是否被忽略的标志是mJunkPath:

bool        mJunkPath;
Run Code Online (Sandbox Code Playgroud)

此变量位于一个名为的类中Bundle,由两个访问器控制:

bool getJunkPath(void) const { return mJunkPath; }
void setJunkPath(bool val) { mJunkPath = val; }
Run Code Online (Sandbox Code Playgroud)

如果用户-k在命令行中指定,则将其设置为true:

case 'k':
    bundle.setJunkPath(true);
    break;
Run Code Online (Sandbox Code Playgroud)

并且,当数据被添加到文件时,它被检查:

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);
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,Bundle应用程序使用的一个实例被分配在main堆栈中,并且mJunkPath构造函数中没有初始化,因此变量的值是随机的; 没有办法明确地设置它false,在我的系统上我(看似确定)无法在指定路径添加文件.

但是,您也可以使用zip,因为APK只是一个Zip文件,并且该zip工具工作正常.

(为了记录,我还没有提交这个简单的解决方案作为Android的补丁,如果其他人想要这个世界可能会更好的地方.我对Android代码提交过程的体验不得不忍受令人难以置信的复杂提交机制,最终需要六个月的时间让某人回复我,在某些情况下进行了一些可能刚刚完成的微小修改,他们的提交过程并不是那么复杂.鉴于有一个非常简单的针对这个问题的解决方法,我认为重要的是不要再烦恼所有这一切了.)