安装包反编译查看id
① apktool 反编译系统框架 缺少ID:2 回编译会说缺少apktool.yml 我已经
首先你要在手机内存里找到名为apktool的文件夹,然后长按设为主目录,然后在反编译时一定要注意,反编译的安装包不能包含中文,安装包的路径也不能是包含中文的文件夹
② 濡备綍鍙岖紪璇悭ndroid搴旂敤骞堕吨鏂版墦鍖
涓.鐪媋ndroid镄勬簮浠g爜
銆銆1)灏咥pkd.apk 鐢▃ip瑙e帇钖庯纴鍑虹幇浜嗕竴涓猚lasses.dex鏂囦欢
銆銆2014/02/19 19:42
銆銆.
銆銆2014/02/19 19:42
銆銆..
銆銆2014/02/19 15:35 1,656 AndroidManifest.xml
銆銆2014/02/19 15:35 687,024 classes.dex
銆銆2014/02/19 15:49
銆銆META-INF
銆銆2014/02/19 15:49
銆銆res
銆銆2014/02/19 15:35 2,200 resources.arsc
銆銆2)杩涘叆鍒癫ex2jar鐩褰曚腑锛岃繍琛屾儏鍐靛备笅锛
銆銆D:\developer\tools\test_apk\dex2jar-0.0.9.15>dex2jar.bat "..\Apkd(d2j)\classes.d
銆銆ex"
銆銆this cmd is deprecated, use the d2j-dex2jar if possible
銆銆dex2jar version: translator-0.0.9.15
銆銆dex2jar ..\Apkd(d2j)\classes.dex -> ..\Apkd(d2j)\classes_dex2jar.jar
銆銆Done.
銆銆鍦╝pk镓鍦ㄧ殑鐩褰曚细鍑虹幇 classes_dex2jar.jar 鏂囦欢銆
銆銆3) 鐢↗D-GUI瀵筳ar鍖呰繘琛屾煡鐪嬶纴鍙浠ユ煡鐪嬫簮鏂囦欢
銆銆浜.鍙岖紪璇悭pk
銆銆1.鍦ㄣ涓嬭浇銆APKTOOL涓镄勪笁涓鏂囦欢锛坅apt.exe銆乤pktool.bat銆乤pktool.jar锛夎В铡嬬缉鍒颁綘镄刉indows瀹夎呯洰褰曚笅锛屼互鏂逛究浣跨敤Dos锻戒护.
銆銆2012/12/06 11:44 854,016 aapt.exe
銆銆2014/02/19 17:15 277,372 Apkd.apk銆//绀轰緥鐢ㄣapk鏂囦欢
銆銆2012/12/23 23:39 92 apktool.bat
銆銆2013/02/03 02:37 2,655,843 apktool.jar
銆銆2.杩涘叆鍒瘾pktool.bat镓鍦ㄧ殑鐩褰曪纴杩愯岋细
銆銆apktool d Apkd.apk decode_dir
銆銆鍙岖紪璇戝悗,decode_dir鐩褰曚笅镄勫唴瀹瑰备笅锛
銆銆2014/02/19 17:16 716 AndroidManifest.xml
銆銆2014/02/19 17:16 237 apktool.yml
銆銆2014/02/19 17:18
銆銆build
銆銆2014/02/19 17:16
銆銆res
銆銆2014/02/19 17:16
銆銆smali
銆銆姝ゆ椂鎴戝彲浠ユ煡鐪嫔师鏂囦欢AndroidManifest.xml浜嗭纴涔熸槸镆ョ湅smali婧愭枃浠讹纸鏄鐢╯mali璇瑷鍐欑殑锛屽彲浠ュ圭収java鐪嬶级銆
銆銆涓.APKTOOL镄勪娇鐢
銆銆1).decode
銆銆璇ュ懡浠ょ敤浜庤繘琛屽弽缂栬疟apk鏂囦欢锛屼竴鑸鐢ㄦ硶涓
銆銆apktool d
銆銆浠h〃浜呜佸弽缂栬疟镄刟pk鏂囦欢镄勮矾寰勶纴链濂藉啓缁濆硅矾寰勶纴姣斿侰:\MusicPlayer.apk
銆銆浠h〃浜嗗弽缂栬疟钖庣殑鏂囦欢镄勫瓨鍌ㄤ綅缃锛屾瘆濡侰:\MusicPlayer
銆銆濡傛灉浣犵粰瀹氱殑宸茬粡瀛桦湪锛岄偅涔堣緭鍏ュ畬璇ュ懡浠ゅ悗浼氭彁绀轰綘锛屽苟涓旀棤娉曟墽琛岋纴闇瑕佷綘閲嶆柊淇鏀瑰懡浠ゅ姞鍏-f鎸囦护
銆銆apktool d 钬揻
銆銆杩欐牱灏变细寮鸿岃嗙洊宸茬粡瀛桦湪镄勬枃浠
銆銆2).build
銆銆璇ュ懡浠ょ敤浜庣紪璇戜慨鏀瑰ソ镄勬枃浠讹纴涓鑸鐢ㄦ硶涓
銆銆apktool b
銆銆杩欓噷镄
銆銆灏辨槸鍒氭墠浣犲弽缂栬疟镞惰緭鍏ョ殑
銆銆锛埚侰:\MusicPlayer锛,杈揿叆杩栾屽懡浠ゅ悗锛屽傛灉涓鍒囨e父锛屼綘浼氩彂鐜癈:\MusicPlayer鍐呭氢简2涓鏂囦欢澶筨uild鍜宒ist锛屽叾涓鍒嗗埆瀛桦偍镌缂栬疟杩囩▼涓阃愪釜缂栬疟镄勬枃浠朵互鍙婃渶缁堟墦鍖呯殑apk鏂囦欢銆
銆銆3).install-framework
銆銆璇ュ懡浠ょ敤浜庝负APKTool瀹夎呯壒瀹氱殑framework-res.apk鏂囦欢锛屼互鏂逛究杩涜屽弽缂栬疟涓浜涗笌ROM鐩镐簰渚濊禆镄𪞝PK鏂囦欢銆傚叿浣撴儏鍐佃风湅甯歌侀梾棰
銆銆锲.smali涓巎ava婧愮爜瀵圭収锛屽苟锅氩嚭鐩稿簲镄勪慨鏀
銆銆java婧愪唬镰侊细
銆銆import android.os.Bundle;
銆銆import android.app.Activity;
銆銆import android.view.Menu;
銆銆import android.widget.*;
銆銆public class MainActivity extends Activity {
銆銆@Override
銆銆protected void onCreate(Bundle savedInstanceState) {
銆銆super.onCreate(savedInstanceState);
銆銆setContentView(R.layout.activity_main);
銆銆TextView a = (TextView)this.findViewById(R.id.test) ;
銆銆a.setText("raoliang");
銆銆}
銆銆@Override
銆銆public boolean onCreateOptionsMenu(Menu menu) {
銆銆// Inflate the menu; this adds items to the action bar if it is present.
銆銆getMenuInflater().inflate(R.menu.main, menu);
銆銆return true;
銆銆}
銆銆}
銆銆瀵瑰簲镄剆mali婧愪唬镰侊细
銆銆.class public Lali/text/apkd/MainActivity;
銆銆.super Landroid/app/Activity;
銆銆.source "MainActivity.java"
銆銆# direct methods
銆銆.method public constructor ()V
銆銆.locals 0
銆銆.prologue
銆銆.line 8
銆銆invoke-direct {p0}, Landroid/app/Activity;->()V
銆銆return-void
銆銆.end method
銆銆# virtual methods
銆銆.method protected onCreate(Landroid/os/Bundle;)V
銆銆.locals 2
銆銆.parameter "savedInstanceState"
銆銆.prologue
銆銆.line 12
銆銆invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V
銆銆.line 13
銆銆const/high16 v1, 0x7f03
銆銆invoke-virtual {p0, v1}, Lali/text/apkd/MainActivity;->setContentView(I)V
銆銆.line 14
銆銆const/high16 v1, 0x7f08
銆銆invoke-virtual {p0, v1}, Lali/text/apkd/MainActivity;->findViewById(I)Landroid/view/View;
銆銆move-result-object v0
銆銆check-cast v0, Landroid/widget/TextView;
銆銆.line 15
銆銆.local v0, a:Landroid/widget/TextView;
銆銆const-string v1, "raoliang"
銆銆invoke-virtual {v0, v1}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
銆銆.line 16
銆銆return-void
銆銆.end method
銆銆.method public onCreateOptionsMenu(Landroid/view/Menu;)Z
銆銆.locals 2
銆銆.parameter "menu"
銆銆.prologue
銆銆.line 21
銆銆invoke-virtual {p0}, Lali/text/apkd/MainActivity;->getMenuInflater()Landroid/view/MenuInflater;
銆銆move-result-object v0
銆銆const/high16 v1, 0x7f07
銆銆invoke-virtual {v0, v1, p1}, Landroid/view/MenuInflater;->inflate(ILandroid/view/Menu;)V
銆銆.line 22
銆銆const/4 v0, 0x1
銆銆return v0
銆銆.end method
銆銆阃氲繃瀵规瘆鍙浠ョ湅鍒帮纴甯搁噺鏄娌℃湁蹇呭彉镄勶纴鍙浠ユ牴鎹镄剆mali镄勮娉曪纴杩涜岀浉搴旂殑淇鏀
銆銆浜.3銆佹墦鍖呫佺惧悕鍜屽畨瑁呬慨鏀瑰悗镄刟pk
銆銆淇鏀瑰畬浜嗭纴灏卞彲浠ユ墦鍖呭洖apk浜嗐傛墽琛屼互涓嫔懡浠わ细
銆銆apktool b decode_dir
銆銆鍦╩ygame鐩褰曚笅镄刣ist鍦ㄤ细鐪嫔埌镓揿寘濂界殑apk銆
銆銆褰撶劧锛岀幇鍦ㄤ竴鑸鏄镞犳硶瀹夎呯殑锛屽洜涓篴pk杩樻病链夌惧悕銆备笅闱㈠氨𨱒ョ惧悕銆傜惧悕闇瑕乲eystore鏂囦欢锛屾垜宸茬粡链変笓鐢ㄧ殑keystore浜嗭纴濡傛灉杩樻病链夛纴璇峰弬阒呰繖閲岃繘琛岀敓鎴愩
銆銆镓ц屼互涓嫔懡浠や负閲嶆柊缂栬疟镄刴y_game.apk绛惧悕锛
銆銆jarsigner -verbose -keystore demo.keystore Apkd.apk demo.keystore
銆銆链钖庯纴鍦ㄥ畨瑁呭埌镓嬫満鍓嶏纴闇瑕佹妸镓嬫満涓镄勫凡链夌増链鍏埚嵏杞斤纴锲犱负濡傛灉绛惧悕涓嶅悓锛屾槸涓嶈兘瑕嗙洊瀹夎呯殑锛屼细鎻愮ず钬滃簲鐢ㄧ▼搴忔湭瀹夎呪濋敊璇銆
銆銆瀹屾暣镄勮繍琛屾儏鍐靛备笅锛
銆銆D:\developer\tools\test_apk\new\decode\dist>keytool -genkey -alias demo.keystore -keyalg RSA -validity 40000 -keystore demo.keystore
銆銆杈揿叆keystore瀵嗙爜锛
銆銆鍐嶆¤緭鍏ユ柊瀵嗙爜:
銆銆鎭ㄧ殑钖嶅瓧涓庡撴皬鏄浠涔堬纻
銆銆[Unknown]锛 rao
銆銆鎭ㄧ殑缁勭粐鍗曚綅钖岖О鏄浠涔堬纻
銆銆[Unknown]锛 rao
銆銆鎭ㄧ殑缁勭粐钖岖О鏄浠涔堬纻
銆銆[Unknown]锛
銆銆鎭ㄦ墍鍦ㄧ殑锘庡竞鎴栧尯锘熷悕绉版槸浠涔堬纻
銆銆[Unknown]锛
銆銆鎭ㄦ墍鍦ㄧ殑宸炴垨鐪佷唤钖岖О鏄浠涔堬纻
銆銆[Unknown]锛
銆銆璇ュ崟浣岖殑涓ゅ瓧姣嶅浗瀹朵唬镰佹槸浠涔
銆銆[Unknown]锛
銆銆CN=rao, OU=rao, O=Unknown, L=Unknown, ST=Unknown, C=Unknown 姝g‘钖楋纻
銆銆[钖]锛 y
銆銆杈揿叆镄勪富瀵嗙爜
銆銆锛埚傛灉鍜 keystore 瀵嗙爜鐩稿悓锛屾寜锲炶溅锛夛细
銆銆D:\developer\tools\test_apk\new\decode\dist>jarsigner -verbose -keystore demo.keystore Apkd.apk demo.keystore
銆銆杈揿叆瀵嗛挜搴撶殑鍙d护鐭璇锛
銆銆姝e湪娣诲姞锛 META-INF/MANIFEST.MF
銆銆姝e湪娣诲姞锛 META-INF/DEMO_KEY.SF
銆銆姝e湪娣诲姞锛 META-INF/DEMO_KEY.RSA
銆銆姝e湪绛惧悕锛 res/drawable-hdpi/ic_launcher.png
銆銆姝e湪绛惧悕锛 res/drawable-mdpi/ic_launcher.png
銆銆姝e湪绛惧悕锛 res/drawable-xhdpi/ic_launcher.png
銆銆姝e湪绛惧悕锛 res/drawable-xxhdpi/ic_launcher.png
銆銆姝e湪绛惧悕锛 res/layout/activity_main.xml
銆銆姝e湪绛惧悕锛 res/menu/main.xml
銆銆姝e湪绛惧悕锛 AndroidManifest.xml
銆銆姝e湪绛惧悕锛 classes.dex
銆銆姝e湪绛惧悕锛 resources.arsc
銆銆D:\developer\tools\test_apk\new\decode\dist>
銆銆鍒版や负姝锛屼慨鏀瑰悗镄刟pk鍙浠ユe父镄勫畨瑁呬简锛屼笉杩囷纴鍦ㄥ畨瑁呬箣鍓嶏纴蹇呴’瑕佸厛鍗歌浇浠ュ墠镄刟pk锛屼笉鑳界洿鎺ユ浛鎹锛埚洜涓虹惧悕涓崭竴镙凤级
③ 如何反编译android应用以及重编译,签名和对齐优化
首先,了解一下我们为什么需要反编译apk
大部分情况下,是由于想本地化一款优秀的应用,才需要做这事儿;又或者进行少量的smali修改以达到想要的效果(如添加归属地,使3G版Nexus 7支持Wi-Fi热点)。
下面我们先准备运行环境和工具
建立工作目录,如.\workspace\apktoolbox (下面同样以此路径为例)
必不可少的JDK:Oracle Java下载,安装完成后把<jdk-inst-path>\bin添加到$PATH环境变量中
反编译和重编译工具apktool:Google Code下载,按平台下载(一个apktool-install-<platform>-<ver>-tar.bz2,一个apktool<ver>.tar.bz2,下载完成后解压至.\workspace\apktoolbox\bin
密钥文件,共4组。test/shared/media/platform,从android source中获取,分别对应不同共享用户ID时签名所需(查看应用AndroidManifest.xml第二行android:sharedUserId项 ),放到.\workspace\apktoolbox\bin下
test - 无android:sharedUserId项
shared - android:sharedUserId=android.uid.shared
media - android:sharedUserId=android.uid.media
platform - android:sharedUserId=android.uid.system
签名工具signapk.jar,放到.\workspace\apktoolbox\bin下
对齐优化工具zipalign(从android sdk中获取,在tools目录下),放到.\workspace\apktoolbox\bin下
准备工作完成
接下来我们就要开始工作了(以本地化工作为例)
把待反编译的apk放到.\workspace\apktoolbox\apks下
在命令行模式下进入.\workspace\apktoolbox\bin目录,输入以下命令进行解包(反编译)
apktool d ..\apks\<apkfile>.apk ..\apks\<outdir>
.\workspace\apktoolbox\apks\<outdir>\res下的values目录(英文原版)和values-r<locale>目录(本地化)就是我们需要的对象。
本地化工作完成后,在命令行中输入以下命令进行重新打包(重新编译)
apktool b ..\apks\<outdir>
.\workspace\apktoolbox\apks\<outdir>\dist目录下会生成重新打包后的apk(未签名,未对齐优化)
重新打包完成后,在命令行中输入以下命令进行签名(根据实际情况选用密钥,这里以test密钥为例)
java -jar signapk.jar testkey.x509.pem testkey.pk8 ..\apks\<outdir>\dist\<apkfile>.apk ..\apks\<apkfile>_signed.apk
签名完成后,在命令行中输入以下命令进行对齐优化
zipalign -f -v 4 ..\apks\<apkfile>_signed.apk ..\apks\<apkfile>_zipaligned.apk
<apkfile>_zipaligned.apk就是我们最终需要的apk了。
完成
部分apk需要系统框架资源,没有的话在重新打包时会报错,这种情况下我们只需要先安装一下对应系统框架即可(从你目标ROM中把/system/framework/framework-res.apk提取出,放到.\workspace\apktoolbox\apks下)。在命令行中输入以下命令进行安装
apktool if ..\apks\framework-res.apk
④ apk反编译工具Apktool的安装与使用教程
APKTool是GOOGLE提供的APK编译工具,需要JAVA运行环境,推荐使用JDK1.6或者JDK1.7。 下面就一起来看看详情了解一下该怎么安装使用吧软件名称:apktool(apk反编译工具) v1.41 中文绿色免费版软件大小:3.32MB更新时间:2014-01-04
如果你想对APK文件进行修改,那么就不可避免的要使用到APKTool。论坛里有很多关于ROM美化的帖子都需要自己动手修改APK文件,比如修改framework-res.apk、systemUI.apk等等。
相信各位有不少人看了后都想亲自来修改一番,但是结果却是遇到了各式各样的错误却无法进行改正,甚至都不知道自己错在哪里。
一.APKTOOL使用环境配置
1.安装JAVA并设置环境变量。
下载安装都很简单,关键是安装完后还需要亲自设置环境变量以方便其他程序能够条用JAVA。
以WIN7为例,在桌面上右键点击计算机——>属性——>高级系统设置——>环境变量——>在下边的系统变量里新建一个变量,变量名为JAVA_HOME,值为JAVA的安装路径,比如我的是H:\ProgramFiles\Java\jdk1.6.0_26
二.APKTool的安装
1.其实这个谈不上安装,不过如果你愿意的话可以把下载到的APKTOOL中的三个文件(aapt.exe、apktool.bat、apktool.jar)解压缩到你的Windows安装目录下,以方便使用Dos命令.
2.可能有些人下载的APKTOOL里有个安装的bat文件,并且有另外两个方便使用的bat文件,在这里我不推荐大家使用这些bat文件,虽然使用起来很方便(其实我并不觉得方便),但是如果出现错误不方便查看。
三.APKTool的使用
1.decode
该命令用于进行反编译apk文件,一般用法为
apktool d
代表了要反编译的apk文件的路径,最好写绝对路径,比如C:\MusicPlayer.apk
代表了反编译后的文件的存储位置,比如C:\MusicPlayer
如果你给定的已经存在,那么输入完该命令后会提示你,并且无法执行,需要你重新修改命令加入-f指令
apktool d –f
这样就会强行覆盖已经存在的文件
2.build
该命令用于编译修改好的文件,一般用法为
apktool b
这里的就是刚才你反编译时输入的(如C:\MusicPlayer),输入这行命令后,如果一切正常,你会发现C:\MusicPlayer内多了2个文件夹build和dist,其中分别存储着编译过程中逐个编译的文件以及最终打包的apk文件。
3.install-framework
该命令用于为APKTool安装特定的framework-res.apk文件,以方便进行反编译一些与ROM相互依赖的APK文件。具体情况请看常见问题
四.常见问题
1.关于安装和管理framework文件
以下大部分其实是翻译自http://code.google.com/p/android-apktool/wiki/FrameworkFiles
一般来说,你在使用apktool进行反编译前不需要做其他的事情,然而由于有的厂商,如HTC,三星等,他们定制了framework文件并且在他们的系统应用中使用了这些文件,这时,为了能正常的反编译这些apk文件,你就必须从你的设备中拷贝出framework文件并且安装到apktool中。
举一个例子,比如你想反编译HTCHero这款手机中的HtcContacts.apk,当你尝试反编译的时候,你会得到以下错误信息。
1.$ apktool d HtcContacts.apk
2.I: Loading resource table...
3.I: Decoding resources...
4.I: Loading resource table from file: /home/brutall/apktool/framework/1.apk
5.W: Could not decode attr value, using undecoded value instead: ns=android, name=drawable, value=0x02020542
6....
7.W: Could not decode attr value, using undecoded value instead: ns=android, name=icon, value=0x02020520
8.Can't find framework resources for package of id: 2. You must install proper framework files, see project website for more info.
复制代码
这就是在通知你必须先安装HTC定制的framework文件,事实上在修改一些三星的系统应用时也是如此。
以三星的设备来举例,你需要复制两个framework文件来进行安装,framework-res.apk和tzframework-res.apk,一般来说,这两个文件在手机中的位置应该是system\framework\
使用以下代码进行安装
apktool if C:\framework-res.apk
apktool if C:\tzframework-res.apk
这里假设2个文件都放在C盘根目录
2.直接用build编译后在dist中找到的apk文件无法使用
其实这个问题我也不是特别理解,目前知道的就是,APK文件虽然本质是个zip文件,但是事实上zip包中的文件是按照两种方式压缩的,即XML文件进行deflate压缩,其他文件不进行压缩(使用store存储),而直接编译得到的APK文件对任何的文件都进行了deflate压缩,因此你会发现编译得到的文件比原文件小好多。
同样的,当你使用build文件夹中的文件替换原apk文件中的资源时,请务必确认是使用store存储还是deflate压缩
3.其他错误
其实在编译过程中会遇到很多其他的问题,大多数是由于删除、修改、添加了资源后,没有对应的修改res\values\public.xml文件而造成的,这里我给大家说下修改的原则:
第一,public.xml文件中的资源不能重复定义。
第二,public.xml文件中的任意两个资源的ID不能一样
第三,public.xml文件中定义的资源必须能找到该文件(如果你删除了一些文件,必须要对应的删除public.xml中的该行)
第四,public.xml文件中尽可能全面(如果你添加了某资源,最好确保在public.xml中也添加)
第五,public.xml文件中的资源的ID尽可能连续(当你为添加的文件添加声明时,赋予的ID尽可能是连续的)