概述

平常开发遇到一些问题,比如

  • 怎样确认引进的第三方so是否适配32/64位
  • 怎样知道第三方库申请了那些权限
  • 每次开发引进的图片怎样一键紧缩并主动引进项目内,并且每次运用不会重复紧缩
  • 每次写项目都会创立shape,而这个shape很可能搭档写过我不知道又写了一遍,很可能一个项目中存在很多重复的shape,仅仅命名不同,该怎么找到这些重复的shape

针对上方问题,再结合gradle插件开发了一个插件工具,能够解决这些问题,在这儿共享出来,期望能够协助到更多人

运用

引进库

  • 在根目录的build.gradle 引进
buildscript {
    repositories {
        google()
        mavenCentral()
    }
    dependencies {
        classpath "com.android.tools.build:gradle:4.2.2"
        //引进这个库
        classpath "io.githunb.renxh4:compress_png:0.0.5"
    }
}
  • 在app的build.gradle引进插件
apply plugin: 'com.ren.xh.plugin'
xh{
    tinifyId = "wQdHz6dkJhtSCt0sHwCmvQh5lpSMcyL1"
}

引进插件后,需要配置tinifyId,因为这儿运用的是tinify.cn/ 进行紧缩的图片,需要到这个网站申请一个开发者id,仅需要俩步就能够轻松申请

Android Gradle插件工具实战:检测三方库权限so适配及压缩图片

运用库

  • 检测so适配

命令行执行命令 ./gradlew checkso


./gradlew checkso
...
[mmm] ---------------[依靠产品开始] group=com.immomo.momomedia:x264encoder----------------
[mmm] so文件 = jni/arm64-v8a/libx264encoder.so   size = 424KB
[mmm] so文件 = jni/armeabi/libx264encoder.so   size = 477KB
[mmm] ---------------[依靠产品完毕] group=com.immomo.momomedia:x264encoder----------------
[mmm] ---------------[依靠产品开始] group=com.immomo.momomedia:voaac----------------
[mmm] so文件 = jni/arm64-v8a/libVoAACEncoder.so   size = 74KB
[mmm] so文件 = jni/armeabi/libVoAACEncoder.so   size = 78KB
[mmm] so文件 = jni/armeabi-v7a/libVoAACEncoder.so   size = 78KB
[mmm] ---------------[依靠产品完毕] group=com.immomo.momomedia:voaac----------------
...
[mmm] v8a不包括 = libbsdiff.so   group=com.immomo.android.mklibrary:mk   size = 39KB
[mmm] v8a不包括 = libmkjni.so   group=com.immomo.android.mklibrary:mk   size = 7KB
[mmm] v8a不包括 = libsevenz.so   group=com.immomo.android.mklibrary:mk   size = 33KB
[mmm] v8a不包括 = libMOMOPitchShift.so   group=com.immomo.momomedia:mmaudio   size = 76KB
[mmm] v8a不包括 = libMOMOPitchShift.so   group=com.immomo.momomedia:mmaudio   size = 76KB
[mmm] v8a不包括 = libmjni.so   group=MatchMakerAndroid:momsecurity   size = 62KB

首要会找出一切依靠三方的so,并列出名字和巨细,然后判别对应文件夹是否是适配,现在判别的文件夹是32指得是armeabi 64指的是arm64-v8a,假如有需要判别其他文件夹能够下载源码自己改一下

  • 检测三方库权限

命令行执行 ./gradlew checkm


./gradlew checkm
[mmm] root 不包括权限 key = {group=com.huawei.hms:availableupdate}  权限 = {.GET_COMMON_DATA}
[mmm] root 不包括权限 key = {group=com.immomo.cosmos.photon:thirdpush-xiaomi}  权限 = {.MIPUSH_RECEIVE}
[mmm] root 不包括权限 key = {group=com.cosmos.radar:core}  权限 = {.FOREGROUND_SERVICE}
[mmm] root 不包括权限 key = {group=:SecurityGuardSDK-external-release-5.5.15071059}  权限 = {.WRITE_SETTINGS}
[mmm] root 不包括权限 key = {group=:SecurityGuardSDK-external-release-5.5.15071059}  权限 = {.READ_SETTINGS}
[mmm] root 不包括权限 key = {group=com.immomo.cosmos.auth:auth-cucc}  权限 = {.SYSTEM_ALERT_WINDOW}
[mmm] root 不包括权限 key = {group=com.immomo.cosmos.auth:auth-ctcc}  权限 = {.WRITE_SETTINGS}
[mmm] root 不包括权限 key = {group=com.huawei.hms:push}  权限 = {.PROCESS_PUSH_MSG}
[mmm] root 不包括权限 key = {group=com.huawei.hms:push}  权限 = {.PUSH_PROVIDER}
[mmm] root 不包括权限 key = {group=com.huawei.hms:push}  权限 = {.FOREGROUND_SERVICE}
[mmm] root 不包括权限 key = {group=com.liulishuo.filedownloader:library}  权限 = {.FOREGROUND_SERVICE}
[mmm] root 不包括权限 key = {group=com.immomo.android.mmhttp:mmhttp}  权限 = {.MOUNT_UNMOUNT_FILESYSTEMS}
[mmm] root 不包括权限 key = {group=com.immomo.cosmos.photon:thirdpush-oppo}  权限 = {.RECIEVE_MCS_MESSAGE}
[mmm] root 不包括权限 key = {group=com.immomo.cosmos.photon:thirdpush-oppo}  权限 = {.RECIEVE_MCS_MESSAGE}
[mmm] root 不包括权限 key = {group=com.huawei.hms:update}  权限 = {.GET_COMMON_DATA}

这个会检测,三方库包括那些,自己项目没有权限

  • 检测res中重复文件(不止是shape),紧缩图片

执行命令 ./gradlew checkres

(1) 主动紧缩大于100k的图片

...
[mmm] ""/app/src/main/res/drawable-xxhdpi/pay_success_bg.png  size = 262KB
[mmm] 紧缩前 size =  262
[mmm] 紧缩后 size =  56
[mmm] copy 完结
[mmm] ""/app/src/main/res/drawable-xxhdpi/bg_qr_share.png  size = 582KB
[mmm] 紧缩前 size =  582
[mmm] 紧缩后 size =  155
[mmm] copy 完结
[mmm] ""/app/src/main/res/drawable-xxhdpi/bg_every_day_pick.png  size = 119KB
[mmm] 紧缩前 size =  119
[mmm] 紧缩后 size =  32
[mmm] copy 完结
[mmm] ""/app/src/main/res/drawable-xxhdpi/bg_secretary_dialog.png  size = 216KB
[mmm] 紧缩前 size =  216
[mmm] 紧缩后 size =  43
[mmm] copy 完结
[mmm] 此次共紧缩 {7706}

能够看到紧缩的很客观,直接紧缩了将近8m的图片,只需要执行一次,会主动紧缩,并把紧缩的图片主动替换到项目内,很方便,并且记载现已紧缩过的图片,不会重复紧缩

(2) 检测是否有重复资源(比如多个shape.xml文件名字不同,但是内容相同)


...
[mmm] 重复文件
[mmm] ""/app/src/main/res/drawable/bg_10dp_chat_white.xml
[mmm] ""/app/src/main/res/drawable/bg_luck_telephone_part2.xml
[mmm] 重复文件
[mmm] ""/app/src/main/res/drawable-xhdpi/random_match_avatar_12.png
[mmm] ""/app/src/main/res/drawable-xhdpi/random_match_avatar_15.png
[mmm] 重复文件
[mmm] ""/app/src/main/res/drawable/bg_dialog_bublegumpink.xml
[mmm] ""/app/src/main/res/drawable/bg_dialog_negtive_two.xml
[mmm] 重复文件
[mmm] ""/app/src/main/res/drawable/bg_button_redcommon.xml
[mmm] ""/app/src/main/res/drawable/bg_button_enable.xml
[mmm] 重复文件
[mmm] ""/app/src/main/res/drawable/bg_fe377f_radius_29dp.xml
[mmm] ""/app/src/main/res/drawable/bg_29_shape_fe377f.xml
[mmm] 重复文件
[mmm] ""/app/src/main/res/drawable-xxhdpi/single_chat_input_ic_audio_unlock.png
[mmm] ""/app/src/main/res/drawable-xxhdpi/single_chat_input_ic_audio.png
[mmm] 此次共找到重复文件 {15}

这个不仅能够找到重复的shape文件,还能够找到重复的png,重复的xml,layout等文件,其实就是找到的res中的重复文件

原理

检测so适配

  project.task("checkso").doFirst {
            Configuration bb= project.configurations.getByName("implementation")
            bb.canBeResolved=true
            project.gradle.addListener(new EmbedResolutionListener(project, bb))
            def set  = ResolveUtils.resolveArtifacts(bb)
            processArtifacts(set)
        }

解析implementation引证的依靠,然后解析依靠文件,拿到so文件,并判别巨细及是否适配32/64位

检测三方库权限

其实和so原理一样,解析implementation引证的依靠,然后解析依靠文件,拿到AndroidManifest.xml文件,解析xml,拿到权限并和主项目权限进行判别

检测res中重复文件(不止是shape),紧缩图片

(1)其原理就是拿到项目的资源文件,首要判别png图片巨细,大于100k 进行紧缩,用的是Tinify 进行紧缩数据 (2)拿到资源文件后,对每个文件进行MD5贮存,假如有相同的MD5阐明有相同文件(假如xml文件内容相同,但是换行,空格,也能够精确判别是重复文件)

最后

开源地址,假如有协助期望给些start

github.com/renxh4/Comp…

建了一个技术交流群欢迎参加,加我微信renxhui5421拉你进群