Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中以编程方式编辑apk文件_Java_Android_Zip_Apk_Zipfile - Fatal编程技术网

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

在java中以编程方式编辑apk文件,java,android,zip,apk,zipfile,Java,Android,Zip,Apk,Zipfile,这个问题有点复杂,请耐心听我说: 我有一个apk文件,我正试图在安装后以编程方式修改它。我正在用另一个应用程序编辑它。我第一次尝试使用内置的java类来进行zip文件管理,但当我尝试完全复制除要修改的文件之外的所有文件并更改要修改的文件时,应用程序将不再运行。我假设这是因为签名或其他原因,但当我对winRAR执行相同的操作时,解压缩所有文件,创建新的zip存档,使用正常压缩将所有文件复制到新的zip存档中,并将新的apk ssh到我的/data/app文件夹中,效果很好。我的问题是为什么会发生这

这个问题有点复杂,请耐心听我说: 我有一个apk文件,我正试图在安装后以编程方式修改它。我正在用另一个应用程序编辑它。我第一次尝试使用内置的java类来进行zip文件管理,但当我尝试完全复制除要修改的文件之外的所有文件并更改要修改的文件时,应用程序将不再运行。我假设这是因为签名或其他原因,但当我对winRAR执行相同的操作时,解压缩所有文件,创建新的zip存档,使用正常压缩将所有文件复制到新的zip存档中,并将新的apk ssh到我的/data/app文件夹中,效果很好。我的问题是为什么会发生这种情况。我认为这可能与zip头或类似的东西有关。有人有什么想法吗

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中打开输出,除了我更改的资产文件外,它似乎是相同的。

您应该知道的唯一一件事是,works signing apk tool如何处理校验和-它们是zip条目。目标文件夹是带有CERT.RSA的META-INF-有当前编码的校验和,还有debug info、CERT.SF和MANIFEST.MF-有SHA1 Digest-Base64编码的哈希,它们很容易被自己检测到。 但这是一个真正的黑客!这段代码非常有用,许多聪明的程序员都可以使用它来为ex动态更改应用程序的图片。如果您愿意这样写的话,这段代码可能会很危险,因为您的apk文件可能会增加到GB大小


这个技巧不应该在全世界的comunity人之间传播,我认为-它将被保存在程序员的短圈子中。

你应该知道的唯一一件事是如何使用apk工具处理校验和-它们是zip条目。目标文件夹是带有CERT.RSA的META-INF-有当前编码的校验和,还有debug info、CERT.SF和MANIFEST.MF-有SHA1 Digest-Base64编码的哈希,它们很容易被自己检测到。 但这是一个真正的黑客!这段代码非常有用,许多聪明的程序员都可以使用它来为ex动态更改应用程序的图片。如果您愿意这样写的话,这段代码可能会很危险,因为您的apk文件可能会增加到GB大小


这个把戏不应该在全世界的comunity人之间传播,我认为-它将在程序员的短圈子内保持。

说出这样做的任何合法理由。@Commonware,因为我想用我自己的一些自定义图像替换游戏中的一些图像。也因为我还在学习android开发,我认为这将是一个很好的实验,可以帮助我了解android。还有,为什么不呢?你是如何从你的应用程序中获取其他apk的?似乎你可以为apk做这件事,只要你在做一个副本。。。这就是你在代码中所做的吗?@JRaymond是的,我试图复制原始apk,但在资产文件夹中更改了一个图像文件。它似乎可以工作,但由于某些原因,它总是会使apon启动程序崩溃。我认为它不会工作,因为您还需要在运行时对APK文件进行签名。如果修改它,哈希检查将失败…请说出执行此操作的合法原因。@commonware,因为我想用我自己的自定义图像替换游戏中的一些图像。也因为我还在学习android开发,我认为这将是一个很好的实验,可以帮助我了解android。还有,为什么不呢?你是如何从你的应用程序中获取其他apk的?似乎你可以为apk做这件事,只要你在做一个副本。。。这就是你在代码中所做的吗?@JRaymond是的,我试图复制原始apk,但在资产文件夹中更改了一个图像文件。它似乎可以工作,但由于某些原因,它总是会使apon启动程序崩溃。我认为它不会工作,因为您还需要在运行时对APK文件进行签名。如果修改它,哈希检查将失败。。。