【图文并茂】人人都会修改APK,美化,汉化,去广告

本贴来源于bbs.mfunz.com/,非本人原创,只是感觉很不错,就转过来,给有需要的朋友参考

也许许多人都曾经想过要修改APK自己DIY,但不知道怎么下手,其实要修改APK并没有想象中的那样复杂,这个虽不能让你成为高手(那要有程序基础才可能),但至少入门是没有问题的,涵盖了大部分的东西,全方位step By step的教你怎么弄这些东西!

一、APK文件结构介绍

二、JAVA环境的搭建

三、常用工具介绍及基本使用

四、APK的美化、汉化、去广告



一、APK文件结构介绍:


简单的认识一下APK文件的结构,apk文件实际是一个zip格式的压缩包,只不过后缀名为.apk,所以我们完全可以通过解压缩工具(例如WINRAR,好压)解开,解开后你将看到大致如下的结构:
|--AndroidManifest.xml
|--META-INF
|  |--CERT.RSA
|  |--CERT.SF
|  |--MAINFEST.MF
|--classes.dex
|--res
|  |--drawable
|  |--layout
|  |--...   
|--resources.arse

Manifest 文件

AndroidManifest.xml是每个应用都必须定义和包含的,它描述了应用的名字、版本、权限、引用的库文件等等信息,如要把apk上传到Google Market上,也要对这个xml做一些配置。

META-INF目录

META-INF目录下存放的是签名信息,用来保证apk包的完整性和系统的安全。在eclipse编译生成一个api包时,会对 所有要打包的文件做一个校验计算,并把计算结果放在META-INF目录下。而在Android平台上安装apk包时,应用管理器会按照同样的算法对包里的 文件做校验,如果校验结果与META-INF下的内容不一致,系统就不会安装这个apk。这就保证了apk包里的文件不能被随意替换。比如拿到一个apk 包后,如果想要替换里面的一幅图片,一段代码, 或一段版权信息,想直接解压缩、替换再重新打包,基本是不可能的。如此一来就给病毒感染和恶意修改增加了难度,有助于保护系 统的安全。

classes.dex文件

classes.dex是java源码编译后生成的java字节码文件。但由于Android使用的dalvik虚拟机与标准的java虚拟机是不兼容 的,dex文件与class文件相比,不论是文件结构还是opcode都不一样。目前常见的java反编译工具都不能处理dex文件。
Android模拟器中提供了一个dex文件的反编译工具dexdump。用法为首先启动Android模拟器,把要查看的dex文件用adb push上传的模拟器中,然后通过adb shell登录,找到要查看的dex文件,执行dexdump xxx.dex。
目前在网上能找到的另一个dex文件的反编译工具是Dedexer。Dedexer可以读取dex格式的文件,生成一种类似于汇编语言的输出。这种输出与jasmin[ ]的输出相似,但包含的是Dalvik的字节码。我们会在下一节详细介绍一下Dedexer。

res 目录

res目录存放资源文件。

resources.arsc

编译后的二进制资源文件

二、JAVA环境的搭建


打开www.oracle.com下载JDK,如图(2-1):
这里同时提供一个JDK下载的直通车地址:
http://pan.baidu.com/share/link?shareid=65637&uk=3625449542



安装JDK,一路下一步,如图(2-2):



配置系统环境变量,以WIN7为例:
我的电脑-->属性-->高级系统设置-->环境变量-->系统变量
新建JAVA_HOME,如图(2-3)
变量名:JAVA_HOME,变量值:JDK的安装目录



新建CLASSPATH,如图(2-4)
变量名:CLASSPATH,变量值:%JAVA_HOME%\lib\*.jar
PS:%JAVA_HOME%表示引用JAVA_HOME的值,相当于程序中的变量,如果不填写%JAVA_HOME%,可以直接填写路径绝对值




编辑path,如图(2-5)
在变量值末尾加上 ;%JAVA_HOME%\bin  
PS:“;”为不同路径之间的分割符



配置完成后,点开始-->运行-->输入CMD回车-->输入JAVA回车,看到如图(2-6)配置成功,否则请仔细检查系统变量是不是配置有误





三、常用工具介绍及基本使用


1、反编译利器apktool
官方下载地址:http://code.google.com/p/android-apktool/downloads/list
(需要下载"apktool-install-windows-2.2_r01-3.tar.bz2"和"apktool1.3.2.tar.bz2"两项,解压出里面的东西)
我们得到需要的3个文件,分别是:aapt.exe、apktool.bat、apktool.jar
当然我这里也提供一个已经包含这三个文件的apktool压缩包:

apktool.zip(4.3 MB, 下载次数: 29)
2012-11-21 15:11 上传
下载次数: 29
下载积分: 金钱 -1 , 贡献 -1


可以将这三个文件直接放到C:\Windows下,这样不用配置环境变量
或者放到任意目录,然后在path变量中追加上该目录

apktool在cmd中两个最基本的命令如下:

反编译:将X盘的abc.apk反编译,并将处理后的文件,放在X盘内的"helloworld"文件夹内.
apktool d X:\abc.apk X:\helloworld
PS:当然在实际应用中,一般都是CMD先定位到要反编译的apk文件目录下,这样命令就不用输入绝对路径,而变成了
apktool d abc.apk helloworld
编译:将"helloworld"文件夹重新编译
apktool b X:\helloworld

特别注意:有些APK文件的编译是需要ROM中的框架的,例如conversation.apk要反编译,同时需要framework里的framework-res/blur-res/moto-res三个apk,简单说一下如何导入框架:

添加framework的命令:
apktool if framework-res.apk
当然多数情况是不用这样的,要编译其它的不需要这些框架的APK请删除导入的文件,见图(3-1)





2、odex文件合并
①什么是ODEX?
Android的ROM中有很多odex文件,相对于APK中的dex文件而言这个odex有什么作用呢? 如果你仔细观察会发现文件名时一一对应的,同时那些对应的apk文件中没有dex文件。这样做可以使其厂商保证一定的反盗版,因为没有没有dex文件的 apk是无法正常安装的,而厂商直接将odex和不完整的apk文件放到手机rom固化到/system/bin中可以让一般用户无法正常导出使用
正常的apk文件中是包含了dex文件,但为了提高运行效率,有些ROM会将apk中的dex文件提取出来并优化,优化后的文件就是odex文件了。。。。
这种ROM提取文件时要把apk和odex文件一起提取。
魔趣的ROM就进行了ODEX化的。你会发现里面的apk文件中并不包含classes.dex文件,多了一个同名的.odex文件
②合并apk和odex文件工具
官方下载地址:http://code.google.com/p/smali/downloads/list
我们需要下载smali.jar和baksmali.jar
这里同时也提供一个已经包含这两个文件的附件:

smali.zip(2.24 MB, 下载次数: 18)
2012-11-21 15:12 上传
下载次数: 18
下载积分: 金钱 -1 , 贡献 -1


③通过odex生成class文件,通过class文件生成dex文件
java -jar baksmali.jar -x abc.odex
执行完上面这行命令后,会生成一个out 文件夹,里面是abc.odex的class文件。
出现问题,可以根据提示把rom中 /system/framework 下的**.jar放到pc上的java环境变量中
java -Xmx512M -jar smali.jar out -o classes.dex
因为apk是zip的mime编码类型,使用winzip或winrar直接拖入到缺少dex文件的apk中即可
当然合并后的完整apk是不能直接安装的,还要重新签名(signapk,auto sign)当然我还是推荐用汉化浪子的这个可视化工具AndroidResEdit

AndroidResEdit.zip(4.73 MB, 下载次数: 23)
2012-11-21 15:13 上传
下载次数: 23
下载积分: 金钱 -1 , 贡献 -1



3、dex2jar和jd-gui
前者是将apk中的classes.dex转化成Jar文件,而JD-GUI是一个反编译工具,可以直接查看Jar包的源代码
下载地址:http://code.google.com/p/laichao/downloads/list
同时这里提供一个已经包含这两个工具的附件:

dex2jarAndJd-gui.zip(1.25 MB, 下载次数: 20)
2012-11-21 15:15 上传
下载次数: 20
下载积分: 金钱 -1 , 贡献 -1



在CMD下定位到文件所在目录并运行命令
dex2jar.bat    classes.dex
生成
classes.dex.dex2jar.jar
生成jar文件的截图如下(3-2):



运行JD-GUI(jd-gui.exe),打开上面生成的jar包,即可看到源代码了,见图(3-3)



好了,工具篇就简单的介绍到这里了


四、APK的美化、汉化、去广告:


1、APK的美化
这个呢是最简单的了,先用apktool反编译,然后替换其中的资源文件,在用apktool重新构建,最后重新签名,一个新的APK就好了。
我们就用魔趣ROM中的framework-res.apk为例,简单看一下怎么完成资源替换美化,这里省略odex文件合并。
点开始-->运行-->输入CMD回车-->定位到工作目录
运行命令:apktool d framework-res.apk framework-res
得到反编译后新的资源文件夹,如图(4-1)




将res/dwawable-hdpi下的相关图标替换掉(图4-2)



当然我这里提供一个资源包,直接用这里面的资源替换原来的资源就可以了

framework-res-change.zip(341.99 KB, 下载次数: 5)
2012-11-21 15:18 上传
下载次数: 5
下载积分: 金钱 -1 , 贡献 -1


替换好后用apktool重新打包并签名,如图(4-3)



重新生成的未签名apk位于dist目录下,如图(4-4)





使用上面附件中提供的AndroidResEdit工具重新签名,如图(4-5)



这样一个新的已经美化好了的APK就完成了
同时这里在提供一个SystemUI的美化资源包

SystemUI-change.zip(203.92 KB, 下载次数: 5)
2012-11-21 15:20 上传
下载次数: 5
下载积分: 金钱 -1 , 贡献 -1


当然如果只是要替换这样图片什么的,没必要用apktool反编译,也可以直接用winara,winzip之类的软件直接不过行解包替换。
2、apk的汉化
这里只讲一下用apktool反编译后汉化,汉化并没有什么技术含量,只要你有一点英文功底,学会用这些简单的工具就可以做到,
你一样是汉化达人,不要羡慕别人多牛多牛啦。
APKTool汉化优点如下:
- 反编译软件安装包,直接修改语言包或添加语言包,大大减少软件汉化后出问题的几率
- 可精简无用的语言
- 可用来去除广告(这个在第3点在说)
首先是反编译APK文件,这里不在重复
解包后在res目录下你会看到很多values-***的文件夹,这就是语言包。
values是英文语言包,values-zh是中国地区语言包(包含港澳台及内地),values-zh-rCN是中文简体语言包(只包含内地),values-zh-rTW是中文繁体语言包(港澳台)。除此以外,其它地区的语言包都是精简的对象,可以不过多了解。
在values文件夹里,通常有arrays.xml、strings.xml等语言文件,要汉化这些文件,可以用Notepad++ Portable打开,如图(4-6):



我们只需要将<string name="###">*****</string>间的*****内容改成中文就行了
另外,除了res文件夹内有语言包需要汉化外,在res文件夹内的layout和xml文件夹内也会有文件需要汉化,同样是用Notepad++ Portable打开,这些文件里面都是代码语句,需要通过搜索功能找到需要汉化的单词来汉化,所以这里建议大家先把原版的软件装上去,再对照单词,边搜索,边汉化。
用Notepad++ Portable修改、添加好语言包后,就可以重新编译打包了
注意事项:
部分情况下,在精简语言后,重新编译打包时,命令窗口会提示public******错误,这是由于values语言包文件夹下的public.xml文件给非values、values-zh-rCN、values-zh-rTW的其它values-***语言包文件里的语言文件定义了字段,但这些语言包都被精简了,定义不了,所以会出错。解决方法有两个:
* 一是按照命令窗口中的提示(有提示public.xml文件的具体哪一行的值没有定义),到相应的语言包里找到那行未定义的代码,复制到values-zh-rCN、values-zh-rTW语言包文件夹内的strings.xml语言文件中。

* 二是按照命令窗口中的提示(有提示public.xml文件的具体哪一行的值没有定义),直接到values语言包文件夹下的public.xml文件中删除没有定义的那几行代码
3、apk去广告
这个说起来就要复杂一些了,当然也并不是很难,只要你学一定就能行的。

先了解下软件的广告原理

一个软件若要显示广告,需要先导入SDK,并在AndroidManifest.xml中注册。
res\layout目录内的xml文件就包含有广告界面的配置代码,修改这些代码就可以去除广告界面。
另外还要屏蔽广告下载源,不然只是单单不显示广告界面而已,软件还会下载广告所需的数据,耗费流量。
目前Android的广告供应商有两个(这个是网上流传的说法,国内实际上有很多,不一一列举),一个是Admob,一个是Google Ads,前者已被后者收购,但两者SDK依然独立

广告代码

Admob的广告代码为:
<com.admob.android.ads.AdView
android:id=”@+id/ad”
android:layout_width=”fill_parent”
android:layout_height=”wrap_content” />
Google Ads的广告代码为:
<com.google.ads.GoogleAdView
android:id=”@+id/adview”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content” />

广告下载源

Admob的广告下载源:
http://r.admob.com/ad_source.php
http://mm.admob.com
http://api.admob.com
Google Ads的广告下载源:
http://pagead2.googlesyndication.com/pagead/afma_load_ads.js

用apktool进行反编译解包(方法上面已经讲过)

①首先去除广告界面
用Notepad++ Portable搜索广告代码,将搜索路径定位到res文件夹(就是反编译后的res文件夹),代码只搜索开头就行了,例如:com.admob.android.ads.AdView 和 com.google.ads.GoogleAdView,当然对于国内的广告你就要使用其它关键字了。
如图:(4-7)




搜索结果4-8)




双击黄颜色区域,修改下图上方的代码
android:layout_width="fill_parent" 修改为 android:layout_width="0.0dip"
android:layout_height="wrap_content" 修改为 android:layout_height="0.0dip"
如图(4-9)



修改后4-10)



再作下解释:
android:layout_width="fill_parent" 修改为 android:layout_width="0.0dip"
android:layout_height="wrap_content" 修改为 android:layout_height="0.0dip"
之所以这么修改,是因为要让广告窗口不显示,android:layout_width定义的是广告窗口的宽度,android:layout_height定义的是广告窗口的高度,0.0dip代表0像素,将两者后面的值修改为0.0dip,那么高和宽都是显示0像素,等于不显示,达到了去广告窗口界面的目的
②去除广告下载源
将搜索路径定位到smali文件夹,用Notepad++ Portable搜索广告下载源地址(若不知道软件用的是哪个供应商的广告的话,最好两家的下载源都搜索下)
如图(4-11)




搜索结果如下4-12)




将广告下载源地址修改成无效的地址(例如0.0.0.0、192.168.1.1等),如图(4-13)




最后完成后用apktool重新构建,并重新签名

当然这样的做法是不破坏软件结构,其实呢更加好的做法是将classes.dex反编译为jar文件,用jd-gui进行查看源代码,对照移除smali目录下的相应代码,破解收费什么的也类似,这个因为涉及到代码的分析,就不在此详细讨论。

【教程完毕】
已有 2 人评分RP值金钱收起理由
sunss+ 1+ 1赞一个!
3721HDP + 5感谢原作者,同谢楼主转来。

总评分: RP值 + 1 金钱 + 6  查看全部评分

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值