【发布时间】:2012-09-17 23:10:02
【问题描述】:
这个问题有点复杂,请多多包涵: 我有一个 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 中打开输出,除了我更改的资产文件之外,它似乎是相同的。
【问题讨论】:
-
说出这样做的任何正当理由。
-
@CommonsWare 因为我想将游戏中的一些图像替换为我自己的一些自定义图像。也因为我还在学习 android 开发,并认为这将是一个很好的实验来帮助我了解有关 android 的东西。还有,为什么不呢?
-
您是如何从您的应用中获取其他 apk 的?只要您正在制作副本,您似乎就可以为 apk 执行此操作……这就是您在代码中所做的吗?
-
@JRaymond 是的,我正在尝试制作原始 apk 的副本,但在 assets 文件夹中更改了一个图像文件。它似乎可以工作,但由于某种原因,它总是在启动时崩溃。
-
我认为它不会起作用,因为那时您还需要即时签署 APK 文件。如果你修改它,哈希检查将失败...
标签: java android zip apk zipfile