在java中以编程方式编辑apk文件

Posted

技术标签:

【中文标题】在java中以编程方式编辑apk文件【英文标题】:Programmatically editing apk files in java 【发布时间】: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 文件。如果你修改它,哈希检查将失败... 【参考方案1】:

您应该知道的唯一一件事是签名 apk 工具的工作原理(解决校验和 - 它们是 zip 条目。目标文件夹是带有 CERT.RSA 的 META-INF - 存在编码校验和以及其他调试信息,CERT。 SF 和 MANIFEST.MF - 使用 SHA1-Digest - Base64 编码的哈希(它们很容易被您自己检测到))。 但这是真正的黑客攻击!该代码可能很有用(并且被许多“聪明的程序员”用于动态更改应用程序的图片)并且可能很危险 - 因为您的 apk 文件可以增加到 GB 大小 - 如果您愿意的话。

我认为这个技巧不应该在世界范围内的人之间传播 - 它会被限制在程序员的小圈子里。

【讨论】:

以上是关于在java中以编程方式编辑apk文件的主要内容,如果未能解决你的问题,请参考以下文章

在线性布局中以编程方式编辑视图

应用程序在已发布的 APK 中以编程方式停止 GPS 位置请求

如何在 Android 10 中以编程方式安装任何 Android 应用

如何以编程方式获取 apk 文件名和路径?

如何以编程方式从 sdcard/storage .apk 文件中获取 appicon?

html5 如何打包成apk,将H5封装成android应用APK文件的几种方法