这个问题有点复杂,所以请多多包涵:我有一个 apk 文件,我试图在安装后以编程方式修改。我正在用另一个应用程序编辑它。我首先尝试使用用于 zip 文件管理的内置 java 类来执行此操作,但是当我尝试完全复制除我要修改的文件之外的所有文件并更改我要修改的文件时,应用程序将不再运行。我认为这是因为签名或其他原因,但是当我使用 winRAR 做同样的事情时(解压缩所有文件,创建一个新的 zip 存档,将所有文件复制到具有正常压缩的新 zip 存档中)并将新的 apk ssh 到我的 /data/应用程序文件夹,它工作正常。我的问题是为什么会这样。我认为这可能与 zip headers 或类似的东西有关,有人有什么想法吗?
PS:这是我用来重写 zip 文件的 java 进程的示例:
p = Runtime.getRuntime().exec("su");
ZipInputStream in = new ZipInputStream(new FileInputStream("This is the apk containing the asset I want to use to replace the other asset"));
ZipEntry e;
while((e = in.getNextEntry()) != null)
{
if(e.getName().equals("asset i want to use to replace the other asset"))
break;
}
ZipOutputStream out = new ZipOutputStream(new FileOutputStream("the output zip file"));
ZipInputStream original = new ZipInputStream(new FileInputStream("the apk i am trying to modify"));
ZipEntry f;
byte[] buf = new byte[1024];
while((f = original.getNextEntry()) != null)
{
if(!f.getName().equals("the asset i want to replace"))
{
out.putNextEntry(new ZipEntry(f.getName()));
int len;
while ((len = original.read(buf)) > 0) {
out.write(buf, 0, len);
}
original.closeEntry();
out.closeEntry();
}
else
{
out.putNextEntry(new ZipEntry(e.getName()));
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
out.closeEntry();
}
}
in.close();
out.close();
original.close();
我已经在 android 系统和使用常规软件的 windows 上运行了这个过程,我可以在 winRAR 中打开输出,除了我更改的资产文件之外,它似乎是相同的。