概述
平常开发遇到一些问题,比如
怎样确认引进的第三方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,仅需要俩步就能够轻松申请
运用库
- 检测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
拉你进群