关于aar和jar包以及Android res下的资源

来源:6-5 实战:创建类结构【实现Transform】

Mike风会停息

2022-06-07

老师您好,我想请教下,对于transform来说,aar和jar有什么区别吗?另外想实现图片资源合规检测怎么做(只对图片大小做一个检测),具体细节描述如下:
inputTypes方法定义如下:

    @Override
    public Set<QualifiedContent.ContentType> getInputTypes() {
        return TransformManager.CONTENT_CLASS;
    }

通常 inputType的取值如下:

/**要处理的数据类型是java class文件,并且包含jar文件*/
    public static final Set<ContentType> CONTENT_CLASS = ImmutableSet.of(CLASSES);
    /**要处理的数据类型是jar文件*/   
     public static final Set<ContentType> CONTENT_JARS = ImmutableSet.of(CLASSES, RESOURCES);
    /**要处理的数据类型是java resource文件*/
    public static final Set<ContentType> CONTENT_RESOURCES = ImmutableSet.of(RESOURCES);
     /**要处理的数据类型是dex文件*/
    public static final Set<ContentType> CONTENT_DEX = ImmutableSet.of(ExtendedContentType.DEX);
    /**要处理的数据类型是dex文件、java resource文件*/
    public static final Set<ContentType> CONTENT_DEX_WITH_RESOURCES =
            ImmutableSet.of(ExtendedContentType.DEX, RESOURCES);

通过名称可以看出,有处理class文件的,有处理Jar的 有处理Dex的 有处理 jarWithResources 然后也有处理 dexWithResources的。
我有两个问题

  1. aar的资源如何拦截,要对aar中的代码进行插桩流程是怎样的
  2. inputType中的resources是指代 平时Android开发中放在 res目录下的那些xml和图片等资源吗,假如有一个需求是打包过程中去检测打包中所有资源里面有没有图片大小超过100k的图片在项目中存在,实现的思路大体是怎么样的呢?
    跪求老师解答,最近面试快被虐哭了。
写回答

1回答

allenfeng

2022-06-14

你好!

  1. aar最终会被解压变为 jar文件参与后续编译的,因此针对CLASS、JARS进行遍历即可覆盖到所有代码

  2. 不是一个概念。思路有两个:

    1. 资源文件在经过 processResources流程后,会被统一解压放到一个文件夹下,可以在编译后,去build目录找这个文件夹,得到路径后,hook到processResources任务的doLast,在这里遍历文件夹的文件,进行检测

    2. 编译结束后,获取编译好的APK,解压,拿到res目录,遍历里面是否有超过大小的图片


比较推荐第二种思路(没有Gradle版本兼容性问题),祝你面试顺利~

1
0

Android 应用程序构建实战+原理精讲

深度掌握 Gradle 使用,系统性学习 Android 应用构建知识

450 学习 · 116 问题

查看课程