APK的安装原理

一个apk包中一般包含以下文件

1、assets目录:保留工程中asset目录,其它工程下的、jar包中的asset也会合并到该assets目录下

assets目录在工程中主要用于存放一些较大的资源文件,例如:图片、音乐、字体等。

2、lib目录:由于编译的时候jar文件已经合并到主工程中,lib中包含所有的so文件,so目录的路径保留原有路径(CPU类型)

3、META-INF目录:信息描述,签名等用途

4、res目录:工程资源文件,以主工程为主,其它文件合并,values文件将不会出现在此目录下,因为已经将其编译到resouces.arsc文件中,raw文件将保持原有内容不会被编译。

5、AndroidManifest文件:清单文件,用来做组件查找

6、classes.dex文件:所有的class集合,虚拟机执行的文件

7、resources.arsc:系统资源文件索引,包含一些系统信息

安装过程的时候实际上就是将APK文件放到特定的目录下,并且生成与此应用有关的文件,应用级的应用一般放到data/app下,系统级应用放到system/app下。

之前有过的一篇讲解Resources和AssetManager,这时候资源的路径就指向了这个apk文件,就可以取得到需要的资源了。dex也是一个道理,dex文件是通过DexClassLoader来加载的,所以也就是如果我们在程序中使用加载器加载指定的dex文件就可以实现动态的加载,Facebook分dex包也是基于这种方式来做的。至于为什么要分多个dex文件,以下给出解释:

因为一个应用只会拥有越来越多的功能,但随着工程越来越大,而Android方法数量不能超过65K,如果超出之后,将会抛出Conversion to Dalvik format failed:Unable to execute dex:method ID not in[0,0xffff]65536。由于Android系统中,一个Dex文件中存储方法的id用的是short类型数据,所以导致你的dex中方法数不能超过65K,在2.3系统之前,虚拟机的内存只分配了5M,所以去掉一些无用的jar包,将一些属性设置为public,从而可以去掉get/set方法来压缩方法数量。

---------------------------------------------------------------------------------------------------------------------------------------------------------

讲完了apk的构成,那么apk是如何打包生成的呢?

首先android的资源是通过打包工具aapt(Android Assest Package Tool)打包到apk文件中的。在打包之前,大部分文本格式的xml资源文件还会被编译成二进制格式的xml资源文件,这些xml资源文件之所以要从文本格式编译成二进制格式,是因为:

1、二进制格式的XML文件占用空间更小。这是由于所有XML元素的标签、属性名称、属性值和内容所涉及到的字符串都会被统一收集到一个字符串资源池中去,并且会去重。有个这个字符串资源池,原来使用字符串的地方就是被替换成一个索引到字符串资源池的整数值,从而可以减少文件的大小。

2、二进制格式的xml文件解析速度更快。这是由于二进制格式的xml元素里面不再包含有字符串值,因此就避免了进行字符串解析,从而提高速度。

将xml资源文件从文本格式编译成二进制格式解决了空间占用以及解析效率的问题,但是对于android资源管理框架来说,这只是其中的一部分,android资源管理框架还有个更重要的任务——根据资源ID来快速找到对应的资源。

为了能让用户有最好的体验,为了支持android资源管理框架快速定位最匹配资源,android资源打包工具aapt在编译和打包资源的过程中,会执行以下两个额外的操作:

1、赋予每一个非assets资源一个ID值,这些ID值以常量的形式保存在R.java文件中。

2、生成一个resources.arsc文件,用来描述那些具有ID值的资源的配置信息,他的内容就相当于是一个资源索引表。

有了资源ID和索引表以后,android资源管理框架就可以迅速根据当前设备配置信息来定位最匹配的资源了。

============================================================

先理解这么多,至于aapt打包工具的工作流程就先不理解了。

时间: 2024-10-08 20:50:31

APK的安装原理的相关文章

【原理】Apk的安装过程

Apk的安装过程分两步: 一.apk文件复制到程序目录下(/data/app/) 二.为应用创建数据目录(/data/data/package name/) 提取dex文件到指定目录(/data/dalvik-cache/) 修改系统包管理信息

apk下载安装,存储的位置,路径

PackageInstaller 原理简述 应用安装是智能机的主要特点,即用户可以把各种应用(如游戏等)安装到手机上,并可以对其进行卸载等管理操作.APK是Android Package的缩写,即Android安装包.APK是类似Symbian Sis或Sisx的文件格式.通过将APK文件直接传到Android模拟器或Android手机中执行即可安装. Android应用安装有如下四种方式 1.        系统应用安装――开机时完成,没有安装界面 2.        网络下载应用安装――通过

Android7.0下载Apk自动安装

Android7.0下载Apk自动安装 1. 整体需求 下载APK文件 使用DownloadManager来下载 在应用界面中展示下载进度 安装下载后的APK文件 root模式: 可以自动安装,不需要用户主动点击 正常模式: 弹出安装应用页面,需要兼容7.0以上版本 2. DownloadManager DownloadManager是Android提供的用于下载的类,使用起来比较简单,它包含两个静态内部类DownloadManager.Query和DownloadManager.Request

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

本文是<Android内核>开发系列文章的第十篇,上一阶段,我们重点学习和分析了Android系统的启动过程,那么,从本文开始,准备介绍一下如何从Android源码中添加.修改.删除系统级别的APP应用.作为开篇,我们先从简单的理论入手,介绍一下Android系统中的APK文件究竟是个什么东西?它是如何安装到系统中去的? 我们在学习和了解一项新事物的时候,最快速的方法往往是与已知的事物进行比较,因此,我们首先来简单聊一聊Windows应用程序的安装过程. 1.  一般Windows应用程序的安

(转)获取android手机内部存储空间和外部存储空间的参数 &amp;&amp; 如何决定一个apk的安装位置

转:http://blog.csdn.net/zhandoushi1982/article/details/8560233 获取android文件系统的信息,需要Environment类和StatFs类的支持. (1)Environment 是一个提供访问环境变量的类,常用的方法有: A,getRootDirectory() ,返回File,获取Android 的根目录. B,getDataDirectory() ,返回File ,获取Android 数据目录. C,getExternalSto

Android APK免安装启动

Android APK免安装启动 在讲诉具体实现之前说一下涉及的知识点 Java虚拟机启动流程 启动Java虚拟机,创建ClassLoader,将java字节码加载进入ClassLoader,随即找到入口函数,执行.当需要创建一个对象的时候,向Java虚拟机发送一个请求,Java虚拟机接收到请求以后,首先在内存中进行寻找,若存在,则解析class,找到相应的方法执行.若内存中不存在,则让ClassLoader对相应的.class文件通过import 路径进行加载到内存中,然后进行解析,找到对应的

Android apk的安装、卸载、更新升级(通过Eclipse实现静默安装)

一.通过Intent消息机制发送消息,调用系统应用进行,实现apk的安装/卸载 . (1) 调用系统的安装应用,让系统自动进行apk的安装 String fileName = "/data/data/com.zlc.ipanel.operate/FileOperate.apk";  Uri uri = Uri.fromFile(new File(fileName));  Intent intent = new Intent(Intent.ACTION_VIEW);  intent.se

linux PXE安装原理及关注点

因有学生面试遭卡 ,咨询!特此一些详解,希望实用. 第一步:PXE Client向DHCP发送请求 首先,将支持PXE的网络接口卡(NIC)的客户端的BIOS设置成为网络启动,通过PXE BootROM(自启动芯片)会以UDP(简单用户数据报协议)发送一个广播请求,向网络中的DHCP服务器索取IP地址等信息. 第二步:DHCP服务器提供信息 DHCP服务器收到 客户端的请求,验证是否来至合法的PXE Client的请求,验证通过它将给客户端一个"提供"响应,这个"提供&quo

从一个内置apk中安装另一个内置的apk

单击内置的apk,安装已经内置到系统中的apk package com.wind.bbminstaller; import java.io.File; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; public class MainActivity extends Activity { static final int RE