App的打包过程
打包过程:
- 使用aapt来打包res资源文件,生成R.java、resources.arsc和res文件
- 处理.aidl文件,生成对应的Java接口文件
- 通过Java Compiler编译R.java、Java接口文件、Java源文件,生成.class文件
- 通过dex命令,将.class文件和第三方库中的.class文件处理生成classes.dex
- 痛殴apkbuilder打包成apk
- 对apk进行签名,可以进行Debug和Release 签名
- release mode 下使用 aipalign进行align,即对签名后的apk进行对齐处理
https://www.jianshu.com/p/7c288a17cda8
App的安装过程
安装过程:
- 复制APK安装包到/data/app目录下,解压缩并扫描安装包,
- 向资源管理器注入APK资源,
- 解析AndroidManifest文件,并在/data/data目录下创建对应的应用数据目录,
- 然后针对Dalvik/ART环境优化dex文件,保存到dalvik-cache目录,
- 将AndroidManifest文件解析出的组件、权限注册到PackageManagerService并发送广播
https://blog.csdn.net/mysimplelove/article/details/93619361
卸载过程
删除安装过程中在上述三个目录下创建的文件及目录
源码分析
-
通过PackageManagerService来操作,而它早在系统启动SystemServer时便注册好了,SystemServer则由init进程启动
-
初始化系统上下文时,生成了ActivityThread ,它相当于系统的主线程,我们看systemMain方法
-
当调用为系统线程时,attach会执行else代码,创建Instrumentation和上下文,我们接着看启动包管理器服务的方法startBootstrapServices
-
SystemServer启动了许多服务,PackageManagerService通过main方法创建,并将系统上下文和mInstaller工具类传递进去
-
当一个新应用程序,要安装并运行在Linux中时,系统需要先为其开辟一个用户空间,并分配Linux独立用户pid或共享用户uid,由PackageManagerService完成
-
每次系统重启时,都需要对程序做一次重新安装,为了提高效率,程序在第一次安装时,PMS会将安装信息进行保存,以便再次安装时进行快速恢复,settings就是用来保存这些信息的对象
-
安装包信息数据是通过xml进行存储的,双备份,双次检测
Xml以package为根标签保存了一个应用的完整信息,所以从package标签开始解析包数据 -
每个应用程序的安装信息都是用PackageSetting对象来存储,并以包名为key,保存在mPackages这个HashMap中,如果程序已安装过,直接从mPackages获取。如果第一次安装,将构建一个PackageSetting对象来保存信息
-
用户类型的pid都在10000到19999之间,说明Android系统只分配9999个给用户类型的程序,小于10000保留给特权用户使用,但这些id也可以通过共享的方式给用户程序使用
-
解析编译后的AndroidManifest-解析application标签
包名、应用名还有4大组件都被解析出来了。这里注意到有个owner,它是在parseBaseApk里根据包名生成的Package对象,Manifest标签解析后的数据都存在此对象中。 -
Package是PackageParser解析器的内部类,Package用了四个列表分别保存四大组件
-
系统中所有已安装的程序都用Package来描述,而这些Package就保存在mPackages 中,而每一个应用的四大组件都分别保存在mActivities 、mReceivers 、mServices 和mProviders 中
public final static class Package {
public String packageName;
public String[] splitNames;
public String codePath;
public String baseCodePath;
public String[] splitCodePaths;
public int[] splitFlags;
public boolean baseHardwareAccelerated;
public final ApplicationInfo applicationInfo = new ApplicationInfo();
public final ArrayList<Permission> permissions = new ArrayList<Permission>(0);
public final ArrayList<PermissionGroup> permissionGroups = new ArrayList<PermissionGroup>(0);
//保存四大组件
public final ArrayList<Activity> activities = new ArrayList<Activity>(0);
public final ArrayList<Activity> receivers = new ArrayList<Activity>(0);
public final ArrayList<Provider> providers = new ArrayList<Provider>(0);
public final ArrayList<Service> services = new ArrayList<Service>(0);
题目
清除数据和清除缓存的区别
清除数据包括你的sp内容,sqlite数据库等
清除缓存应该就是内存占用的数据回收吧。不会影响存储在sdk卡上的内容
学习参考博客
https://www.jianshu.com/p/96460db33416
https://blog.csdn.net/u012267215/article/details/88313259
App桌面图标显示过程
当系统完成各种服务的注册和启动后,将调用AMS的systemReady方法作为入口,让AMS启动Launcher界面
Launcher根据android.intent.action.MAIN和android.intent.category.LAUNCHER两个条件,将应用入口封装成一个快捷图标,就能启动跳转到对应的程序
获取成功返回一个ProcessRecord对象
它是对应用程序进程的描述,如果存在,则调用realStartActivityLocked开启新的Activity;如果不存在,将执行startProcessLocked方法通知Zygote启动新进程。我们先看AMS如何通知的
所有应用程序信息已经加载完成,保存到mBgAllAppsList中,mBgAllAppsList把应用程序的数据封装成AppInfo类型的
系统用一个ProcessRecord类来描述一个应用程序的进程,由于系统还没有启动过任何程序,getProcessRecordLocked首次将返回null。
mStackSupervisor是ActivityStackSupervisor类型,对任务栈管理器ActivityStack的管理,
ActivityStack则是对任务栈TaskRecord的管理,而每个Activity在任务栈中都使用ActivityRecord来进行描述。
我们通常所说的Activity入栈,指的就是将ActivityRecord添加到对应的TaskRecord中
ProcessRecord的成员变量thread则持有ApplicationThread的远程代理接口IApplicationThread ,因此AMS和ActivityThread能进行通讯
题目
安装了app,在界面看不到图片icon?
有的系统有时候会偶现会这样,一般重启手机会好
之前遇到过华为手机出现过这个问题:
华为应用市场,点击下方的“管理”,点击进入“安装管理”-设置单项权限-创建桌面快捷方式
学习参考博客
https://www.jianshu.com/p/fa1ad6cf7b2a
Android资源访问机制
https://blog.csdn.net/heng615975867/article/details/81191106
PackageManagerService
PackageManagerService是Android系统核心服务之一,在Android中的非常重要,主要负责的功能如下:
. 解析 AndroidManifest.xml,主要包括AndroidManifest中节点信息的解析和target-name的分析和提炼
. 扫描本地文件,主要针对apk,主要是系统应用、本地安装应用等等。这部分会在下面仔细讲解。
. 管理本地apk,主要包括安装、删除等等
权限扫描
PackageManagerService在systemReady()后,进行了/system/etc/permissions中的各种xml进行扫描,进行相应的权限存储
Apk扫描
APK的安装流程
生成的APK文件本质还是一个zip文件,只不过被Google强行修改了一下后缀名称而已。所以我们将APK的后缀修改成.zip就可以查看其包含的内容了。
APK的打包过程