我正在使用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 /的当前工作目录中的文件夹中,希望这回答了你的问题
实际上有一个错误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代码提交过程的体验不得不忍受令人难以置信的复杂提交机制,最终需要六个月的时间让某人回复我,在某些情况下进行了一些可能刚刚完成的微小修改,他们的提交过程并不是那么复杂.鉴于有一个非常简单的针对这个问题的解决方法,我认为重要的是不要再烦恼所有这一切了.)
| 归档时间: |
|
| 查看次数: |
7848 次 |
| 最近记录: |