登录

去注册

登录

注册

去登录

注册

每日一问 我的资源去哪了???

xiaoyang   2019-09-11   收藏

打开一个 apk,忽然发现res 下没有我们熟知的 xxhdpi,xxxhdpi,替之的是:

drawable-xxhdpi-v4
drawable-xxxhdpi-v4

为什么会这样呢?

截图 Apk 点这里

4

“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中有引用到:

    ColorStateList getTintList(@NonNull Context context, @DrawableRes int resId) {

            ......

             else if (resId == R.drawable.abc_btn_colored_material) {
                tint = createColoredButtonColorStateList(context);
            } 

            ......
    }

而这个AppCompatDrawableManager是androidx包名下的类(androidx.appcompat.widge),那么可以断定,"drawable-21"文件夹下的"abc_btn_colored_material.xml"就是项目中所依赖的androidx带来的。

回复
鸿洋 : @陈小缘 

小缘试下题目里面提供的项目和打包出来的apk 对比下~~

2019-09-09 回复
3

我们使用解压软件直接解压一个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后会将文件进行版本分类,将那些文件都添加到对应的真实路径中去(也就是我们分类后的文件夹)。

回复
1

打包过程中图片有可能会被优化,xml文件会被优化成二进制的xml文件,.9.png图片也会被优化。

(上图:左边是反编译后的 , 下图:上边是反编译后的)

回复

删除留言

确认删除留言,会导致相关评论丢失?

取消 确定