文章目录
库文件
jar 包
aar 包
手动编写一个 aar 库
APK
APK 文件结构
APK 文件的生成流程
APK 的安装流程
通过系统程序安装(开机时安装)
通过 Android 市场安装
通过 adb 命令安装
手机自带安装(通过 SD 卡里的 APK 文件安装)
通过分析 packageinstaller.apk 的实现步骤了解 APK 的安装过程
库文件
一系列代码功能接口与资源数据的有机集合
Android SDK 即是大量库文件的集合
开发兼容不同版本系统的 APK 时,要引用 Android SDK 中不同版本的 android.jar 文件(开发中使用最多的库)
第三方提供的地理位置 SDK、数据统计 SDK、广告 SDK 等都是库文件
引用第三方库文件可能带来安全风险(获取用户数据、监控用户行为等),应对它们的“内幕”有所了解
jar 包
Android Studio 问世前,Android 平台软件开发主要用 ADT 工具包完成。ADT 工具包的 IDE 是 Eclipse,库文件使用 Java 语言中标准的 jar 包。jar 包其实是一个 zip 格式的压缩包文件,存放着编译后的 Java 代码的 class 文件的集合。因此称 jar 文件为“jar 包”
查看 android.jar 的格式和内容(命令行输入 bash,进入 Bash on Ubuntu on Windows 的 Shell 模式,配置方法:https://blog.csdn.net/zlmm741/article/details/104577290 ,再输入如下命令):
$ file android.jar
$ unzip -l android.jar | less
输出如下(节选):
输入第二条命令前可能需要先安装 unzip,命令如下:
$ sudo apt-get install unzip
部分对安全性要求较高的 jar 包,会对包含的 class 文件进行签名,签名信息保存在 jar 包的 META-INF 目录
分析 jar 包有静态分析和动态分析两种
静态分析:
可使用 jd-gui 这类 jar 查看工具(下载地址:https://github.com/java-decompiler/jd-gui/releases )。jd-gui 内部会调用反编译接口,将 jar 包中的 class 文件编译成 Java 文件,并将结果显示,如下图:
若不习惯在 jd-gui 中查看 Java 代码,可将 jar 包反编译称 Java 文件,导入 Java 编辑器中查看。选择 jd-gui 菜单项“File” -> “Save All Sources”即可保存所有反编译出的 Java 文件
动态分析:
PC 平台可用与系统特性相关的工具 Dtrace 或 soot 对 jar 包中的文件进行运行时跟踪
Android 平台没有可直接使用的工具,要用迂回的办法,即先将 jar 包集成到编写的 APK 中,再对要分析的 jar 包中的类与方法进行插桩和运行时分析
在 Android 平台进行动态分析时,可参考 PC 上的方案,如 AspectJ 的面向切片编程技术。AspectJ 提供了对 jar 包中方法的侵入式 Hook 技术,可通过编写 AspectJ 脚本 Hook jar 包中的方法。Android 平台有 AspectJ 的移植版本,只要编写 Hook 实例即可,详情见之后的笔记
aar 包
Android Studio 问世前:jar 包中通常只包含其所使用的代码,不包含代码所使用的资源数据;如果第三方 SDK 使用了大量的图片、声音、布局等资源,除了要将 jar 包引用到工程外,还要将 SDK 中的资源手动复制到工程中
Android Studio 问世后:AS 将 aar 文件作为全新的库文件格式。aar 除了可包含代码,还可包含任何在开发中用到的资源数据
手动编写一个 aar 库
启动 AS,新建工程(AS 不允许直接创建 aar 文件,要通过模块的形式在已存在的 APK 工程中添加 aar 文件),命名为“MyAar”,然后选择默认选项即可,如下图:
在 AS 主界面点击右键,如下图:
选择“Android Library”,输入名称“MyLib”,如下图:
现在工程中包含 app 和 mylib 两个模块,不对其修改,直接编译 mylib 模块的 Release 版本。编译完成后会在当前工程目录的 mylib/build/outputs/aar 目录下生成 mylib-release.aar 文件
执行如下命令,查看文件格式:
file mylib/build/outputs/aar/mylib-release.aar
输出如下:
由上图可知 aar 文件也是 zip 包
执行如下命令,查看它的内容:
unzip -l mylib/build/outp