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

Path 如何设置aapt add命令添加文件的路径,path,add,aapt,Path,Add,Aapt,我正在使用aapt工具从apk的不同文件夹中删除一些文件。这个很好用 但是,当我想将文件添加到apk时,aapt tool add命令不允许我指定要添加文件的路径,因此我只能将文件添加到apk的根文件夹。 这很奇怪,因为我不认为开发人员永远都不想将文件添加到apk的子文件夹(例如res文件夹)。aapt或任何其他方法是否可以实现这一点?因为从任何文件夹中删除文件都可以正常工作,而添加文件只对apk的根文件夹有效。无法将其用于任何其他文件夹 感谢aapt工具保留了add命令中指定的目录结构,如果要

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

但是,当我想将文件添加到apk时,aapt tool 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只是一个zip文件,而且
zip
工具工作正常


(为了记录在案,我还没有把这个小补丁作为安卓补丁提交给安卓,如果其他人想要的话,这个世界可能会更美好。我在安卓代码提交过程中的经验是,不得不忍受一个极其复杂的提交机制,最终有人花了六个月的时间才回复我,所以在我的情况下,他们的提交过程并没有那么复杂,因为有一个非常简单的解决办法,我认为再考虑这些问题是很重要的。)

我已经编写了自己的工具来替换我需要的aapt。但是感谢您的想法。很高兴将来知道。我会投票支持您的答案,但我还没有必要的声誉。感谢您提供的信息。我终于编写了一个简单的java工具,将文件添加到apk(考虑到它[如您所说]是zip),使用ZipInputStream和ZipEntry。我猜“zip工具”指的是一些名为“zip”的工具,而不是归档类型,因为解压apk并添加一些文件非常简单,但压缩它并构建新添加的文件(使用“zip”是不可能的);我使用了apktool。我不明白你的意思“构建新添加的文件”;在我的例子中,我添加了
classes.dex
(使用
dx
构建)通过
zip my.APK classes.dex
无问题地添加到现有的APK。例如,如果我只想通过替换res/drawable文件夹中的图标图像来更改我应用程序的图标,这是行不通的。我猜新资源需要自动生成的R类中的id,该类是在生成时生成的。因此,我使用了apktool to解码apk,然后添加我的新图像,然后重新构建apk,再次使用apktool。嗨,Jay,我有个问题要问你。我需要删除“classes.dex”“从data/app文件夹中的现有.apk文件。然后我需要像平常一样重新包装。apk。我将通过在java中使用zipfile来实现这一点。但是当我在模拟器上闪烁时会发生什么呢?一些虚拟图标代替了原来的图标。但是res文件夹和manifest.xml都在那里。你能提供一些信息吗??