本贴来源于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 可以将这三个文件直接放到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 ③通过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 3、dex2jar和jd-gui 前者是将apk中的classes.dex转化成Jar文件,而JD-GUI是一个反编译工具,可以直接查看Jar包的源代码 下载地址:http://code.google.com/p/laichao/downloads/list 同时这里提供一个已经包含这两个工具的附件: dex2jarAndJd-gui.zip 在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 替换好后用apktool重新打包并签名,如图(4-3) 重新生成的未签名apk位于dist目录下,如图(4-4) 使用上面附件中提供的AndroidResEdit工具重新签名,如图(4-5) 这样一个新的已经美化好了的APK就完成了 同时这里在提供一个SystemUI的美化资源包 SystemUI-change.zip 当然如果只是要替换这样图片什么的,没必要用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目录下的相应代码,破解收费什么的也类似,这个因为涉及到代码的分析,就不在此详细讨论。 【教程完毕】 |
【图文并茂】人人都会修改APK,美化,汉化,去广告
最新推荐文章于 2024-07-29 16:36:10 发布