這個工具是個開源項目,地址是:
http://code.google.com/p/android-apktool/
我的是Ubuntu平台,下載apktool-install-linux-r04-brut1.tar.bz2和apktool1.4.1.tar.bz2兩個檔案,然後解壓得到apktool.jar,aapt(二進位可執行檔),apktool(SHELL檔案)三個檔案,把這三個檔案複製到/usr/local/bin目錄下(需要有ROOT許可權)。
確保系統的java命令是Java1.6版本的。
這樣就可以在系統中使用apktool命令了。
執行:
apktool
可以得到協助資訊。
反編譯Crasher.apk:
apktool Crasher.apk
反編譯後在目前的目錄下得到Crasher檔案夾。
補充於2011.7.26
前面的方法反編譯出來的代碼可讀性很差,比如下面就是反編譯出來的一個java方法:
.method public restartGL(Landroid/view/SurfaceHolder;)Ljavax/microedition/khronos/opengles/GL; .locals 1 invoke-direct {p0}, Lcom/ideaworks3d/airplay/AirplayGL;->stop()V iget v0, p0, Lcom/ideaworks3d/airplay/AirplayGL;->m_GLVersion:I invoke-virtual {p0, p1, v0}, Lcom/ideaworks3d/airplay/AirplayGL;->startGL(Landroid/view/SurfaceHolder;I)Ljavax/microedition/khronos/opengles/GL; move-result-object v0 return-object v0.end method
要看懂真不容易,網上也有用baksmali.jar的,其實apktool就是封裝了一下baksmali.jar,兩者是同一個東西。可以參考一下這篇文檔:
Android 逆向apk程式(AndroidManifest.xml和class.dex)的心得
http://blog.csdn.net/Zengyangtech/article/details/5807517
真正好使的還是下面這種方法:
先使用dex2jar把apk檔案轉化成jar,再使用jd-gui把jar轉化成.java。這兩個工具都是開源項目,分別有windows版本和Linux版本。
http://code.google.com/p/dex2jar/
http://java.decompiler.free.fr/?q=jdgui
具體使用方法很簡單,不用任何設定。可以參考文檔:Android 反編譯apk 到java源碼的方法
http://blog.csdn.net/Zengyangtech/article/details/5967263
這個是反編譯後的效果
private void stop() { this.m_Started = 0; if (this.m_EglSurface == null) return; EGL10 localEGL101 = this.m_Egl; EGLDisplay localEGLDisplay1 = this.m_EglDisplay; EGLSurface localEGLSurface1 = EGL10.EGL_NO_SURFACE; EGLSurface localEGLSurface2 = EGL10.EGL_NO_SURFACE; EGLContext localEGLContext = EGL10.EGL_NO_CONTEXT; boolean bool1 = localEGL101.eglMakeCurrent(localEGLDisplay1, localEGLSurface1, localEGLSurface2, localEGLContext); EGL10 localEGL102 = this.m_Egl; EGLDisplay localEGLDisplay2 = this.m_EglDisplay; EGLSurface localEGLSurface3 = this.m_EglSurface; boolean bool2 = localEGL102.eglDestroySurface(localEGLDisplay2, localEGLSurface3); this.m_EglSurface = null; }