关于安卓apk安装包你想知道的都在这里了

发表于 2016-9-11 15:26 | 浏览 2509

或许大家每天都在自己的 Android 设备上下载安装APP应用,但是搞机这么久,我们对于安卓APK程序包的了解到底有多少呢?APK安装后最终放置在了哪里?安装APP到底是怎样的一个过程?如何打开并修改APK程序包?... 感兴趣的童鞋现在就跟着菲菲君一起来探究一二~

APK安装包的文件数据结构

如果使用 WinHex 打开apk文件,从文件头就可以看出APK安装包其实就是一个zip格式的压缩包,所以我们只需将apk文件的后缀修改为 .zip 或 .rar ,就可以轻松的在电脑上打开并查看apk软件内部的文件和数据(当然你也可以使用手机R.E管理器查看)。

一个典型的APK安装包的目录结构是这样的:

Package.apk
│  
├─ assets (程序资源目录)
│
├─ META-INF(签名证书目录)
│     
├─ res(界面布局/图片资源目录)
│
│   AndroidManifest.xml(APK属性/权限/组件声明)
│
│   classes.dex(Android 虚拟机可执行字节码)
│
│   resources.arsc(字符串/资源索引文件)

安卓APK应用的安装流程

当我们新安装一个应用的时候,通常系统会执行以下流程:

校验apk包签名 → 复制程序包到 /data/app 目录 → 建立 /data/data/com.xxx 数据目录 → 提取释放lib文件 → dexopt优化classes.dex处理后释放到 /data/dalvik-cache 目录

在这个过程中,Android 系统服务还会更新以下系统文件:

  • /data/system/packages.list -- 分配存储APP的uid/gid,也就是用户/所属组
  • /data/system/packages.xml  -- 记录保存APP权限、签名证书、安装路径、版本信息等

由此可见,我们安装好的软件程序包被原本不动存放在 /data/app 目录之下,数据目录则被安放在 /data/data/pkg_name(包名) 目录之中。而卸载过程则相反,作删除相关文件处理。

如何修改&反编译APK软件包?

如果只是修改程序包的一些图片/assets资源,直接在电脑上用解压缩工具,解压后就可以修改替换,但是重新打包后需要重新签名,否则没有签名或者签名校验不正确的应用是无法安装成功的。关于APK签名的相关技术方法后面菲菲博客会详细介绍分享。

apk程序包其实可以使用压缩软件打开

而如果想要修改apk包中其他的已经编译后的文件,则需要反编译。由于 Android 本质上就是一个 Java 虚拟机,而 classes.dex 文件则是众多 .class 文件的打包集合,一般我们先要使用 dex2jar 将 classes.dex 解包为 Java jar 文件,然后再通过 JD-GUI 将 jar 文件的 .class 文件反编译为 .java 源码。

整个反编译dex的过程原理大致简单来说就是这样,但是实际操作起来难度不小,因为很多程序都经过了混淆加密处理(比如想QQ,微信等等大公司的软件不可能让人分分钟反编译破解,否则整个安卓APP世界还不乱套了...)

对于apk程序包其他的一些xml布局文件,直接打开是乱码怎么办?dex字节码都能反编译成功,xml就更简单一些了。网上有很多现成儿的工具,比如 AXMLPrinter2.jar ,可以直接解码反编译xml文件,当然执行 .jar文件需要在电脑上事先安装好 JRE(Java运行环境)哟!

关于 Android 应用的反编译菲菲在这里仅是简单介绍一下原理和过程,明白了解一下就好。具体的方法百度一搜一大把,多的不要不要的。篇幅关系就介绍这么多,后面将会陆续分享每一项的具体操作方法和教程。

(原创文章版权所有,如需转载请注明原文链接!)