zoukankan      html  css  js  c++  java
  • 安卓工程的启动过程

    1、Eclipse将.java源文件编译成.class

    2、使用dx工具将所有.class文件转换为.dex文件

    3、再将.dex文件和所有资源打包成.apk文件

    4、将.apk文件安装到虚拟机完成程序安装

    5、启动程序 – 开启进程 – 开启主线程

    6、创建Activity对象 – 执行OnCreate()方法

    7、按照main.xml文件初始化界面

     

    应用程序启动:

    一、解析清单文件并加载

    应用程序的启动需要从PackageManagerService说起,由于应用程序是有PackageManager管理的,可以简单认为PackageManagerService是为应用程序启动的做了一些准备工作,才能将应用程序开启起来。

    1、PackageManagerService(资料)读取所有应用程序的Mainfest信息,并且建立信息库存储在系统级共享内存中

    1)解析:

    PackageManagerService在启动后,会进行解析的工作,它会重点监控一些文件:system/framework、system/app、data/app、data/app_private;一旦将数据存入到这些文件中,就会去解析

    2)权限分配:

    PackageManagerService会建立底层userids和groupids同上层permissions之间的映射,就会给一些底层用户分配权限,

    进行权限的映射,UID和GroupID,都会分配相应的权限

    3)保存数据:

    PackageManagerService还有重要的一个操作就是将解析的每个apk的信息保存到packages.xml和packages.list文件里,

    在packages.list记录了如下数据:pkgName,userId,debugFlag,dataPath(包的数据路径)

    【下次再开机的时候,不会再扫描每个apk了,只需要读取packages.xml和packages.list文件即可】

    除了这两个主要的工作外,还会进行一些其他的操作,如检测文件等

    2、Launcher就将PackageManagerService已经解析并处理好的数据都加载到内存中,从内存中就能获取到相应的数据,

    并展示到手机上【之所以可以展示在手机桌面上,就是因为在清单文件中配置了如下的内容:】

                  <action android:name="android.intent.action.MAIN" />:应用程序的入口

    <category android:name="android.intent.category.LAUNCHER" />:配置了这个属性就可以显示在列表中

    点击图标,应用就被开启起来了:

  • 相关阅读:
    centos7查看系统版本,查看机器位数x86-64
    CentOS7下安装mysql5.6修改字符集为utf8并开放端口允许远程访问
    CentOS7下mysql5.6修改默认编码
    使用swagger作为restful api的doc文档生成
    在idea中maven项目jdk编译version总是跳到1.5
    国内maven镜像,快的飞起
    醒悟,珍惜时间,学会利用资源
    重定向Http status code 303 和 302
    jackson简单使用,对象转json,json转对象,json转list
    2017 年度码云新增项目排行榜 TOP 50,为它们打“call”
  • 原文地址:https://www.cnblogs.com/dubo-/p/6676251.html
Copyright © 2011-2022 走看看