App打包、安装、启动

apk打包的7个步骤

1、aapt打包资源文件,生成R.java文件:

使用aapt来打包res资源文件,生成R.java、resources.arsc和res文件,R.java文件是所有res资源的id列表,R.java是我们在编写代码的时候会用到的,我们经常R.drawable.icon之类的来引用工程中的资源文件。

R.java是我们在写代码时候引用res资源的id表,resources.arsc是程序在运行时候的用到的资源表。R.java是程序员读的,resources.arsc是机器读的!

appt在打包资源文件之前会检测AndroidManifest.xml的合法性,对res目录下的资源子目录进行处理,处理的内容包括资源文件名的合法性,这就是有时候为什么我们的资源命名有问题的时候Android Studio会直接报错无法编译!另外xml文件内容都会被编译成 二进制的,这也是我们无法直接打开apk解压后其中的xml文件。

2、处理aidl文件,生成相应的java文件:

AIDL (Android Interface Definition Language), Android接口定义语言,Android提供的IPC (Inter Process Communication,进程间通信)的一种独特实现。这个阶段处理.aidl文件,生成对应的Java接口文件。

3、编译工程源代码,生成相应的class文件:

通过Java Compiler编译R.java、Java接口文件、Java源文件,生成.class文件。如果有配置混淆的话,会编译成混淆的class文件,方便源代码被偷看。

4、转换所有的class文件,生成class.dex文件:

Android系统的Dalvik虚拟机的可执行文件为DEX格式,程序运行所需的class.dex就是在这一步生成的,使用到的工具为dx,它位于android-sdk\platform-tools目录下,dx工具主要的工作是将java字节码转换为Dalvik字节码、压缩常量池、消除冗余信息等。

5、打包生成apk文件:

将classes.dex、resources.arsc、res文件夹(res/raw资源被原装不动地打包进APK之外,其它的资源都会被编译或者处理)、Other Resources(assets文件夹)、AndroidManifest.xml打包成apk文件。

友情提示:

res/raw和assets的相同点:两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。

res/raw和assets的不同点:

res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename;assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类。

res/raw不可以有目录结构,而assets则可以有目录结构,也就是assets目录下可以再建立文件夹

6、对apk文件进行签名:

对apk进行签名,可以进行Debug和Release 签名。Debug签名是Android Studio默认的,Release 签名是需要我们自己配置的。

7、对签名后的apk文件进行对对齐处理:

release mode 下使用 aipalign进行align,即对签名后的apk进行对齐处理。

Zipalign是一个android平台上整理APK文件的工具,它对apk中未压缩的数据进行4字节对齐,对齐后就可以使用mmap函数读取文件,可以像读取内存一样对普通文件进行操作。如果没有4字节对齐,就必须显式的读取,这样比较缓慢并且会耗费额外的内存。

在 Android SDK 中包含一个名为 “zipalign” 的工具,它能够对打包后的 app 进行优化。 其位于 SDK 的 build-tools 目录下, 例如: D:\Develop\Android\sdk\build-tools\23.0.2\zipalign.exe

apk安装的四大步骤:

(1)拷贝apk到指定的目录:默认情况下,用户安装的apk首先会拷贝到/data/app下,用户有访问/data/app目录的权限,但系统出厂的apk文件会被放到/system分区下,包括/system/app,/system/vendor/app,以及/system/priv-app等,该分区需要root权限的用户才能访问。

(2)加载apk、拷贝文件、创建应用的数据目录:为了加快APP的启动速度,apk在安装的时候,会首先将APP的可执行文件(dex)拷贝到/data/dalvik-cache目录下,缓存起来。再在/data/data/目录下创建应用程序的数据目录(以应用包名命令),用来存放应用的数据库、xml文件、cache、二进制的so动态库等。

(3)解析apk的AndroidManifest.xml文件:在安装apk的过程中,会解析apk的AndroidManifest.xml文件,将apk的权限、应用包名、apk的安装位置、版本、userID等重要信息保存在/data/system/packages.xml文件中。这些操作都是在PackageManagerService中完成

的。

(4)显示icon图标:应用程序经过PMS中的逻辑处理后,相当于已经注册好了,如果想要在Android桌面上看到icon图标,则需要Launcher将系统中已经安装的程序展现在桌面上。

app启动步骤:

(1)启动的起点发生在Launcher活动中,启动一个app说简单点就是启动一个Activity,那么我们说过所有组件的启动,切换,调度都由AMS来负责的,所以第一步就是Launcher响应了用户的点击事件,然后通知AMS;

(2)AMS得到Launcher的通知,就需要响应这个通知,主要就是新建一个Task去准备启动Activity,并且告诉Launcher你可以休息了(Paused);

(3)Launcher得到AMS让自己“休息”的消息,那么就直接挂起,并告诉AMS我已经Paused了;

(4)AMS知道了Launcher已经挂起之后,就可以放心的为新的Activity准备启动工作了,首先,APP肯定需要一个新的进程去进行运行,所以需要创建一个新进程,这个过程是需要Zygote参与的,AMS通过Socket去和Zygote协商,如果需要创建进程,那么就会fork自身,创建一个线程,新的进程会导入ActivityThread类,这就是每一个应用程序都有一个ActivityThread与之对应的原因;

(5)进程创建好了,通过调用上述的ActivityThread的main方法,这是应用程序的入口,在这里开启消息循环队列,这也是主线程默认绑定Looper的原因;

(6)这时候,App还没有启动完,要永远记住,四大组建的启动都需要AMS去启动,将上述的应用进程信息注册到AMS中,AMS再在堆栈顶部取得要启动的Activity,通过一系列链式调用去完成App启动。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值