apk反编译详解

文章背景

开发或学习Android的时候,往往会涉反编译来借鉴别人的java文件和布局等资源文件。
假如不小心把自己的源码弄丢了,也要经过反编译安卓在自己手机上的apk来找回源码。

文章目标

反编译工具分享

反编译经验分享

工具下载地址
http://download.csdn.net/download/xinanheishao/9888288

官方最新版本下载地址
apktool: (要翻墙)https://code.google.com/p/android-apktool/downloads/list
(不用翻墙)https://bitbucket.org/iBotPeaches/apktool/downloads/

dex2jar: http://code.google.com/p/dex2jar/downloads/list

jd-gui: http://code.google.com/p/innlab/downloads/list

工具介绍

apktool
作用:资源文件获取,可以提取出图片文件和布局文件进行使用查看
dex2jar
作用:将apk反编译成Java源码(classes.dex转化成jar文件)
jd-gui
作用:查看APK中classes.dex转化成出的jar文件,即源码文件

反编译详细步骤(app-debug.apk为例)

1、下载工具,并将其一一解压,的到一下文件,如图所示

apk0

2、配置apktool环境变量,注意观察我的apktool在磁盘上的路径

apk1

3、配置dex2jar环境变量,注意观察我的dex2jar在磁盘上的路径

apk2

4、使用dex2jar反编译java文件

a、新建一个文件夹,把要编译的apk文件放入其中
apk4

b、将要反编译的APK后缀名改为.rar或则 .zip,并解压,得到其中的额classes.dex文件(它就是java文件编译再通过dx工具打包而成的)

apk5

c、将获取到的classes.dex放到之前解压出来的工具dex2jar-0.0.9.15 文件夹内

apk6

d、在命令行下定位到dex2jar.bat所在目录

apk7

f、使用dex2jar.bat 提取 classes.dex文件,经过命令执行得到classes_dex2jar.jar文件

apk8

g、使用jd-gui查看反编译的代码

apk9

5、使用apktool反编译布局,图片等资源文件

a、在与apktool同目录下新建test空文件夹,用来存放反编译出来的资源文件

b、在命令行下定位到apktool所在目录

apk10

b、输入apktool d -f apkPath -o folderPath 命令
apkPath: apk所在目录
folderPath: 反编译后存放资源文件目录

apk11

常见问题
一、
1.Input file was not found or was not readable.
2.Destination directory (C:\Users\user\a) already exists. Use -f switch if you want to overwrite it.
3.Exception in thread “main” brut.androlib.AndrolibException: Could not decode ars c fil……….

解决方案:
1和2是因为apktool升级到2.0以上时,使用方式已经替换,格式为:apktool d [-s] -f -o ,参数具体的意思可以直接打apktool回车(windows)查看帮助
3是因为apktool版本过低导致,请升级到最新版本,地址:https://bitbucket.org/iBotPeaches/apktool/downloads

二、
I: Baksmaling…

I: Loading resource table…
Exception in thread “main” brut.androlib.AndrolibException: Could not decode ars
c file
at brut.androlib.res.decoder.ARSCDecoder.decode(ARSCDecoder.java:56)
at brut.androlib.res.AndrolibResources.getResPackagesFromApk(AndrolibRes
ources.java:491)
at brut.androlib.res.AndrolibResources.loadMainPkg(AndrolibResources.jav
a:74)
at brut.androlib.res.AndrolibResources.getResTable(AndrolibResources.jav
a:66)
at brut.androlib.Androlib.getResTable(Androlib.java:50)
at brut.androlib.ApkDecoder.getResTable(ApkDecoder.java:189)
at brut.androlib.ApkDecoder.decode(ApkDecoder.java:114)
at brut.apktool.Main.cmdDecode(Main.java:146)
at brut.apktool.Main.main(Main.java:77)
Caused by: java.io.IOException: Expected: 0x001c0001, got: 0x00000000
at brut.util.ExtDataInput.skipCheckInt(ExtDataInput.java:48)
at brut.androlib.res.decoder.StringBlock.read(StringBlock.java:44)
at brut.androlib.res.decoder.ARSCDecoder.readPackage(ARSCDecoder.java:10
2)
at brut.androlib.res.decoder.ARSCDecoder.readTable(ARSCDecoder.java:83)
at brut.androlib.res.decoder.ARSCDecoder.decode(ARSCDecoder.java:49)
… 8 more

产生原因:apktool.jar的版本太低,如果使用高版本不会出现异常

解决方案:

1.登陆http://code.google.com/p/android-apktool/wiki/DownloadInstructions?tm=2下载最新版本的apktool.jar,目前最新版本为2.0.0 RC4

如遇网络问题,可以直接从我博客上下载 点击下载

2.将下载到的apktool_2.0.0rc4.jar文件改名为apktool.jar,然后替换掉老版本的apktool.jar

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值