在进行自定义Gradle插件开发的过程中,除了查阅官方文档,在网上搜索开源插件源码以外,还有一种方式可以获取到一些公开的插件的源码。
首先我们平时通过apply plugin: 'com.android.application'
引用的android这个插件的源码我们可以从aosp代码仓库里面找到,传送门(这里给的是android-10.0.0_r11
的,历史版本可以自行查找,需要fan qiang)
比如下面firebase用到的google-service插件也可以从aosp中传送门找到
apply plugin: 'com.google.gms.google-services'
接着就是一些商用或者非商用sdk使用到的gradle插件了,往往我们比较好奇这个插件里面到底干了啥,或者刚好它有个好用的功能我也想借鉴一下,那么看其源码肯定是最直接好用的办法。
下面举个例子,比如:ShareSDK
按照官方文档流程,依次完成以下两步:
打开项目根目录的build.gradle,在buildscrip–>dependencies 模块下面添加
classpath 'com.mob.sdk:MobSDK:2018.0319.1724'
buildscript {
repositories {
...
}
dependencies {
...
classpath "com.mob.sdk:MobSDK:2018.0319.1724"
}
}
在使用到Mob产品的module下面的build.gradle文件里面添加引用
apply plugin: 'com.mob.sdk'
添加依赖应用插件完毕后,点AS右上角的”sync now”同步一下
同步完成后首先在AS左侧的Project视图中External Library
下面找找看是否有ShareSDK他家的sdk引入,如下表示引入成功。
既然引入成功了,因为他们的插件名称叫com.mob.sdk,那么这个插件就一定缓存到我们PC本地了,所以用这个名字搜一下即可(Windows下有Everything这个工具简直完美), 很快就能在gradle的缓存目录找到这个插件,如下图(我这里修改了gradle的默认位置,Windows一般会在C盘:C:\Users\xxx\.gradle\caches\modules-2\files-2.1
下面,Mac一般在/Users/xxx/.gradle/caches/modules-2/files-2.1
),
找到插件位置后,在目录下继续找,会找到一个xxx-source.jar的文件,这个就是插件源码打成的jar包,实际就是个压缩文件,包含了插件groovy源码,解压即可,源码带注释真香ing。
既有攻,自由破,如何规避源码泄露呢(jar混淆防护请另行考虑)?
常规的上传插件到Jcenter仓库过程中,大家习惯性的套用网上公开的方法,其中肯定有这么一段代码:
task sourcesJar(type: Jar) {
from project.file('src/main/groovy')
classifier = 'sources'
}
artifacts {
archives sourcesJar
}
现在一看不用想这就是我们的源码泄露的罪魁祸首了。常规的打包jar包大概是这样的:
jar {
sourceSets {
main {
java.srcDirs = ['src/main/java','src/main/groovy']
}
}
manifest { attributes 'Main-Class': 'xxx.xxx.xxx' }
}
一个插件、一个library发布后真正有用的也是这个jar包了,上面的sourcesJar完全没必要发布,所以根本就没必要加那段打包sourcesJar的代码了。如果担心检测不通过啥的,也很简单,只要把sourcesJar这个方法稍微改一下,把里面的文件指向一个空的groovy文件也可以,如:
task sourcesJar(type: Jar) {
from project.file('src/main/groovy/xxx/xxx/xxx.groovy') //这里用个空壳子就行了
classifier = 'sources'
}
//或者
task sourcesJar(type: Jar) {
classifier = 'sources'
}
这样就可以生成一个只包含xxx.groovy与META-INF的jar包或者只有META-INF的jar包。