一个 APK 在进行了小文本编辑后能否重新打包?

11

我正在创建一款软件,将引导用户完成几个步骤,以发布一个安卓应用程序(APK文件)。

我的做法是,APK文件已经编译好了,我只需要替换包中的一个XML文件,就可以改变应用程序的行为。但我现在遇到的大问题是,解压APK文件并进行任何微小的文本编辑之后,再次打包就会破坏签名,并防止该应用程序在任何设备上运行,给出签名不正确的消息。

我该如何解决这个问题呢?我想要安全地打开APK文件,在文本文件中写入内容,然后再关闭它。请注意,此操作将在用户电脑上进行(在他购买我们的应用程序之后),所以我们正在寻找一个没有特殊要求,如JDK的命令行工具。

有什么建议吗?


这是我收到的错误信息:Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]。 - Ayman Abdel-Rahman
那么用户购买了您的应用程序,然后他们必须解压APK文件,进行更改,重新打包,然后安装更新到他们的设备上?真的吗? - Squonk
1
你误解了。对于用户来说,所有这些都是无缝的。用户需要进行一系列的点击,然后程序(在后台)将会更新APK文件。用户只会看到一个大大的“发布”按钮,不知道正在发生什么。 - Ayman Abdel-Rahman
用户将会在GUI中选择一些颜色、图片,拖放一些东西等等。这就是应用程序的实际操作。一旦他点击发布,我将收集他所有的输入并将其放入XML文件中,然后想要将其放入APK文件中。 - Ayman Abdel-Rahman
你不能这样做。只需收集更改并将XML保存到内部或外部存储中。您不能让用户按照您描述的方式重新编写APK。 - Squonk
请注意,APK 文件尚未安装在手机上,仍然存储在桌面电脑上。因此,我正在寻找一种在桌面电脑上完成此操作的方法。我不确定我是否正确地解释了问题。 - Ayman Abdel-Rahman
3个回答

13

好的,我找到了最佳的“测试”解决方案——我在这里发布它是为了节省其他开发人员搜索的时间。唯一的缺点是我需要要求客户在他的机器上安装JDK。原因是我没有找到任何可以纯粹在Windows上工作而不依赖JDK的APK签名工具。

我的安卓应用程序使用Air创建,所以这让我很容易-所有的air文件都被视为资源资产。因此,准备好您的APK存档文件。

一旦您的修改准备就绪,请将它们放入名为“assets”的临时文件夹中。您将使用7-zip命令行工具(免费:http://sourceforge.net/projects/sevenzip/)来更新您的apk内容。为了使其与您的apk配合使用,您需要将apk的扩展名更改为zip-不用担心,您稍后会改回来。

现在,从包含apk文件(zip扩展名)和资产文件夹的位置的.bat文件(或直接在命令提示符中),您将调用:7za u APK-file.zip assets

现在您的apk文件已更新。将其重新命名为.apk扩展名

现在,您将从这里https://code.google.com/p/signapk/使用signAPK工具,并注意,这是唯一需要安装JDK的步骤。它还假定您已准备好密钥文件(替换包中包含的虚拟文件)。提取文件内容并调用:java -jar signapk.jar key.x509.pem key.pk8 [android_app].apk [signed_android_app].apk

最后,您可能会发现签名后的apk文件大小急剧增加。因此,您需要使用android的zipAlign工具:(该死,由于新用户只能发布两个超链接,因此无法发布链接) 您将调用命令:zipAlign -c 4 [signed_android_app].apk

完成!这就是我要走的路线。

如果有人找到一种在不依赖JDK的情况下完成签名过程(假设密钥文件已准备好),请分享。


我为此编写了一个脚本https://github.com/Abdullah2993/APK-Asset-Changer。 - Abdullah Saleem

2

我该怎么解决这个问题?

你不应该直接修改APK文件,因为无论用什么方式修改,都必须重新签名。


1

Android apk文件必须经过签名。该签名证明apk的内容与最初发布的内容相同,没有被修改。(这正是您正在做的事情。)同时,签名也证明了作者的身份。

因此,在一个正常的已签名的apk文件中:

  1. 您知道作者是谁。(即使作为人类您可能无法理解。)
  2. 您知道内容是由作者放置的,并且自那时以来没有被修改。

这是内置在Android中的关键安全措施,有很好的原因,并且不能被克服。它可以防止像病毒这样的东西被嵌入到无辜的apk文件中。


但我发现了一些可以修改您的apk内容的工具 - 但它们需要JDK。 - Ayman Abdel-Rahman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接