本文所有内容都是通过网文加自己的实践得出的结论,没有找到官方参考书目,因此若有错误之处,欢迎指出。
编译打包的整体流程
![](https://img.haomeiwen.com/i15623627/afe196bba6036a7e.png)
aapt
(Android Asset Packaging Tool)编译和打包资源的工具
- 将资源文件编译成二进制文件
使用方法
- F:\AndroidStudio\sdk\build-tools\30.0.2添加到path环境变量
- 下载openhub的apk,
修改apk文件
-
(aapt l)执行aapt list -v -a base.apk打印和apk相关的所有详细信息
- -a:会详细输出所有目录的内容
- -v:会以table的形式输出目录,
- table的表目有:Length、Method(压缩形式,deflate(同时使用了LZ77算法与哈夫曼编码(Huffman Coding)的一个无损数据压缩算法)Stored()直接存储,压缩率为0%)、Size、Ratio、Date、Time、CRC-32、Name。
![](https://img.haomeiwen.com/i15623627/275c40d82c3d56f2.png)
- aapt r base.apk AndroidManifest.xml, 这个就是将apk中的AndroidManifest移除掉
![](https://img.haomeiwen.com/i15623627/ccaacc90c2a76948.png)
- aapt a <*.apk> <要添加的文件路径>, 这个就是将文件添加到打包好的apk文件中
其中.class为字节码的形式,用Intellj可以直接反编译打开,看到其中的内容,发现相比于.java文件,已经做了一定的优化
![](https://img.haomeiwen.com/i15623627/c6de44cec8bc2b5b.png)
用于生成apk
-
编译:aapt可以用于编译xml文件和图片文件
aapt2 compile -o extrahub/app/src/main/res/values/strings.xml
-
链接:合并编译阶段生成的文件,然后将其打包成一个apk文件。此外,在此阶段可以生成其他辅助文件,如R.java、ProGuard。但此时链接生成的apk文件并不全。
aapt2 link -o output.apk -I /Users/nxiangbo/Library/Android/sdk/platforms/android-28/android.jar myBuild/values_strings.arsc.flat myBuild/mipmap-xhdpi_ic_launcher.png.flat --manifest app/src/main/AndroidManifest.xml -v
-
Dump:打印通过link命令产生的APK文件的资源和配置文件
aapt2 dump filename.apk [options]
apk文件分析
```
![](https://img.haomeiwen.com/i15623627/79eaebc39bac3fe1.png)
打开其中的文件全是火星文,之前一直遇到这种情况,这次深层次的百度了下,发现了不同的乱码其实也有规律可循。然而按照下述方法在FileEncoding里面转换,发现仍旧乱码,后来才得知AndroidManifest.xml已被编译成二进制文件,ps:下图为正常文件可能修复的方法:(与本文无关)
![](https://img.haomeiwen.com/i15623627/a95eed5a8caf532e.png)
可以看到asset资源没有被改变
! (https://img.haomeiwen.com/i15623627/245ca8128f264d71.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
! (https://img.haomeiwen.com/i15623627/f005f457fce3005a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
res中的xml文件也被编译成了二进制,名字也发生了改变(混淆),但其中的png内容都是可以直接打开的。
! (https://img.haomeiwen.com/i15623627/2caf2a33ed808efb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
XML的解析方法
SAX解析方式
- 对xml文档进行逐行扫描,一边扫描一边解析。
- 当扫描到文档(document) 开始与结束、元素(element)开始与结束、文档(document)结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。
- 如果只需要文档前边或是中间一小部分数据,使用SAX解析就浪费了处理器资源,这时可以使用PULL解析
- 事件驱动的XML解析方式,在读到文档开始和结束标签时就会回调一个事件,
在读取到其他节点 与内容的时候也会回调一个事件
Pull解析方式
- PULL解析继承了SAX解析速度快、占用内存少等优点,
- 同时它也保持了接口简单、编程容易等特点。
- PULL解析器的工作方式为允许应用程序代码主动从解析器中获取事件,
- 正因为是主动获取事件,因此可以在满足了需要的 条件后不再获取事件,结束解析。
Dom解析方式
- DOM解析是W3C组织提供的标准,
- 把所有内容一次性的装载入内存,并构建一个驻留在内存中的树状结构,然后根据节点之间
的关系来解析XML。
Q&A
- xml文件怎么打包到项目中?
- 通过aapt的compile和link命令,将项目中的xml文件,编译链接到项目当中。
- 其中xml文件的具体内容,是以二进制形式存储在原项目的目录下的。
-
此外利用aapt在编译的同时,会对资源建立相应的ID,将布局资源、控件资源、String资源、Drawable资源等xml的文件ID统一存储到R.java之中用于索引,R.java会随着项目的源码一起被javac成class文件,后又被dx成.dex文件。R.java除了索引的功能以外,另一个功能是,如果res目录中的某个资源在应用中没有被使用到,在该应用被编译的时候系统就不会把对应的资源编译到该应用的APK包中,这样可以节省Android手机的资源。
R.java源码
- 如何通过R.java文件来引用到所需要的资源
2.1 在java类中使用
按照java的语法来引用即:R.resource_type.resource_name。此外安卓本身有很多资源文件可以使用,方法为头部加上Android.也就是Android.R.resource_type.resouce_name
2.2 在res目录下使用
通过“@drawable/icon”的方式获取,其中“@”代表的是R.java类,drawable”代表的是R.java中的静态内部类“drawable”,“/icon”代表静态属性“icon”,,而该属性可以指向res目录下的“drawable-*dpi”中的icon.png资源。此外相类似的也可以使用Android系统中自带的文件,方法为"@android:color/red"。
- 配置文件打包的时候会进app吗,打在apk对应的哪个文件下?
会打包进apk文件,打包在AndroidManifest.xml中 - flutter是怎么做到热部署,他的代码是怎么样快速应用到你的app上,而不需要走一个打包流程
To be continued
网友评论