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

Apk打包-安装过程相关推荐

  1. Android程序打包安装过程

    Android程序打包安装过程 Android程序--编译打包--apk--签名--通过adb发布到设备上 编译打包:dx.bat:可以将bin目录下的classes文件.deseLibs依赖包打包成 ...

  2. 关于android3.0版本的apk打包安装失败的问题

    关于android3.0版本的apk打包安装失败的问题 最近遇到做项目遇到的一个坑,现在来总结一下,方便记录. 我用的as版本为3.0.1,直接连接电脑安装app是没有问题的,但是在签名打包apk以后 ...

  3. Android内核开发:浅析APK的安装过程

    本文是<Android内核>开发系列文章的第十篇,上一阶段,我们重点学习和分析了Android系统的启动过程,那么,从本文开始,准备介绍一下如何从Android源码中添加.修改.删除系统级 ...

  4. Apk打包-签名过程

    参考:http://blog.csdn.net/jiangwei0910410003/article/details/50402000 参考:http://blog.csdn.net/kickxxx/ ...

  5. 安卓逆向_1 --- 逆向环境配置、APK 文件结构、APK 打包流程

    哔哩哔哩:https://www.bilibili.com/video/BV1UE411A7rW?p=1 Android 逆向工程师系统培训‹第九期›( 课程目录 ):https://ke.yijin ...

  6. 【朝花夕拾】Android性能篇之(四)Apk打包

    前言 转载请声明,转自[https://www.cnblogs.com/andy-songwei/p/9721337.html],谢谢! APK,即Android Package,是将android程 ...

  7. 【SealDEV 倾情奉献】Android APK 安装过程详解

    开发 Android 应用后,一般都会安装到手机上去运行,了解应用是如何安装到手机上的,可以更好的理解应用的本质,理解应用是如何运行的,在自己开发的应用遇到一些问题时,会从更深层次去分析,快速定位找到 ...

  8. 深度探究apk安装过程

    一.先验知识 0.PcakageaManagerService版本变化 1.概述 2.PackageManagerService服务启动流程 3. PackageManagerService入口 二. ...

  9. Apk打包、安装、签名

    Apk组成 resources.arsc 编译后的二进制资源文件. classes.dex 是.dex文件.最终生成的Dalvik字节码. AndroidManifest.xml 程序的全局清单配置文 ...

最新文章

  1. 8.11. Migrating MySQL Data into Elasticsearch using logstash
  2. [BZOJ4403]序列统计
  3. python 语言教程(2)基础语法之标识符
  4. obs 推流编码在哪设置_OBS录屏软件
  5. BeanUtils.copyProperties 需要getset方法支持
  6. 网络编程释疑之:单台服务器上的并发TCP连接数可以有多少
  7. 【软考】[信息安全工程师]
  8. 统计学基础学习笔记:描述统计量
  9. 半自动化运维之服务器信息维护
  10. 解决2345劫持主页的办法--火绒2345专杀
  11. Altium Designer生成Gerber文件
  12. 计算机硬盘按数据传输,同时让多个硬盘轻松同步数据传输
  13. Scratch快速入门(一)
  14. svg 绘制多边形渐变边框并填充渐变背景
  15. 若个人计算机主板上的内存条松动,电脑内存条松动对电脑的影响与解决办法
  16. 正大国际期货:你身边有朋友或者亲人做期货挣钱的没有?
  17. 项目经理的核心竞争力
  18. TypeError: e[h] is not a function
  19. RISC-V_GD32VF103-对 Debug 设置
  20. 定义一个矩形类,有长、宽两个属性,用成员函数计算矩形的面积

热门文章

  1. Prometheus 使用 PushGateway 进行数据上报采集
  2. 【技巧】matlab中nanmedian、nanmean和median、mean的区别
  3. Type ‘() => Promise<typeof import(“/Users/982471938qq.com/jy-vue3-cms/src/views/login/login.vue“)>‘
  4. 在线汇率转换,用json解析数据,支持偏好设置。
  5. 三星 n7200 android 4.0 锁机 太多次尝试,三星Note8 N9500解锁教程_三星Note8 N9500怎么关闭OEM锁...
  6. 取消发送option请求_【JavaWeb】HTTP协议的请求与响应
  7. 高通Vuforia AR SDK CloudReco案例
  8. 毕业设计 单片机红外测距系统设计与实现 - 嵌入式
  9. 华为HCNA实验15-配置缺省静态路由
  10. easyUI 中datagrid 上下左右移动编辑器