美文网首页Android开发经验谈
Android再爱我一次(1)——APK打包流程

Android再爱我一次(1)——APK打包流程

作者: MinuitZ | 来源:发表于2018-09-27 17:39 被阅读7次

被xx跳动大佬使劲儿蹂躏了一把,赶紧回来总结总结

讲道理,从来没有关心过这个流程。平时直接IDE里面builder APK,就能生
成自己所需要的东西了,但这背后的故事,你知道么?


我们先偷一张图:


image.png

1. 目标与原料

首先,看我们有什么东西:
这里所说的工程目录并不是说工程结构,我们只考虑在打包过程中,需要分类的几种资源。在使用AS写代码中,我们一般会涉及一下几种:

  1. 可二进制的资源文件
  2. 不可二进制资源文件(如raw,assets目录中)
  3. aidl文件
  4. java源代码(.kt的大佬放过我)
  5. lib包与module依赖

接下来的步骤,就是将不同的资源分别处理
我们的目标是什么呢,一个apk文件。其实apk文件是可以被解压缩的,将后缀改为.zip即可解压缩。我这里演示一个未加固的apk文件解压


2. 分析图中流程

1. aapt
aapt用来打包res资源文件,生成R.java、resources.arsc和res文件(二进制 & 非二进制如res/raw和pic保持原样)

  • res资源文件有很多文件:animator,anim,color,drawable,layout,menu,raw,value,xml。
  • R.java
    大家肯定不会陌生,在编译过程中,它会存储已系列的整形索引来查找引用目标文件。大家都用过就不多解释了:


  • resources.arsc
    这个文件记录了所有的应用程序资源目录的信息,包括每一个资源名称、类型、值、ID以及所配置的维度信息,即资源索引表。为什么我们可以通过整形的Id值就能拿到想要的资源呢,靠的就是这个家伙了。

2. aidl
aidl指令可以将aidl文件生成对应的接口文件,我们在代码中接触过,不过多解释了
3. java compile
通过Java Compiler编译R.java,.interface、.java,生成.class文件。
4. dex
将.class文件和第三方库中的.class文件处理生成dex文件,如果使用了MutiDex,将生成多个dex包,比如我的项目。
5. apkBuilder
*.dex、resources.arsc、res文件夹(res/raw资源被原装不动地打包进APK之外,其它的资源都会被编译或者处理)、Other Resources(assets文件夹)、AndroidManifest.xml打包成apk文件。
注意:
res/raw和assets的相同点:
两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。
res/raw和assets的不同点:
1.res/raw中的文件会被映射到R.java文件中,访问的时候直接使用R文件的内部类的值即可;assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager,该类的实例可以直接在Context中使用,但其构造方法被标记了@hide。若需要初始化,需要利用反射。
2.res/raw不可以有目录结构,而assets则可以有目录结构,也就是assets目录下可以再建立文件夹
6. JarSigner
签名阶段。
一个Android应用程序没有经过数字签名,是没有办法安装到系统中的。我们直接运行的时候好像没有签名阶段啊,其实为了方便我们开发调试程序,IDE已经自动的使用debug密钥为应用程序签名。
用过加固的老哥们会说了,为什么加固之后会要求重新签名呢?
先甩一个连接,之后研究研究吧 eofguo

7. zipalign
对压缩包进行对其处理(不知道有什么用)

相关文章

网友评论

    本文标题:Android再爱我一次(1)——APK打包流程

    本文链接:https://www.haomeiwen.com/subject/ticnwftx.html