为了调试gradle插件,前后花费了我好几天时间,google、百度搜了不少相关资料,结果发现没一个靠谱,基本都是只说了一部分,因为我的插件是独立项目,但搜来的文章偏偏也没说哪个调试哪个,搞得我尴尬了好久。。。没办法只好自己琢磨,记录时顺便分享下,希望能让遇到相同问题的朋友少走弯路~
继续之前,我先假设你已经会写gradle插件了,并且已经写好了然后想调试插件,因为这篇文章是讲调试gradle插件。
我的开发环境是:Android Studio 3.2.1,gradle 4.10.1
第1步,生成jar格式的插件并上传至本地仓库
在你的插件模块目录下,找到build.gradle打开:
在底部添加如下代码,然后点击右上角的 “Sync Now” 保存:
def groupName = 'XXXX'//组名,改成你自己的
def artifactName = 'XXXXX'//项目名,改成你自己的
def versionName = '1.0.1'//版本号,改成你自己的
//上传至本地仓库
uploadArchives {
repositories {
mavenDeployer {
pom.groupId = "${groupName}"
pom.artifactId = "${artifactName}"
pom.version = "${versionName}"
repository(url: uri('../PluginRepository'))
}
}
}
然后我们可以在gradle目录下找到uploadArchives,双击uploadArchives即可上传至本地仓库。
上边一切顺利的话我们可以在插件项目的根目录下找到一个目录:PluginRepository,点开就可以看到生成的插件了。
第2步:在目标项目中引入这个插件
打开目标项目,在项目根目录下找到build.gradle,添加本地仓库目录,然后在dependencies中添加classpath:
buildscript {
repositories {
google()
jcenter()
maven {
//改成你自己的
url uri('file://I:/myfile/androidstudio/MessProject/PluginRepository')
}
}
dependencies {
classpath 'com.android.tools.build:gradle:3.2.1'
classpath '组名:项目名:版本号'//改成你自己的
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
然后点击右上角的 “Sync Now” 保存。
第3步:在插件项目中创建远程调试
回到插件所在项目,点击【Run】->【Edit Configurations...】:
然后点击左上角的【+】,选择【Remote】:
然后,把命令行参数复制下来,其他默认即可,当然名称可以改成自己喜欢的,然后点击【OK】:
这样服务端就搞好了,稍后我们需要配置客户端调试器让其连接过来,就可以调试了
远程调试有两种模式,或者说有两种方式可选:
- attach模式, 运行debugger,让其监听某个ip:port,然后等待debugger启动并连接这个端口,然后就可以在debugger上断点调试。
- listen模式,让debugger监听某个ip:port, 然后启动debuger连接这个端口,接下来在debugger上断点调试。
第4步:在目标项目新建gradle任务并连接到服务端
在目标项目(即引入插件的那个项目),打开gradle目录,启动模块一般都是app,所以我们展开到【:app】->【Tasks】->
因为我的插件写的是基于Mess的全混淆插件,任务是基于某项tasks的,具体就是在任务名为:transformClassesAndResourcesWithProguardForRelease运行期间运行的一个插件。
所以,我新建了一个基于【:app】->【Tasks】->【other】->【transformClassesAndResourcesWithProguardForRelease】 的任务
其他任务,大家可以根据自己的实际需要新建,我的示例仅供参考。
选择后,我们右键选择【create ....】,在打开的界面右侧,把第3步复制下来的内容粘贴到【VM options】,然后点击【OK】:
最终就是下边这个样子:
第5步:启动调试
经过前边的操作,现在我们可以进行正式的调试了,
1、首先回到插件所在项目,下好断点,将工具栏的运行选项改成我们新建的远程调试那个选项,没有取名字的话默认就是【nonamed】,然后点击启动调试的图标:
控制台会看到如下输出,说明启动成功:
2、回到目标项目(即引用插件的那个项目),双击我们新建的gradle任务:
如果一切顺利,双击gradle任务后,目标项目的调试器很快就会连接到我们建立的服务端并自动跳转,如果遇到断点则会断下来:
大家如果遇到不确定的,可以给我留言。