前言
android系统上所识别的安装包后缀名为.apk
1.通过aapt工具打包资源文件和清单文件到R.java中。
2.通过aidl工具将aidl文件转为java文件
3.上面所产生的java文件通过java编译器编译成class文件
4.dx工具将class文件和jar文件转化为classes.dex文件
5.通过apkbuilder工具将classes.dex转化为apk
在AndroidSDK的build-tools目录中我们能发现一些打包工具
java文件转化为class文件是通过JDK中的javac命令实现的,
classes.dex转化为apk是通过
接下来我们去解压一个apk安装包,看看里面都有什么内容?
各个目录介绍:
assets:资源目录,不同于res,这里面的资源会原封不动的打包到apk中
META-INF:存放签名信息,既然有签名信息,那必然有签名文件,默认的签名文件在下面的目录中
debug.keystore就是签名文件,密码是android,我们可以在命令窗口输入下面的命令来查看详细信息:首先需要进入签名文件所在目录,
我们打开META-INF目录:看到下面三个文件
下面介绍如何通过CERT.RSA文件查看签名信息,首先我们需要进入META-INF目录,然后输入下面的指令:
keytool -printcert -file META-INF/CERT.RSA
res:资源目录
AndroidManifest.xml:清单文件
classes.dex:dalvik的执行的字节码文件
resources.arcs:编译后的二进制资源文件
安装
大概了解了apk的打包过程之后,我们来看看应用的安装过程
1.拷贝apk包到data/app/目录下,比如我们我们应用程序的包名为
com.example.administrator.projectone
第一次安装后data/app/目录如下,命名规则是包名-N.apk
接下来我们不卸载程序再次安装一次,查看data/app目录
此时后缀变成了-2,那么我们继续安装,发现后缀不会再变化了。
2.接下来就是在data/data/目录下创建一个文件夹,名称为包名,存放的是应用程序的数据,
3.将应用程序信息写入到注册表文件,注册表文件在data/system下的
packages.list和packages.xml文件中,我们去看看这两个文件中的内容,去找一下我们应用程序的信息
packages.list记录的是已安装应用的包名列表信息
packages.xml里面存放的是详细信息
<package name="com.example.lixiaoniu.projecttwo" codePath="/data/app/com.example.lixiaoniu.projecttwo-2" nativeLibraryPath="/data/app/com.example.lixiaoniu.projecttwo-2/lib" flags="4767302" ft="15993090ce8" it="15992e752c0" ut="15993091721" version="1" userId="10058">
<sigs count="1">
<cert index="4" key="308201dd30820146020101300d06092a864886f70d010105050030373116301406035504030c0d416e64726f69642044656275673110300e060355040a0c07416e64726f6964310b3009060355040613025553301e170d3137303130363130333534345a170d3436313233303130333534345a30373116301406035504030c0d416e64726f69642044656275673110300e060355040a0c07416e64726f6964310b300906035504061302555330819f300d06092a864886f70d010101050003818d003081890281810085244eba49426b1f1f9c7bbe1450102d90e8e1f39598bc104acdd3bf7fdd0d0f5d79c0f6eee3701f730a40743d2e17babf2eb81a4b9c31f9a11de61e0001496343241d4b338e1f9808b528a43e0aeea5956ccfd6e68bac53279048ea09800afc63d6b5e850c4710168b2d01816267ef23e3d73d6b0515a53d4fc39fdf22072cb0203010001300d06092a864886f70d0101050500038181007a70f4745b5d271648db53ac91eda9d18b8cff7a633c06bbbfed64807c7d66f27c6cf06f08e9430078362c8758429090efd3580ad8a812845ca181d04949e91633ea067d9b0efb1cd45b4001222eae19dd09a00e562ff15c879b656d842742041dc6c0ddd98b47437e0abbbaa87519fe7a7fc5b1580b9f558fb495516a3b996e" />
</sigs>
<perms>
<item name="android.permission.SYSTEM_ALERT_WINDOW" />
</perms>
<proper-signing-keyset identifier="22" />
<signing-keyset identifier="22" />
</package>
当把信息写入到注册表以后,整个应用程序就安装完成了。