修改apk(wuxianlin整理)
不懂的自己百度一下
也许许多人都曾经想过要修改APK自己DIY ,但不知道怎么下手,其实要修改APK并没 有想象中的那样复杂,这个虽不能让你成为 高手(那要有程序基础才可能),但至少入门 是没有问题的,涵盖了大部分的东西,全 方位step By step的教你怎么弄这些东西!
部分文字来源网络,错误难免,请指正: 一、APK文件结构介绍 二、JAVA环境的搭建 三、常用工具介绍及基本使用 四、APK的美化、、去广告
一、APK文件结构介绍:
简单的认识一下APK文件的结构,apk文件 实际是一个zip格式的压缩包,只不过后缀 名为.apk,所以我们完全可以通过解压缩工 具(例如WINRAR,好压)解开,解开后你将看到 大致如下的结构:
|--l
|--META-INF
| |--CERT.RSA
| |--CERT.SF
| |--MAINFEST.MF
|--classes.dex
|--res
| |--drawable
| |--layout
| |--...
|--resources.arse Manifest
文件 l是每个应用都必须定义和包含的,它描述了应用的名字、版本 、权限、引用的库文件等等信息,如要把a pk上传到Google Market上,也要对这个x ml做一些配置。 META-INF目录 META-INF目录下存放的是签名信息,用来 保证apk包的完整性和系统的安全。在eclip se编译生成一个api包时,会对 所有要打包 的文件做一个校验计算,并把计算结果放 在META-INF目录下。而在Android平台上安 装apk包时,应用管理器会按照同样的算法对包里的文件做校验,如果校验结果与ME TA-INF下的内容不一致,系统就不会安装这个apk。这就保证了apk包里的文件不能 被随意替换。比如拿到一个apk 包后,如果 想要替换里面的一幅图片,一段代码, 或 一段版权信息,想直接解压缩、替换再重 新打包,基本是不可能的。如此一来就给病毒感染和恶意修改增加了难度,有助于 保护系 统的安全。 classes.dex文件 classes.dex是java源码编译后生成的java字节码文件。但由于Android使用的dalvik虚拟机与标准的java虚拟机是不兼容的,dex 文件与class文件相比,不论是文件结构还 是opcode都不一样。目前常见的java反编 译工具都不能处理dex文件。 Android模拟器中提供了一个dex文件的反 编译工具dexdump。用法为首先启动Andro id模拟器,把要查看的dex文件用adb push 上传的模拟器中,然后通过adb shell登录 ,到要查看的dex文件,执行dexdump x xx.dex。 目前在网上能到的另一个dex文
件的反编 译工具是Dedexer。Dedexer可以读取dex 格式的文件,生成一种类似于汇编语言的 输出。这种输出与jasmin[ ]的输出相似,但 包含的是Dalvik的字节码。我们会在下一节 详细介绍一下Dedexer。 res 目录 res目录存放资源文件。 resources.arsc 编译后的二进制资源文件
二、JAVA环境的搭建
打开acle下载JDK,
这里同时提供一个JDK下载的直通车地址: acle/otn-pub/java/jdk/
安装JDK,一路下一步, 配置系统环境变量,以WIN7为例: 我的电脑-->属性-->高级系统设置-->环境变 量-->系统变量 新建JAVA_HOME 变量名:JAVA_HOME,变量值:JDK的安装 目录 新建CLASSPATH 变量名:CLASSPATH,变量值:%JAVA_HO ME%\lib\*.jar PS:%JAVA_HOME%表示引用JAVA_HOME的 值,相当于程序中的变量,如果不填写%JAV A_HOME%,可以直接填写路径绝对值 编辑path, 在变量值末尾加上 ;%JAVA_HOME%\bin
PS:“;”为不同路径之间的分割符
配置完成后,点开始-->运行-->输入CMD回 车-->输入JAVA回车,看到如图(2-6)配置成 功,否则请仔细检查系统变量是不是配置 有误
三、常用工具介绍及基本使用
1、反编译利器apktool 官方下载地址:le/p/an droid-apktool/downloads/list (需要下载"apktool-install-windows-2.2_r01 -3.tar.bz2"和"apktool1.3.2.tar.bz2"两项,解 压出里面的东西) 我们得到需要的3个文件,分别是: e、apktool.bat、apktool.jar 可以将这三个文件直接放到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文件的编译是需要RO M中的框架的,例如conversation.apk要反编 译,
同时需要framework里的framework-res /blur-res/moto-res三个apk,简单说一下如 何导入框架: 添加framework的命令: apktool if framework-res.apk 当然多数情况是不用这样的,要编译其它 的不需要这些框架的APK请删除导入的文件 java安装完整教程
2、odex文件合并 ①什么是ODEX? Android的ROM中有很多odex文件,相对于 APK中的dex文件而言这个odex有什么作用 呢? 如果你仔细观察会发现文件名时一一对 应的,同时那些对应的apk文件中没有dex 文件。这样做可以使其厂商保证一定的反 盗版,因为没有没有dex文件的 apk是无法 正常安装的,而厂商直接将odex和不完整 的apk文件放到手机rom固化到/system/bin 中可以让一般用户无法正常导出使用 正常的apk文件中是包含了dex文件,但为 了提高运行效率,有些ROM会将apk中的d ex文件提取出来并优化,优化后的文件就 是odex文件了。。。。 这种ROM提取文件时要把apk和odex文件 一起提取。 魔趣的ROM就进行了ODEX化的。你会发现 里面的apk文件中并不包含classes.dex文件 ,多了一个同名的.odex文件 ②合并apk和odex文件工具 官方下载地址:le/p/smali/downloads/list 我们需要下载smali.jar和baksmali.jar ③通过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 classe s.dex 因为apk是zip的mime编码类型,使用winzi p或winrar直接拖入到缺少dex文件的apk中 即可 当然合并后的完整apk是不能直接安装的, 还要重新签名(signapk,auto sign)当然我还 是推荐用浪子的这个可视化工具Andro idResEdit
3、dex2jar和jd-gui 前者是将apk中的classes.dex转化成Jar文件 ,而JD-GUI是一个反编译工具,可以直接 查看Jar包的源代码 下载地址:le/p/laich ao/downloads/list 在CMD下定位到文件所在目录并运行命令 dex2jar.bat classes.dex 生成 classes.dex.dex2jar.jar 运行JD-GUI(),打开上面生成 的jar包,即可看到源代码了 好了,工具篇就简单的介绍到这里了
四、APK的美化、、去广告:
1、APK的美化 这个呢是最简单的了,先用apktool反编译 ,然后替换其中的资源文件,在用apktool 重新构建,最后重新签名,一个新的APK就 好了。 我们就用framework-res.apk为例,简单看 一下怎么完成资源替换美化,这里省略odex 文件合并。 点开始-->运行-->输
入CMD回车-->定位到工 作目录 运行命令:apktool d framework-res.apk fr amework-res 得到反编译后新的资源文件夹 将res/dwawable-hdpi下的相关图标替换掉 替换好后用apktool重新打包并签名 重新生成的未签名apk位于dist目录下 使用上面提供的AndroidResEdit工具重新签 名 这样一个新的已经美化好了的APK就完成了 当然如果只是要替换这样图片什么的,没 必要用apktool反编译,也可以直接用winar a,winzip之类的软件直接不过行解包替换。
2、apk的 这里只讲一下用apktool反编译后,汉 化并没有什么技术含量,只要你有一点英 文功底,学会用这些简单的工具就可以做 到, 你一样是达人,不要羡慕别人多牛多 牛啦。 APKTool优点如下: - 反编译软件安装包,直接修改语言包或添 加语言包,大大减少软件后出问题的 几率 - 可精简无用的语言 - 可用来去除广告(这个在第3点在说) 首先是反编译APK文件,这里不在重复 解包后在res目录下你会看到很多values-** *的文件夹,这就是语言包。 values是英文语言包,values-zh是中国地 区语言包(包含港澳台及内地),values-z h-rCN是中文简体语言包(只包含内地), values-zh-rTW是中文繁体语言包(港澳台 )。除此以外,其它地区的语言包都是精 简的对象,可以不过多了解。 在values文件夹里,通常有l、l等语言文件,要这
些文件,可 以用Notepad++ Portable打开 我们只需要将<string name="###">***** </string>间的*****内容改成中文就行了 另外,除了res文件夹内有语言包需要 外,在res文件夹内的layout和xml文件夹内 也会有文件需要,同样是用Notepad+ + Portable打开,这些文件里面都是代码语 句,需要通过搜索功能到需要的单 词来,所以这里建议大家先把原版的 软件装上去,再对照单词,边搜索,边汉 化。 用Notepad++ Portable修改、添加好语言 包后,就可以重新编译打包了 注意事项: 部分情况下,在精简语言后,重新编译打 包时,命令窗口会提示public******错误 ,这是由于values语言包文件夹下的public. xml文件给非values、values-zh-rCN、valu es-zh-rTW的其它values-***语言包文件里 的语言文件定义了字段,但这些语言包都 被精简了,定义不了,所以会出错。解决 方法有两个: * 一是按照命令窗口中的提示(有提示l文件的具体哪一行的值没有定义), 到相应的语言包里到那行未定义的代码 ,复制到values-zh-rCN、values-zh-rTW语 言包文件夹内的l语言文件中。 * 二是按照命令窗口中的提示(有提示l文件的具体哪一行的值没有定义), 直接到values语言包文件夹下的l 文件中删除没有定义的那几行代码
3、apk去广告 这个说起来就要复杂一些了,当然也并不 是很难,只要你学一定就能行的。
先了解下软件的广告原理 一个软件若要显示广告,需要先导入SDK, 并在l中注册。 res\layout目录内的xml文件就包含有广告 界面的配置代码,修改这些代码就可以去 除广告界面。 另外还要屏蔽广告下载源,不然只是单单 不显示广告界面而已,软件还会下载广告 所需的数据,耗费流量。 目前Android的广告供应商有两个(这个是网 上流传的说法,国内实际上有很多,不一 一列举),一个是Admob,一个是Google A ds,前者已被后者收购,但两者SDK依然独 立
广告代码
Admob的广告代码为: <com.admob.android.ads.AdView android:id=”@+id/ad” android:layout_width=”fill_parent” android:layout_height=”wrap_content” />
Google Ads的广告代码为: &le.ads.GoogleAdView android:id=”@+id/adview” android:layout_width=”wrap_content” android:layout_height=”wrap_content” />
广告下载源
Admob的广告下载源: r.admob/ad_source.php mm.admob api.
admob
Google Ads的广告下载源: lesyndication/pa gead/afma_load_ads.js
用apktool进行反编译解包(方法上面已经讲 过)
①首先去除广告界面 用Notepad++ Portable搜索广告代码,将搜 索路径定位到res文件夹(就是反编译后的r es文件夹),代码只搜索开头就行了,例 如:com.admob.android.ads.AdView 和 le.ads.GoogleAdView 双击黄颜区域,修改下图上方的代码 android:layout_width="fill_parent" 修改为 android:layout_width="0.0dip" android:layout_height="wrap_content" 修 改为 android:layout_height="0.0dip" 再作下解释: 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像素,
等于不显示,达到了去广告 窗口界面的目的
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论