当前位置: 首页 > article >正文

Android APK的打包流程_android apk打包流程

-k com.package.test2
-t android-23
-p./PackageTest2


### 2.编译R文件



aapt package
-f
-J./gen
-M./AndroidManifest.xml
-S ./res/
-I /Users/RadAsm/Library/AndroidSDK/sdk/platforms/android-23/android.jar


### 3.编译源代码文件



Javac -source 1.6
-target 1.6
-cp /Users/RadAsm/Library/AndroidSDK/sdk/platforms/android-23/android.jar
./src/com/packtest/test1/MainActivity.java./src/com/packtest/test1/R.java
-d./gen/classes


### 4.编译DEX文件



dx --dex
–verbose
–output ./gen/dex/packtest1.dex
./gen/classes/


### 5.生成APK文件



aapt package
-f
-J./gen
-M./AndroidManifest.xml
-S ./res/
-I /Users/RadAsm/Library/AndroidSDK/sdk/platforms/android-23/android.jar
-F ./output/res.apk


### 6.APK文件对齐



zipalign -v-p 4 packagetest_unsigned.apk packagetest_aligned_unsigned.apk


### 7.APK签名



apksigner sign --ks my-release-key.jks my-app.apk


以上便是APK打包的整个流程,我们再来总结一下:  
 1.除了assetsi和res/raw资源被原装不动地打包进APK之外,其它的资源都会被编译或者处理;  
 2.除了assets资源之外,其它的资源都会被赋予一个资源ID;  
 3.打包工具负责编译和打包资源,编译完成之后,会生成一个resources.arsc文件和一个R.java,前者保存的是一个资源索引表,后者定义了各个资源D常量。  
 4.应用程序配置文件AndroidManifest…xml同样会被编译成二进制的XML文件,然后再打包到APK里面去。  
 5.应用程序在运行时通过AssetManager来访问资源,或通过资源D来访问,或通过文件名来访问.  
 理解了整体的流程,我们再来看看具体的细节。


## 资源的编译和打包


在分析资源的编译和打包之前,我们先来了解一下Android程序包里有哪些资源。  
 我们知首Android应用程序的设计也是代码与资源相分离的,Android的资源文件可以分为两大类:  
 assets:assets资源放在主工程assets目录下,它里面保存一些原始的文件,可以以任何方式来进行组织,这些文件最终会原封不动的地被打包进APK文件中。  
 获取asset资源也十分简单,如下所示:



InputStream is getAssets.open(“fileName”);


res:res资源放在主工程的res目录下,这类资源一般都会在编译阶段生成一个资源ID供我们使用。  
 res资源包含了我们开发中使用的各种资源,具体说来:  
 animator  
 anim  
 color  
 drawable  
 layout  
 menu  
 raw  
 values  
 Xml


上述9种类型的资源文件,除了raw类型资源,以及Bitmap文件的drawable类型资源之外,其它的资源文件均为文本格式的XML文件,它们在打包的过程中,会被编译成二进制格式的XML文件。这些二进制格式的XML文件分别有一个字符串资源池,用来保存文件中引用到的每一个字符串,包括XL元素标签、属性名称、属性值,以及其它的一切文本值所使用到的字符串。这样原来在文本格式的XML文件中的每一个放置字符串的地方在二进制格式的XML文件中都被替换成一个索引到字符串资源池的整数值,这写整数值统一保存在R.javai类中,R.java会和其他源文件一起编译到APK中去。  
 前面我们提到xml编写的Android资源文件都会编译成二进制格式的xm文件,资源的打包都是由AAPT工具来完成的,资源打包主要有以下流程:  
 1.解析AndroidManifest.xml,获得应用程序的包名称,创建资源表。  
 2.添加被引用资源包,被添加的资源会以一种资源ID的方式定义在R.javat中。  
 3.资源打包工具创建一个AaptAssetsi对象,收集当前需要编译的资源文件,收集到的资源保存在AaptAssets对象对象中。  
 4.将上一步AaptAssets对象保存的资源,添加到资源表ResourceTable中去,用于最终生成资源描述文件resources.arsC。  
 5.编译values类资源,这类资源包括数组、颜色、尺寸、字符串等值。  
 6.给bag、style、.arrayi这类资源分配资源ID。  
 7.编译xml资源文件,编译的流程分为:①解析xm文件②赋予属性名称资源D③解析属性值④将xm文件从文本格式转换为二进制格式,四步。  
 8.生成资源索引表resources…arsc。


## 资源ID


每个Android项目里都有有一个R,java文件,如下所示:



public final class R
//…
public static final class anim
public static final int abc_fade_in=0x7f010000;
}
public static final class attr
public static final int actionBarDivider=0x7f020000;
}
public static final class string
public static final int actionBarDivider=0x7f020000;
}
//
}


每个资源项后的整数就是资源D,资源D是一个4字节的无符整数。  
 最高字节是Package ID表示命名空间,标明资源的来源,Android系统自己定义了两个Package ID,系统资源命名空间:0x01和应用资源命名空间:0x7f。  
 次字节是Type ID,表示资源的类型,例如:anim、color、string等。  
 最低两个字节是Entry ID,表示资源在其所属资源类型中所出现的次序。  
 资源索引上面提到,最终生成的是资源索引表resources.arsc,Android正是利用这个索引表根据资源D进行资源的查找,为不同语言、不同地区、不同设备提供相对应的最佳资源。查找和通过Resources和AssetManger来完成的,这个我们下面会讲。  
 resources.arsc索引表从上至下文件格式依次为:


* 文件头:数据结构用ResTable\_header来描述,用来描述整个文件的信息,包括文件头大小,文件大小,资源包Package的数量等信息。
* 全局字符串池:存放所有的字符串,所以资源复用这些字符串,字符串里存放的是资源文件的路径名和资源值等信息。
* 资源包:会有多个(例如:系统资源包、应用资源包)。


资源包也被划分为以下几个部分:


* 包头:描述资原包相关信息。
* 资源类型字符串池:存放资源的类型。
* 资源名称字符串池:存放资源的名称。  
 配置列表:存放语音、位置等手机配置信息,用来作为查找资源的标准。


从这里可以看到resources.arsc索引表存在很多常量池,常量池的使用目的也很明显,就是提供资源的复用率,减少resources.arsc索引表的体积,提高索引效率。


http://www.kler.cn/a/511721.html

相关文章:

  • Linux自动挂载磁盘的方法
  • 内存故障原因与诊断(Reasons and Diagnosis of Memory Failure)
  • opencv笔记2
  • http://noi.openjudge.cn/——4.7算法之搜索——【169:The Buses】
  • C# 解析 HTML 实战指南
  • 【Linux系统编程】—— 深度解析进程等待与终止:系统高效运行的关键
  • iOS UIScrollView的一个特性
  • (k8s)k8s部署mysql与redis(无坑版)
  • opengrok_windows_环境搭建
  • 云原生周刊:K8s 生产环境架构设计及成本分析
  • pthread_exit函数
  • HTML之拜年/跨年APP(改进版)
  • 基于Java+SpringBoot+Vue的前后端分离的家具网站
  • 大数据学习(36)- Hive和YARN
  • Auto-go 环境配置
  • 华为升腾算子开发(一) helloword
  • 使用vscode在本地和远程服务器端运行和调试Python程序的方法总结
  • 游戏画面总是卡顿 原因及解决方法
  • 第 3 章 核心处理层(中)
  • Elixir语言的文件操作
  • 【初阶数据结构】探索数据的多米诺链:单链表
  • 跳石头,,
  • 【机器学习】嘿马机器学习(科学计算库)第11篇:Pandas,学习目标【附代码文档】
  • TensorFlow深度学习实战——情感分析模型
  • SpringCloud系列教程:微服务的未来(十四)网关登录校验、自定义过滤器GlobalFilter、GatawayFilter
  • 应急管理大数据指挥中心解决方案