我需要修改现有的APK,修改源代码然后重新编译它。
但是现在我想知道如何重新编译java文件并将它们放回到jar文件中! (jar部分应该很简单,主要问题似乎是如何为android重新编译java文件)
我知道另一个解决方案是使用apktool然后修改smali文件,但是当我们想要添加大量代码时,它似乎真的很复杂!
我的应用程序是一个基本的HelloWorld whitout混淆。
答案 0 :(得分:37)
感谢Chris Jester-Young,我设法让它发挥作用!
我认为我设法做到的方式只适用于非常简单的项目:
使用apktool我得到了android清单和资源文件
在Eclipse中,我使用与旧设备相同的设置创建一个新项目(检查清单文件中的所有信息)
/!\确保你从设备中删除了旧的apk,将会抛出错误,说明apk签名与旧签名不同!
答案 1 :(得分:33)
我知道这个问题仍然得到解答,我想传递一个信息,如何从没有dexjar的apk获取源代码。
有an online decompiler for android apks
我不知道这有多可靠。
@darkheir 答案是反编译apk的手动方式。它帮助我们理解Apk创建中的不同阶段。
获得源代码后,请按照接受的答案中提到的步骤进行操作
另一个在线Apk反编译器 @Andrew Rukin :http://www.javadecompilers.com/apk
仍然值得。向创作者致敬。
答案 2 :(得分:8)
首先从以下链接下载dex2jar工具 http://code.google.com/p/dex2jar/downloads/list
提取创建的文件dex2jar
文件夹
现在你选择你的apk文件并在更改扩展名后将其扩展名.apk更改为.zip它似乎是zip文件然后解压缩你找到的classes.dex
文件
现在选择classes.dex文件并将其放入dex2jar
文件夹
现在打开cmd窗口并输入dex2jar
文件夹的路径
现在输入命令dex2jar.bat classes.dex
并按Enter
现在打开找到的dex2jar
文件夹classes_dex2jar.jar
文件
接下来,您可以从以下链接下载java反编译工具 http://java.decompiler.free.fr/?q=jdgui
上一步在java反编译工具中打开文件classes_dex2jar.jar
现在可以看到apk代码
答案 3 :(得分:2)
我知道这个问题已经得到解答,我不想在这里给出更好的答案。我将分享我在这个主题上的经验。
一旦我丢失了代码,我只有apk
文件。我使用下面的工具对它进行了反编译,这让我很高兴。
这些工具必须在这种情况下使用,否则,它是不道德的,甚至有时它是非法的(窃取其他人的努力)。所以请明智地使用它。
这些是我最喜欢的工具:
要从谷歌播放获取apk,你可以谷歌或查看这些网站:
在发布此答案的日期,我测试了所有链接,它对我来说非常适合。
注意: Apk反编译在有代码的情况下无效。因为Proguard缩小并混淆代码并将类重命名为无意义的名称,这使得理解代码变得相当困难。
<强>加成:强>
答案 4 :(得分:1)
dex2jar 将提供所有java源文件,但它们并不完全相同。它们几乎是等效的.class文件(不是100%)。 因此,如果您想更改apk文件的代码:
使用 apktool
apktool 将为每个同名的java文件生成smali(汇编版本的dex)文件。
smali是人类可以理解的,在相关文件中进行更改,
使用相同的 apktool重新编译(apktool b Nw.apk <Folder Containing Modified Files>
)
答案 5 :(得分:0)
答案已经有点过时或不完整。这可能适用于不受保护的apk(无Proguard),但如今没有人部署不受保护的apk。我能够通过apktool修改(我)受良好保护的apk的方式(Proguard,用于检查“黑客工具”的安全性检查,用于检查应用程序是否以调试模式重新包装的安全性检查,...)已经在这里被其他人提及。但是没有人解释,您必须再次对应用程序进行签名。
apktool d app.apk
//generates a folder with smali bytecode files.
//Do something with it.
apktool b [folder name] -o modified.apk
//generates the modified apk.
//and then
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore ~/.android/debug.keystore modified.apk androiddebugkey
//signs the app the the debug key (the password is android)
//this apk can be installed on a device.
在我的测试中,原始发行版apk没有日志记录。使用apktool进行反编译后,我交换了一个完整的字节代码文件,而没有记录一个完整的字节代码文件,重新编译并签名后就可以将其安装在我的设备上了。 之后,当我将应用程序连接到Android Studio时,便能够看到日志。
我认为,仅出于阅读目的,使用dex2jar
和JD-GUI
进行反编译仅有助于更好地理解类的作用。但是,由于一切都受到保护,所以我不确定您是否可以将这个半熟的Java代码重新编译为可正常工作的apk。如果是这样,请告诉我。我认为,唯一的方法是如本例中所述操纵字节码本身。
答案 6 :(得分:-2)
这是一种方式:
使用apktool
解码:
$ apktool d -f {apkfile} -o {output folder}
接下来,使用JADX(在github.com/skylot/jadx)
$ jadx -d {output folder} {apkfile}
2个工具提取和反编译器到同一个输出文件夹。
答案 7 :(得分:-2)
答案 8 :(得分:-3)
使用luckypatcher 并删除您的许可证验证比您没有签署apk。使用WINRAR替换修改后的源代码而不反编译apk。
答案 9 :(得分:-5)
应该将文件扩展名从.apk
更改为.zip
。然后解压缩文件,修改它们,然后将它们压缩到.zip
,并记住将扩展名重命名为.apk
。
为此,我们甚至不必使用任何计算机。我更喜欢ES文件浏览器,它也可以帮助查看和编辑源代码。