一看android的源代码1)将Apkdapk 用zip解压后,出现了一个classesdex文件2014/02/19 19:422014/02/19 19:422014/02/19 15:35 1,656 AndroidManifestxml2014/02/19 15:35 687,024 classesdex2014/02/19 15:49META-INF2014/02/19 15:49res2014/02/19 15:35 2,200 resourcesarsc2)进入到dex2jar目录中,运行情况如下:D:\developer\tools\test_apk\dex2jar-00915>dex2jarbat "\Apkd(d2j)\classesdex"this cmd is deprecated, use the d2j-dex2jar if possibledex2jar version: translator-00915dex2jar \Apkd(d2j)\classesdex -> \Apkd(d2j)\classes_dex2jarjarDone在apk所在的目录会出现 classes_dex2jarjar 文件。3) 用JD-GUI对jar包进行查看,可以查看源文件二反编译apk1在 下载 APKTOOL中的三个文件(aaptexe、apktoolbat、apktooljar)解压缩到你的Windows安装目录下,以方便使用Dos命令2012/12/06 11:44 854,016 aaptexe2014/02/19 17:15 277,372 Apkdapk //示例用 apk文件2012/12/23 23:39 92 apktoolbat2013/02/03 02:37 2,655,843 apktooljar2进入到apktoolbat所在的目录,运行:apktool d Apkdapk decode_dir反编译后,decode_dir目录下的内容如下:2014/02/19 17:16 716 AndroidManifestxml2014/02/19 17:16 237 apktoolyml2014/02/19 17:18build2014/02/19 17:16res2014/02/19 17:16smali此时我可以查看原文件AndroidManifestxml了,也是查看smali源文件(是用smali语言写的,可以对照java看)。三APKTOOL的使用1)decode该命令用于进行反编译apk文件,一般用法为apktool d代表了要反编译的apk文件的路径,最好写绝对路径,比如C:\MusicPlayerapk代表了反编译后的文件的存储位置,比如C:\MusicPlayer如果你给定的已经存在,那么输入完该命令后会提示你,并且无法执行,需要你重新修改命令加入-f指令apktool d –f这样就会强行覆盖已经存在的文件2)build该命令用于编译修改好的文件,一般用法为apktool b这里的就是刚才你反编译时输入的(如C:\MusicPlayer),输入这行命令后,如果一切正常,你会发现C:\MusicPlayer内多了2个文件夹build和dist,其中分别存储着编译过程中逐个编译的文件以及最终打包的apk文件。3)install-framework该命令用于为APKTool安装特定的framework-resapk文件,以方便进行反编译一些与ROM相互依赖的APK文件。具体情况请看常见问题四smali与java源码对照,并做出相应的修改java源代码:import androidosBundle;import androidappActivity;import androidviewMenu;import androidwidget;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {superonCreate(savedInstanceState);setContentView(Rlayoutactivity_main);TextView a = (TextView)thisfindViewById(Ridtest) ;asetText("raoliang");}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is presentgetMenuInflater()inflate(Rmenumain, menu);return true;}}对应的smali源代码:class public Lali/text/apkd/MainActivity;super Landroid/app/Activity;source "MainActivityjava"# direct methodsmethod public constructor ()Vlocals 0prologueline 8invoke-direct {p0}, Landroid/app/Activity;->()Vreturn-voidend method# virtual methodsmethod protected onCreate(Landroid/os/Bundle;)Vlocals 2parameter "savedInstanceState"prologueline 12invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)Vline 13const/high16 v1, 0x7f03invoke-virtual {p0, v1}, Lali/text/apkd/MainActivity;->setContentView(I)Vline 14const/high16 v1, 0x7f08invoke-virtual {p0, v1}, Lali/text/apkd/MainActivity;->findViewById(I)Landroid/view/View;move-result-object v0check-cast v0, Landroid/widget/TextView;line 15local v0, a:Landroid/widget/TextView;const-string v1, "raoliang"invoke-virtual {v0, v1}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)Vline 16return-voidend methodmethod public onCreateOptionsMenu(Landroid/view/Menu;)Zlocals 2parameter "menu"prologueline 21invoke-virtual {p0}, Lali/text/apkd/MainActivity;->getMenuInflater()Landroid/view/MenuInflater;move-result-object v0const/high16 v1, 0x7f07invoke-virtual {v0, v1, p1}, Landroid/view/MenuInflater;->inflate(ILandroid/view/Menu;)Vline 22const/4 v0, 0x1return v0end method通过对比可以看到,常量是没有必变的,可以根据的smali的语法,进行相应的修改五3、打包、签名和安装修改后的apk修改完了,就可以打包回apk了。执行以下命令:apktool b decode_dir在mygame目录下的dist在会看到打包好的apk。当然,现在一般是无法安装的,因为apk还没有签名。下面就来签名。签名需要keystore文件,我已经有专用的keystore了,如果还没有,请参阅这里进行生成。执行以下命令为重新编译的my_gameapk签名:jarsigner -verbose -keystore demokeystore Apkdapk demokeystore最后,在安装到手机前,需要把手机中的已有版本先卸载,因为如果签名不同,是不能覆盖安装的,会提示“应用程序未安装”错误。完整的运行情况如下:D:\developer\tools\test_apk\new\decode\dist>keytool -genkey -alias demokeystore -keyalg RSA -validity 40000 -keystore demokeystore输入keystore密码:再次输入新密码:您的名字与姓氏是什么?[Unknown]: rao您的组织单位名称是什么?[Unknown]: rao您的组织名称是什么?[Unknown]:您所在的城市或区域名称是什么?[Unknown]:您所在的州或省份名称是什么?[Unknown]:该单位的两字母国家代码是什么[Unknown]:CN=rao, OU=rao, O=Unknown, L=Unknown, ST=Unknown, C=Unknown 正确吗?[否]: y输入的主密码(如果和 keystore 密码相同,按回车):D:\developer\tools\test_apk\new\decode\dist>jarsigner -verbose -keystore demokeystore Apkdapk demokeystore输入密钥库的口令短语:正在添加: META-INF/MANIFESTMF正在添加: META-INF/DEMO_KEYSF正在添加: META-INF/DEMO_KEYRSA正在签名: res/drawable-hdpi/ic_launcherpng正在签名: res/drawable-mdpi/ic_launcherpng正在签名: res/drawable-xhdpi/ic_launcherpng正在签名: res/drawable-xxhdpi/ic_launcherpng正在签名: res/layout/activity_mainxml正在签名: res/menu/mainxml正在签名: AndroidManifestxml正在签名: classesdex正在签名: resourcesarscD:\developer\tools\test_apk\new\decode\dist>到此为止,修改后的apk可以正常的安装了,不过,在安装之前,必须要先卸载以前的apk,不能直接替换(因为签名不一样)
android应用安装到手机的是一个apk文件。apk是可以用工具进行反编译并重新打包的。本文将介绍下如何用apktool对apk进行反编译并重新打包。
工具/原料
apktool
auto sign
方法/步骤
首先我们新建一个android项目,里面只有一个MainActivity,而且主界面只会显示一个字符串:你好。
下面,我们切换到这个项目生成的apk文件所在的目录,可以看到有一个hellodemoapk。
在命令行输入:apktool d -r hellodemoapk。可以看到在当前目录下生成了一个hellodemo文件夹。
进入到hellodemo\smali\com\example\hello,打开MainActivitysmali。找到:
const-string v1, "\u4f60\u597d",
修改为:
const-string v1, "hello",
然后在命令行输入:apktool b hellodemo hellodemo1apk。这回重新打包成hellodemo1apk。
然后给新生成的apk进行签名。把这个apk拷贝到autosign的目录下面,然后切换过去,在命令行输入:java -jar signapkjar testkeyx509pem testkeypk8 hellodemo1apk hellodemoapk。
步骤阅读
把生成的hellodemoapk安装到手机,可以看到主界面上已经显示的是hello,而不再是你好。说明反编译重新打包成功!
APP签名带来的好处:1应用程序升级。如果你想要升级应用的版本,那么你必须用同一个证书进行签名,这是由于只有以同一个证书签名,系统才会允许安装升级此应用程序。
如果用户使用了不同的证书进行签名,那么系统就会要求您的应用程序换名称,也就相当于安装一个新的应用程序。
对apk进行反编译并修改后,需要对重新打包的apk进行签名。
秘钥生成工具——keytool
路径:jdk/bin/keytoolexe
生成秘钥: keytool -genkeypair -keystore testkeystore -alias test -validity 10 -keyalg RSA
其中-validity指定有效期天数,-keyalg指定算法
查看秘钥信息: keytool -list -v -keystore testkeystore
JDK签名工具——jarsigner
仅支持V1签名
路径:jdk/bin/jarsignerexe
命令: jarsigner -keystore testkeystore testapk testkey
apk签名工具——apksigner
默认开启V1和V2签名
路径:AndroidSDK/build-tools/2800/apksignerbat
命令: apksigner sign --ks xxkeystore --ks-key-alias testkey testapk
首先,了解一下我们为什么需要反编译apk
大部分情况下,是由于想本地化一款优秀的应用,才需要做这事儿;又或者进行少量的smali修改以达到想要的效果(如添加归属地,使3G版Nexus 7支持Wi-Fi热点)。
下面我们先准备运行环境和工具
建立工作目录,如\workspace\apktoolbox (下面同样以此路径为例)
必不可少的JDK:Oracle Java下载,安装完成后把<jdk-inst-path>\bin添加到$PATH环境变量中
反编译和重编译工具apktool:Google Code下载,按平台下载(一个apktool-install-<platform>-<ver>-tarbz2,一个apktool<ver>tarbz2,下载完成后解压至\workspace\apktoolbox\bin
密钥文件,共4组。test/shared/media/platform,从android source中获取,分别对应不同共享用户ID时签名所需(查看应用AndroidManifestxml第二行android:sharedUserId项 ),放到\workspace\apktoolbox\bin下
test - 无android:sharedUserId项
shared - android:sharedUserId=androiduidshared
media - android:sharedUserId=androiduidmedia
platform - android:sharedUserId=androiduidsystem
签名工具signapkjar,放到\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 signapkjar testkeyx509pem testkeypk8 \apks\<outdir>\dist\<apkfile>apk \apks\<apkfile>_signedapk
签名完成后,在命令行中输入以下命令进行对齐优化
zipalign -f -v 4 \apks\<apkfile>_signedapk \apks\<apkfile>_zipalignedapk
<apkfile>_zipalignedapk就是我们最终需要的apk了。
完成
部分apk需要系统框架资源,没有的话在重新打包时会报错,这种情况下我们只需要先安装一下对应系统框架即可(从你目标ROM中把/system/framework/framework-resapk提取出,放到\workspace\apktoolbox\apks下)。在命令行中输入以下命令进行安装
apktool if \apks\framework-resapk
将 apk 解压,在解压后的文件夹中可以找到 classesdex 文件。(除了 classesdex 文件,可能还会有 classes2dex , classes3dex 等等,本文以 classesdex 为例,对其他几个 dex 文件的 *** 作是类似的)
使用 dex2jar 工具,将 dex 文件转换为 jar 文件
使用方式:
执行命令后,生成的 classes-dex2jarjar 就是我们需要的 jar 文件。
使用 Luyten 工具查看 jar 文件,就能看到反编译后的源码了。
本例中, classesdex 文件中存储的是 android 的一些基础库,实际编写的源码在 classes3dex 中,对 classes3dex 执行第二步,查看生成的 classes3-dex2jarjar 文件,可以看到如下内容:
这就是反编译 apk 的基本 *** 作了。
Cmder 是一个非常好用的命令行工具。
效果如下:
只需要执行 apk2jar 命令,就可以实现把 apk 解压到 apk_ 文件夹中,并将 apk_ 文件夹中的 classesdex 文件转换为 jar 。原理就是通过 Cmder 添加别名,把上述的第一步和第二步中执行的命令行组合起来了。
为 Cmder 添加别名很简单,编辑 Cmder安装目录\config\user_aliasescmd 文件,将别名添加到里面即可。本例添加的别名如下:
其中:
苹果手机无法打开apk文件。
APK(全称:Android application package,Android应用程序包)是Android *** 作系统使用的一种应用程序包文件格式,用于分发和安装移动应用及中间件。
APK文件是一个只能被Android系统所识别的文件,无法被IOS系统识别。
IOS系统下载软件需要通过App Store(苹果)、TestFlight(苹果)、爱思助手(第三方)等平台才能进行下载、安装。
APK介绍:
一个Android应用程序的代码想要在Android设备上运行,必须先进行编译,然后被打包成为一个被Android系统所能识别的文件才可以被运行,而这种能被Android系统识别并运行的文件格式便是“APK”。
apk反编译就是通过使用apk编译工具,将apk文件中的源文件和资源反编译出来,得到的源文件和资源文件可以进行处理后再进行编译,以达到个性化定制、汉化apk等目的。
以上就是关于如何反编译android应用并重新打包全部的内容,包括:如何反编译android应用并重新打包、如何将手机apk 安装包反编译和重新打包签名、怎么提取apk的密钥再给别的apk签名啊等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)