Android编译打包的过程

2020-12-07  本文已影响0人  小水neo

本文所有内容都是通过网文加自己的实践得出的结论,没有找到官方参考书目,因此若有错误之处,欢迎指出。

编译打包的整体流程

编译打包的过程

aapt

(Android Asset Packaging Tool)编译和打包资源的工具

  1. 将资源文件编译成二进制文件

使用方法

  1. F:\AndroidStudio\sdk\build-tools\30.0.2添加到path环境变量
  2. 下载openhub的apk,

修改apk文件

  1. (aapt l)执行aapt list -v -a base.apk打印和apk相关的所有详细信息

    1. -a:会详细输出所有目录的内容
    2. -v:会以table的形式输出目录,
    3. table的表目有:Length、Method(压缩形式,deflate(同时使用了LZ77算法与哈夫曼编码(Huffman Coding)的一个无损数据压缩算法)Stored()直接存储,压缩率为0%)、Size、Ratio、Date、Time、CRC-32、Name。
  1. aapt r base.apk AndroidManifest.xml, 这个就是将apk中的AndroidManifest移除掉
  1. aapt a <*.apk> <要添加的文件路径>, 这个就是将文件添加到打包好的apk文件中

其中.class为字节码的形式,用Intellj可以直接反编译打开,看到其中的内容,发现相比于.java文件,已经做了一定的优化


用于生成apk

  1. 编译:aapt可以用于编译xml文件和图片文件

    aapt2 compile -o extrahub/app/src/main/res/values/strings.xml
    
  2. 链接:合并编译阶段生成的文件,然后将其打包成一个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
    
  3. Dump:打印通过link命令产生的APK文件的资源和配置文件

    aapt2 dump filename.apk [options]
    

apk文件分析
```


打开其中的文件全是火星文,之前一直遇到这种情况,这次深层次的百度了下,发现了不同的乱码其实也有规律可循。然而按照下述方法在FileEncoding里面转换,发现仍旧乱码,后来才得知AndroidManifest.xml已被编译成二进制文件,ps:下图为正常文件可能修复的方法:(与本文无关)

可以看到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解析方式

Pull解析方式

Dom解析方式

Q&A

  1. xml文件怎么打包到项目中?
  1. 如何通过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"。
  1. 配置文件打包的时候会进app吗,打在apk对应的哪个文件下?
    会打包进apk文件,打包在AndroidManifest.xml中
  2. flutter是怎么做到热部署,他的代码是怎么样快速应用到你的app上,而不需要走一个打包流程
    To be continued
上一篇 下一篇

猜你喜欢

热点阅读