日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

又掌握了一项新技能 - 断点调试 Gradle 插件

發(fā)布時(shí)間:2025/3/15 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 又掌握了一项新技能 - 断点调试 Gradle 插件 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

最初開發(fā)Android應(yīng)用程序的時(shí)候,肯定是在打log調(diào)試,然后慢慢地覺得打log效率太低下了,不能快速定位問題,于是走上了斷點(diǎn)調(diào)試之路。Gradle插件也一樣,從會(huì)寫插件那一刻起到現(xiàn)在,一直用的是打log調(diào)試功能,但是同樣的這種方式效率也太低下了,這之前,我也嘗試過尋找斷點(diǎn)調(diào)試的方式,但是一直沒有成功,昨天偶然之間調(diào)通了,于是記錄一發(fā)。

之前失敗的方式

之前測(cè)試斷點(diǎn)調(diào)試的功能的時(shí)候,一直在build.gradle中直接測(cè)代碼,測(cè)試的代碼也是在project.afterEvaluate之后,然后遍歷android..applicationVariants,獲取各個(gè)信息,就像這樣子

12345678910111213141516171819202122232425262728293031buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.3.3'}}dependencies {compile gradleApi()compile localGroovy()}import com.android.build.gradle.api.TestVariantimport com.android.build.gradle.api.UnitTestVariantimport com.android.build.gradle.internal.variant.ApplicationVariantDataimport com.android.build.gradle.internal.api.ApplicationVariantImplproject.afterEvaluate {if (project.plugins.hasPlugin("com.android.application")) {def android = project.extensions.getByName("android")android.applicationVariants.all {ApplicationVariantImpl variant ->project.logger.error "DebuggerPlugin:${variant}"ApplicationVariantData apkVariantData = variant.getApkVariantData()ApplicationVariantData variantData = variant.getVariantData()TestVariant testVariant = variant.getTestVariant()UnitTestVariant unitTestVariant = variant.getUnitTestVariant()}}}

于是這個(gè)斷點(diǎn)我打了一年硬是沒打住,恩,沒錯(cuò),這個(gè)東西我斷斷續(xù)續(xù)實(shí)驗(yàn)了一年也沒有成功過,也有點(diǎn)無語,原因也不知道。昨日發(fā)現(xiàn),必須得在外面包一層plugin才能打住斷點(diǎn),就像這樣子

123456789101112131415161718192021222324252627282930313233343536373839buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.3.3'}}dependencies {compile gradleApi()compile localGroovy()}apply plugin: DebuggerPluginimport com.android.build.gradle.api.TestVariantimport com.android.build.gradle.api.UnitTestVariantimport com.android.build.gradle.internal.variant.ApplicationVariantDataimport com.android.build.gradle.internal.api.ApplicationVariantImplclass DebuggerPlugin implements Plugin<Project> {void apply(Project project) {project.afterEvaluate {if (project.plugins.hasPlugin("com.android.application")) {def android = project.extensions.getByName("android")android.applicationVariants.all {ApplicationVariantImpl variant ->project.logger.error "DebuggerPlugin:${variant}"ApplicationVariantData apkVariantData = variant.getApkVariantData()ApplicationVariantData variantData = variant.getVariantData()TestVariant testVariant = variant.getTestVariant()UnitTestVariant unitTestVariant = variant.getUnitTestVariant()}}}}}

具體原因也找不到,理論上來講,兩者沒有什么大的區(qū)別,除非不包plugin的代碼編譯后代碼位置發(fā)生了變化,導(dǎo)致打不到斷點(diǎn)。

其實(shí)這事也怪自己,如果一開始直接用插件項(xiàng)目來測(cè),將其發(fā)布到本地maven,然后執(zhí)行去打斷點(diǎn),估計(jì)老早就成功了,硬是在build.gradle中寫零碎的代碼來測(cè)試,往事不提也罷。

一個(gè)坑

以上代碼執(zhí)行過程會(huì)先出現(xiàn)一個(gè)錯(cuò),如下:

1Error:The closure 'DebuggerPlugin$_apply_closure1$_closure2@20825b3e' is not valid as an action for argument 'com.android.build.gradle.internal.api.ApplicationVariantImpl_Decorated@1103b69d'. It should accept no parameters, or one compatible with type 'com.android.build.gradle.internal.api.ApplicationVariantImpl_Decorated'. It accepts (com.android.build.gradle.internal.api.ApplicationVariantImpl).

這個(gè)錯(cuò)出現(xiàn)的時(shí)候,只需要將ApplicationVariantImpl variant改成def variant即可,然后繼續(xù)運(yùn)行,會(huì)出現(xiàn)另一個(gè)問題。

即出現(xiàn)了一個(gè)cannot cast object with class A to A的問題,如下

1Error:Cannot cast object 'ApplicationVariantData{debug}' with class 'com.android.build.gradle.internal.variant.ApplicationVariantData' to class 'com.android.build.gradle.internal.variant.ApplicationVariantData'

可以看到雖然兩個(gè)對(duì)象obj1和obj2的類的名字相同,但是這兩個(gè)類是由不同的類加載器實(shí)例來加載的,因此不被虛擬機(jī)認(rèn)為是相同的,所以拋出了ClassCastException異常。

那么怎么解決呢,將項(xiàng)目中所有buildscript中的dependencies下引用的android gradle plugin 版本都改成同一個(gè),即

12345678buildscript { repositories {jcenter()} dependencies { classpath "com.android.tools.build:gradle:${global_gradle_plugin_version}"}}

之后將~/.gradle/daemon/目錄下內(nèi)容全部刪除,然后看看是否解決了,如果沒有解決,則繼續(xù)刪除~/.gradle/daemon/,然后重啟電腦。TM的如果還沒好,那么請(qǐng)確定項(xiàng)目中所有引用的插件中的compile的android gradle plugin版本是否都一致,如果不一致,請(qǐng)保持一致,不然也有問題。

這問題就算完事了,大概可能和Gradle的守護(hù)進(jìn)程、插件引用的android gradle plugin版本不一致有那么一點(diǎn)關(guān)系。

斷點(diǎn)調(diào)試方式1

說完了以上坑,正式進(jìn)入斷點(diǎn)調(diào)試的環(huán)節(jié),方式一很簡單,直接利用gradle的參數(shù)讓其等待我們的調(diào)試進(jìn)程attach上去。比如我要執(zhí)行g(shù)radle clean這個(gè)task,則加上兩個(gè)額外參數(shù)即可

  • 一個(gè)是開啟debug
  • 一個(gè)是不使用守護(hù)進(jìn)程

    具體例子如下:

    1gradle :app:clean -Dorg.gradle.debug=true --no-daemon

    之后這個(gè)進(jìn)程就會(huì)一直等待,直到我們attach我們的調(diào)試進(jìn)程。如下圖所示:

然后參考這篇文章Intellij-IDEA遠(yuǎn)程調(diào)試,利用Android Studio或者Intellij IDEA的remote debug進(jìn)行調(diào)試,端口號(hào)填5005.

如圖

然后運(yùn)行remote

之后就會(huì)attach上去我們的進(jìn)程

然后看看效果

從此可以愉快的斷點(diǎn)調(diào)試了。

斷點(diǎn)調(diào)試方式2

和方式一差不多,只不過不是用gradle的參數(shù)來開啟debug,而是用環(huán)境變量

1export GRADLE_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005"

之后就跟正常執(zhí)行任務(wù)一樣

1gradle clean

剩下的操作和方式1一樣。

http://fucknmb.com/2017/07/05/%E5%8F%88%E6%8E%8C%E6%8F%A1%E4%BA%86%E4%B8%80%E9%A1%B9%E6%96%B0%E6%8A%80%E8%83%BD-%E6%96%AD%E7%82%B9%E8%B0%83%E8%AF%95Gradle%E6%8F%92%E4%BB%B6/

總結(jié)

以上是生活随笔為你收集整理的又掌握了一项新技能 - 断点调试 Gradle 插件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 人妻洗澡被强公日日澡 | 成人免费在线播放视频 | 免费一级黄 | av网站黄色 | 欧美h视频在线观看 | 日本欧美一级 | 亚州激情视频 | 久久青青草原亚洲av无码麻豆 | 日日摸日日碰 | 欧美另类一区 | 日韩精品一卡 | 国产精品一区二区三区免费看 | 三级av网站 | 日韩在线播放视频 | 国产香蕉在线 | 双腿张开被9个男人调教 | 日韩一区免费 | 日日噜噜噜夜夜爽爽狠狠视频97 | 探花av在线 | 精品成人无码久久久久久 | 刘亦菲一区二区三区免费看 | 亚洲av高清一区二区三区 | 亚洲美女网站 | av色综合 | 亚洲中字在线 | 日韩中文久久 | 奇米影视播放器 | 蜜桃精品视频在线 | 91麻豆视频网站 | 成人av网站免费 | 日不卡| 亚洲天堂一区二区 | 欧美黄色a视频 | 春色激情站 | 日本欧美国产在线 | 日日草| 成人ay | 中文文字幕一区二区三三 | 97超视频在线观看 | 欧美日韩一区二区视频在线观看 | 日本一区二区三区久久久久 | 美味的客房沙龙服务 | 免费看av网| 淫欲av | 人人插人人爽 | 国产精品av在线播放 | 蜜桃av鲁一鲁一鲁一鲁俄罗斯的 | 亚洲最大的网站 | 天天射天天射 | 日韩在线观看 | 中文字幕亚洲无线码在线一区 | 亚洲三级中文字幕 | 秋霞欧美在线观看 | 91在线精品一区二区 | 进去里片欧美 | 国产成人午夜精品 | 中文人妻一区二区三区 | 69精品久久久久久 | 99精品人妻无码专区在线视频区 | 亚洲乱码日产精品bd在线观看 | 中文字幕乱码无码人妻系列蜜桃 | 一本色道久久综合亚洲精品图片 | 日韩成人免费观看 | 欧洲成人精品 | 欧美日韩中出 | 日韩视频精品一区 | brazzers欧美极品少妇 | 国产亚洲黄色片 | 久久久久久久久久久av | 捆绑无遮挡打光屁股调教女仆 | 亚洲精品人人 | 天堂综合 | 久色视频在线观看 | 欧美色图亚洲激情 | 国产精品网页 | 国产黄色免费观看 | 日韩黄色免费网站 | 穿越异世荒淫h啪肉np文 | 超碰97自拍| 欧美不卡在线视频 | 日韩高清国产一区在线 | 欧美日韩一区二区三区在线视频 | 综合av | 大牛影视剧免费播放在线 | 九一福利视频 | 久99热| 国产精品区一区二 | 亚洲一区欧洲一区 | 特大黑人娇小亚洲女mp4 | 国产精品一区二区三区四区视频 | 少妇视频在线播放 | 亚洲一区二区三区色 | 起碰在线 | 我们的生活第五季在线观看免费 | 久久国产精品系列 | 成人免费一区二区 | jizz视频在线观看 | 91精品国产乱码久久久张津瑜 | 成人av网站免费 |