Android打包过程

一、Android打包过程简述

首先使用AAPT工具将资源文件编译为R.java文件,使用AIDL工具将所有aidl文件生成相应的java文件。使用javac把项目中所有java文件比如R.java文件、aidl生成的java文件和java代码编译成class文件。然后使用dex工具将所有class文件转换成Dalivk可执行的dex文件,使用ApkBuilder将所有文件打包生成未签名的APK文件。对apk文件进行签名,使用ZipAlign优化apk文件,减少apk在设备上的运行内存。

二、Apk各个打包工具的作用:

可以在Android/sdk/build-tools/目录下可以看到这些工具
|名字|功能|
|:——|:——|
|AAPT/APT2|Android 资源打包工具|
|AIDL|将 AIDL 接口转化为 Java 接口|
|Javac(Java Compiler)|将Java 代码编译成 Class文件|
|Dx|将 Class 文件编译成 Dex 文件|
|Apkbuilder|将处理后的资源和代码打包生成 APK 文件|
|Jarsigner/Apksigner|对未签名的 APK 文件进行签名|
|Zipalign|优化签名后的 APK,减少运行时所占用的内存|

三、APK文件构成

APK 文件大概可以分为两个部分:代码和资源。

1、先将资源文件进行编译。

Android资源大概分为两个部分:assets和res。

(1)assets资源

Assets资源放在assets目录下,assets文件会原封不动的被打包进APK文件。通过AssetManager来获取asset资源。代码如下:

AssetManager assetManager = context.getAssets();
InputStream is = assetManager.open("fileName");

(2)res资源

res资源放在主工程的res目录下,这类资源一般都会在编译阶段生成一个资源ID供我们使用。
注:除了 assets 和 res/raw 资源被原装不动地打包进 APK 之外,其它的资源都会被编译或者处理。

2、对代码进行编译。

代码部分通过 Javac 将 Java 代码编译成 Class 文件, 然后通过 Dex 工具将 Class 文件编译成 Dex 文件。

四、APK构建过程

1、使用AAPT工具将资源文件生成R.java文件

AAPT(Android Asset Packaging Tool)android 资源打包工具,将资源文件(包括AndroidManifest.xml、布局文件、各种xml资源等)打包生成R.java文件,将AndroidManifest.xml生成AndroidManifest.java文件。
从 Android Studio 3.0 开始,google 默认开启了 AAPT2 作为资源编译的编译器。

2、将AIDL 接口转化为 Java 接口

使用AIDL(android interface definition定义 language),位于sdk/build-tools目录下的aidl工具。将所有aidl文件生成相应的java文件。

3、将java代码编译成class文件

使用javac(java compiler)把项目中所有的java文件编译成class文件。包括java源文件、AAPT生成的R.java文件以及aidl生成的java接口文件。

4、将class文件编译成dex文件

使用dex工具将所有的class文件(包括三方库中的class文件)转换成dex文件(Dalivk可执行文件,其中包括在Android设备上运行的字节码)。

5、打包生成APK文件

使用 Apkbuilder(主要用到的是 sdk/tools/lib/sdklib.jar 文件中的 ApkBuilderMain 类)将所有的 Dex 文件、Resource.arsc、Res 文件夹、Assets 文件夹、AndroidManifest.xml 打包生成 APK 文件(未签名)。

6、对APK文件进行签名

使用Apksigner(APK签名及验证工具)或Jarsigner(jdk提供的针对jar包的签名工具)对未签名的apk文件进行签名。

7、优化APK文件

使用zipalign对签名后的APK文件进行对齐处理,这样可以减少apk在设备上运行时所占用的内存。

五、V1和V2签名

1、简介

在 Android Studio 中点击菜单 Build->Generate signed apk… 打包签名过程中,可以看到两种签名选项 V1(Jar Signature) 和 V2(Full APK Signature)。

  • Jarsigner 是 JDK 提供的针对 JAR 包签名的通用工具
  • Apksigner 是 Google 官方提供的针对 Android APK 签名及验证的专用工具
    从Android 7.0 开始, 谷歌增加新签名方案 V2 Scheme (APK Signature),但Android 7.0 以下版本, 只能用旧签名方案 V1 scheme (JAR signing)

    2、V1(Jar Signature)签名

    来自 JDK(Jarsigner),对 ZIP 压缩包的每个文件进行验证, 签名后还能对压缩包修改(移动/重新压缩文件),对 V1 签名的 APK/JAR 解压,在 META-INF 存放签名文件(MANIFEST.MF, CERT.SF, CERT.RSA), 其中 MANIFEST.MF 文件保存所有文件的 SHA1 指纹(除了 META-INF 文件), 由此可知: V1 签名是对压缩包中单个文件签名验证

    3、V2(Full APK Signature)签名

    来自 Google(apksigner), 对 ZIP 压缩包的整个文件验证, 签名后不能修改压缩包(包括 zipalign), 对 V2 签名的 APK 解压, 没有发现签名文件, 重新压缩后 V2 签名就失效, 由此可知: V2 签名是对整个 APK 签名验证

    4、V1和V2签名总结

  • V1 签名是对压缩包中单个文件签名验证
  • V2 签名是对整个 APK 签名验证
  • zipalign 可以在 V1 签名后执行
  • zipalign 不能在 V2 签名后执行,只能在 V2 签名之前执行
  • V2 签名更安全(不能修改压缩包)
  • V2 签名验证时间更短(不需要解压验证), 因而安装速度加快

    5、v1和v2的签名使用

    1)只勾选v1签名并不会影响什么,但是在7.0上不会使用更安全的验证方式
    2)只勾选V2签名7.0以下会直接安装完显示未安装(只勾选V2会导致 7.0 以下的安卓机出现 INSTALL_PARSE_FAILED_NO_CERTIFICATES 的问题),7.0以上则使用了V2的方式验证
    3)同时勾选V1和V2则所有机型都没问题

    6、代码配置选择v1和v2签名

    signingConfigs {
      debug {
          v1SigningEnabled true
          v2SigningEnabled true
      }
      release {
          v1SigningEnabled true
          v2SigningEnabled true
      }
    }
    

    7、通过命令行查看v1、v2是否为true

    apksigner verify -v —print-certs nade.apk
    如果失败,需要配置环境变量path。
    效果如图:
    图片
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值