Apk打包-安装过程

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的打包过程

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值