编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

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

wxchong 2024-08-19 02:13:27 开源技术 6 ℃ 0 评论

概述

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

  1. 怎么确认引入的第三方so是否适配32/64位
  2. 怎么知道第三方库申请了哪些权限
  3. 每次开发引入的图片怎么一键压缩并自动引入项目内,并且每次使用不会重复压缩
  4. 每次写项目都会创建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,因为这里使用的是https://tinify.cn/ 进行压缩的图片,需要到这个网站申请一个开发者id,仅需要两步就可以轻松申请

使用库


  • 检测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),压缩图片

  • 其原理就是拿到项目的资源文件,首先判断png图片大小,大于100k 进行压缩,用的是Tinify 进行压缩数据
  • 拿到资源文件后,对每个文件进行MD5储存,如果有相同的MD5说明有相同文件(如果xml文件内容相同,但是换行,空格,也可以准确判断是重复文件)

最后

开源地址,如果有帮助希望给些start

https://github.com/renxh4/CompressPng

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表