打开一个 apk,忽然发现res 下没有我们熟知的 xxhdpi,xxxhdpi,替之的是:
drawable-xxhdpi-v4
drawable-xxxhdpi-v4
为什么会这样呢?
更多问答 >>
-
每日一问 gradle项目构建,需要经历哪些核心task,整个构建流程哪些我们可以干涉?
2019-09-15 23:29 -
2019-09-15 23:30
-
2019-09-17 22:41
-
2019-09-23 01:01
-
2019-09-25 21:58
-
2019-09-09 00:19
-
2019-09-04 23:33
-
2019-09-01 23:16
-
每日一问 Parcelable 为什么效率高于 Serializable ?
2019-08-26 00:02 -
每日一问 今天聊一下Gradle 相关,BuildConfig这个类是如何生成的?
2019-08-20 23:27
“drawable-xxhdpi-v4”,后面的“v4”,就是最低兼容的版本,比如res下的“drawable-xxhdpi-v28”和“drawable-xxhdpi-v21”这两个文件夹下都有个"ic_test.png",那么在运行的时候,9.0系统的手机显示的就是“v28”文件夹下的,而5.0的手机就显示"v21"的(如果这两张图片内容不一样的话就很容易看出来)。
那么在做兼容的时候,比如要兼容到4.0,但项目中又用到了5.0以后才有的ripple效果,那就可以把这个用到了ripple的xml,放在"drawable-v21"文件夹里,同时保留原来drawable下的selector,这样,5.0以上系统,就会有ripple效果,而4.4及以下,则继续使用drawable下用selector实现的反馈效果。
这些看着像是多出来的资源文件夹,其实就是项目中依赖的那些module或library里面的资源。
我们自己模块下的资源,打包出来的位置是不会变的,也就是还是会在原来的文件夹里。随便打开一个依赖了androidx的apk,会发现res里面多了很多主模块本来没有的xml,随便点开一个文件夹,比如"drawable-21",会看到有个"abc_btn_colored_material.xml",在项目中全局搜,会看到在AppCompatDrawableManager中有引用到:
而这个AppCompatDrawableManager是androidx包名下的类(androidx.appcompat.widge),那么可以断定,"drawable-21"文件夹下的"abc_btn_colored_material.xml"就是项目中所依赖的androidx带来的。
小缘试下题目里面提供的项目和打包出来的apk 对比下~~
我们使用解压软件直接解压一个apk,会发现res文件下多了很多文件,下面有drawable-xxhdpi-v4等文件。使用反编译工具(apktool)反编译后又没了,文件目录也会变回我们熟知的 xxhdpi,xxxhdpi。就证明了是在打包过程文件结构发生了变化。
1.在apk打包过程中,先会对资源文件进行打包,生成R.java文件;
2.Android中使用aapt来打包res文件,生成R.java、resources.arsc和res文件;3.在生成资源文件的时候,会先创建AaptAssets对象来收集需要编译的资源文件;4.将各类资源文件放入各自的资源文件的容器中,然后生成Bag ID,生成id后会将文件进行版本分类,将那些文件都添加到对应的真实路径中去(也就是我们分类后的文件夹)。打包过程中图片有可能会被优化,xml文件会被优化成二进制的xml文件,.9.png图片也会被优化。
(上图:左边是反编译后的 , 下图:上边是反编译后的)