精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何打造穩定、好用的 Android LayoutInspector?

移動開發 Android
本文將圍繞 LayoutInspector 的痛點,分析問題并修復,最終將 LayoutInspector 變成一個穩定、好用的插件。

一、背景

Android 開發者在日常的開發中,經常需要用到查看視圖的功能,Android Studio 開發團隊為我們提供了 LayoutInspector 插件。在較新的版本提供了 LiveLayoutInspector,支持 3D,但是不管是 LayoutInspector 還是 LiveLayoutInspector 都非常難用。比如:

  • 速度極慢,遇到復雜的布局經常超時
  • 某些情況無法選中指定的 View

本文將圍繞 LayoutInspector 的痛點,分析問題并修復,最終將 LayoutInspector 變成一個穩定、好用的插件。

二、加速 Dump View Hierarchy

2.1 問題描述

開發復雜業務的同學在使用 LayoutInspector 時都遇到過上圖所示的錯誤:由于 View 樹結構復雜超時。網上也有其他相關的解決辦法,原理就是修改 timeout 的值,目前默認值是 20s,所以改成 1min,大概率是可以的了。

為了更好的解決這個問題,比如是否能加速?我們看一下整個 LayoutInspector 抓取的流程。梳理流程之前,我們需要找到功能的入口。

2.2 問題分析

2.2.1 Dump 總流程

平常開發者使用 LayoutInspector 的流程一般如下:

  • 和 Attach debugger 類似,先獲取要 LayoutInspector 的進程
  • 如果進程中不止一個 ViewRootImpl,還需要選擇 window

在 IDEA Plugin 框架體系中,大多數插件的功能入口都依賴 Action,上圖 LayoutInspector 的功能入口對應的 Action 如何找到呢?最快速、準確的辦法就是 Debug,在我們點擊功能入口之前,在 AnAction#actionPerformed 加上斷點。

從 AndroidRunLayoutInspectorAction 出發,我們找到了真正的任務:

  1. LayoutInspectorCaptureTask。 

抓取 View 視圖的關鍵方法如下:

我們可以看到這里先構造了一個 Options,Opentions 中有個參數:ProtocolVersion,目前我們能使用的是 ProtocolVersion.Version1,Goolge 內可以通過 StudioFlags 打開 ProtocolVersion.Version2。

capture view 的流程會比較長,涉及到 adb 通信原理,我們先簡單了解一下 adb 通信架構。

  • adb server: 運行在我們的 PC 開發機上,監聽 5037 端口
  • adb daemon: 運行在 Android 設備上
  • adb server 通過 USB/tcp 和 adbd 通信

了解了基本的 adb 通信基礎之后,我們再來看整個 captureview 的原理:

  • 通過 ClientWindow 發起 loadWindowData 的請求(在這里可以看到默認超時時間是 20s)
  • ClinetImpl 收到請求,讓 HandleViewDebug 將本次請求封裝成 JDWP,然后準備發送
  • ClientImpl 將數據先發送給本 PC 上的 adb server
  • adb server 將數據通過 usb/tcp 透傳給 Android 設備上的 adbd
  • Android 設備上的 adbd 根據之前選擇的進程信息,將信息再透傳給指定的 jdwp 線程
  • jdwp 通過 native 調用 DDMServer 方法
  • DdmHandleViewDebug 收到請求開始處理
  • 處理完請求后,再通過 socket 返回,LayoutInspector 收到結果解析后展示

 

參考:debugger.cc

  • https://android.googlesource.com/platform/art/+/android-cts-5.0_r9/runtime/debugger.cc#3778

2.2.2 dump v1 原理

在上圖的流程中可以看到在最后的調用中,有 dump 和 dumpv2 兩個方法,而且 dump 方法已經廢棄了。

 

源碼 ViewDebug.java:

看源碼我們知道 v1 dump 是獲取被 @ExportedProperty 注解作用的 filed 和 method,然后將這些數據寫入 ByteArrayOutputStream。比如 View的 padding 屬性:

當然也有 method:

上面兩圖中的 category: padding 和 focus 體現在 LayoutInspector 的屬性面板中:

上面看源碼的結論:v1 是通過反射遍歷所有的 Filed 和 Method。

在我的手機 One Plus7 Android 10 上,View 的 filed 有 487 個,method 有 915 個。寫一段簡單的代碼展示一下僅遍歷耗時:

輸出:

  1. D/View#dump: 10705ms and 692 views 

可以看到我們還沒有添加邏輯,僅僅遍歷耗時都達到了 10s。

2.2.3 dump v2 原理

  1. 看 ViewDebug#dumpv2: 

 

調用到了 View#encode:

相比 v1,v2 就很克制了,只返回有限的數據,需要什么數據就獲取什么數據,但不支持自定義的屬性,相當于犧牲了一定的靈活性,加快了 dump 的速度。在靈活性、速度兩個方面,Google 將 v1 和 v2都保留了,并通過 StudioFlags 提供了開關。

2.3 解決方案

對比完 v1 和 v2 之后,基本可以確定 v2 的速度會快很多了。我們通過自定義 Action,并替換掉原生的 LayoutInspectorCaptureTask,關鍵是替換下面這個方法:

2.3 效果&收益

v2 相比 v1 速度快了非常多,下面貼一下抖音直播間的 Dump 數據,設備:One Plus 7 Android 10.

 

  1. LayoutInspector V1: 18803ms  
  2. LayoutInspector V2: 328ms 

本章節介紹了如何使用 v2 dump 協議來加速,下面介紹第二個痛點:某些情況無法選中指定的 View。

三、精確獲取點擊的 View

3.1 問題描述

LayoutInspector 還有一個不盡人意的地方——無法選中指定的 View。舉個例子:

上圖藍框其實是一個空白的沒有內容的 View,這個藍框蓋在了「收禮」這個紅圈上。在我們點擊這個紅圈的時候,卻是選中的藍框。

3.2 問題分析

我們首先分析一下 LayoutInspector 的 swing 組件組成:

LayoutInspector 中間圖片的預覽就是上圖中的 myPreview。為了解決這個問題,我們看一下這個點擊選中的邏輯。IDEA 自定義插件中使用的 GUI 框架是 Java Swing,組件的鼠標點擊、鼠標移入、鼠標退出等事件都可以通過 MouseAdapter 來監聽。ViewNodeActiveDisplay 的 MouseAdapter 如下:

查找指定的 View 邏輯:

代碼反映出,LayoutInspector 為了滿足點擊事件消費的順序,是從后往前遍歷的,Z 軸值較大的 View 優先消費事件。但是在很多情況,我們更需要通過比較 View 的面積大小,來選中指定的 View。

3.3 解決方案

其實代碼好修復,但是比較麻煩的是,如何替換 ViewNodeActiveDisplay 中getNode 和 updateSelection 相關邏輯呢,我注意到調用 getNode 的地方都是 click/mouseEnter 等事件,所以我們可以替換掉 MosueAdapter,然后重寫 getNode 和 updateSelection。

 

四、手把手教你搭建 IDEA Plugin 開發環境

修復上述兩個痛點需要新建一個 IDEA Plugin,和一般插件開發環境略有不同的是,我們需要依賴 android plugin。

然后在 build.gradle 中添加如下配置:

  1. // See https://github.com/JetBrains/gradle-intellij-plugin/ 
  2. intellij { 
  3.     localPath = "/Users/xx/Library/Application Support/JetBrains/Toolbox/apps/AndroidStudio/ch-1/202.7231092/Android Studio.app" 
  4.     plugins = ['android'
  5.     updateSinceUntilBuild false 

localPath 填寫你本地的 Android Studio app 路徑。

前面我們提到 LayoutInspector 是 android 插件的一部分,所以這里我們聲明 plugins = ['android']

五、總結

本文圍繞原生 LayoutInspector 的兩個痛點,介紹了 LayoutInspector 的工作原理,并提出了解決方案,使得原生 LayoutInspector 穩定、好用。在文章最后也介紹了如何搭建插件工程,方便未接觸過插件的新人能進入插件的新世界。

責任編輯:未麗燕 來源: 字節跳動技術團隊
相關推薦

2015-10-27 17:52:40

華為

2017-08-28 08:38:08

云存儲圖片站網盤

2009-12-10 10:11:08

2010-03-02 14:15:11

Android平臺

2010-07-06 22:39:16

虛擬交換技術校園網絡思科

2013-06-05 10:40:15

應用交付深信服AD

2025-09-08 07:48:01

SpringWebSocket監控

2014-05-04 10:30:11

風河航空系統

2015-06-02 13:56:29

政務云平臺寧波華為

2010-03-04 15:17:26

2009-02-27 14:58:00

2013-09-17 12:26:43

BYOD環境安全BYOD移動設備

2012-11-30 13:06:34

網絡部署負載均衡應用交付

2012-11-02 11:30:08

飛視美視頻會議網絡質量

2017-05-05 11:02:47

華為

2018-11-20 11:22:24

PHP虛擬主機

2016-03-21 09:46:00

云堆棧云環境構建基礎

2020-12-19 10:45:08

Python代碼開發

2011-12-27 14:06:30

投影儀用戶體驗
點贊
收藏

51CTO技術棧公眾號

黄色在线免费观看| 99久久人妻无码中文字幕系列| 国产三级在线免费观看| 日韩电影在线观看网站| 久久天堂电影网| 五月天丁香社区| 香蕉成人av| 亚洲女厕所小便bbb| 国产在线观看一区| 一级片aaaa| 中文亚洲免费| 久久久国产精品亚洲一区| 妖精视频一区二区| 欧美综合影院| 精品久久久久久久久久久| 一区二区高清视频| 色呦呦中文字幕| 蜜桃av噜噜一区| 26uuu亚洲伊人春色| 99精品中文字幕| 你懂的一区二区三区| 欧美日韩一卡二卡三卡| 男人操女人免费软件| 一区二区三区伦理| 欧美国产在线观看| 久久久精彩视频| 精品国产18久久久久久| 免费观看久久久4p| 2019中文字幕在线免费观看| 欧美激情图片小说| 日韩在线综合| 亚洲色图狂野欧美| www.88av| silk一区二区三区精品视频| 欧美精品 日韩| 亚洲老女人av| 成人性生交大片免费网站| 夜夜嗨av一区二区三区网页| 日本特级黄色大片| 99re在线视频| 欧美激情一区二区| 日产精品久久久一区二区| 天天干,天天操,天天射| 国产.精品.日韩.另类.中文.在线.播放| 国产成人精品免高潮在线观看 | 一区二区成人网| 日韩脚交footjobhd| 亚洲国产欧美另类丝袜| wwwjizzjizzcom| 超碰在线观看免费版| 国产精品福利一区| 中文有码久久| 黄色网址在线免费观看| 国产精品久久久久久久第一福利| 日韩av大全| 91美女视频在线| 国产精品嫩草影院av蜜臀| 日本精品一区二区| 国产二区在线播放| 欧美激情一区二区| 在线成人av电影| 顶级网黄在线播放| 一区二区三区免费看视频| 欧美 亚洲 视频| 污网站在线免费看| 亚洲成人高清在线| 日韩avxxx| se01亚洲视频| 欧美日韩成人一区二区| 亚洲a级黄色片| 欧美a级大片在线| 精品国产一区二区国模嫣然| www男人天堂| 亚洲警察之高压线| 在线播放日韩精品| 青青青在线免费观看| 国产精品成人一区二区网站软件| 欧美极品美女电影一区| 日韩av黄色片| 老司机精品福利视频| 国产精品视频白浆免费视频| 国产免费av电影| 成人久久久精品乱码一区二区三区 | 日韩精品一区二区三区免费视频| 日韩欧美国产电影| 性色av蜜臀av色欲av| 欧美系列电影免费观看| 久久躁狠狠躁夜夜爽| 亚洲国产综合久久| 热久久国产精品| 97se亚洲综合在线| 人成免费电影一二三区在线观看| 国产女同性恋一区二区| 女人床在线观看| jizz内谢中国亚洲jizz| 欧美日韩国产综合草草| 中文字幕天堂av| 成人无号精品一区二区三区| 久热99视频在线观看| 久草手机在线观看| 国产真实乱偷精品视频免| 国严精品久久久久久亚洲影视| 国产日产精品久久久久久婷婷| 亚洲人成亚洲人成在线观看图片| 亚洲熟妇国产熟妇肥婆| 欧美另类激情| 日韩激情在线视频| 五月天婷婷色综合| 日韩经典中文字幕一区| 国产精品v欧美精品v日韩精品| 黄色在线播放| 亚洲成国产人片在线观看| 日本黄大片一区二区三区| 高潮久久久久久久久久久久久久| 国产午夜精品免费一区二区三区| 国产一级特黄毛片| 久久国产精品99久久人人澡| 明星裸体视频一区二区| 欧美videossex另类| 欧美怡红院视频| 男男做爰猛烈叫床爽爽小说| 一个色综合网| 国产精品偷伦一区二区| 亚洲人妻一区二区| 亚洲尤物视频在线| 欧洲在线免费视频| 成人一区二区| 国产精品99久久久久久久久| 刘亦菲毛片一区二区三区| 亚洲日本一区二区三区| 少妇一级淫免费放| 国产日产一区| 欧美专区日韩视频| 天堂av资源网| 午夜精品久久久久久久99水蜜桃 | 91tv国产成人福利| 国产欧美视频一区二区| 成人一级片网站| 免费观看成人www动漫视频| 欧美国产乱视频| 亚洲AV无码一区二区三区少妇| 国产精品久久久久aaaa| 黄色三级视频在线| 欧美裸体在线版观看完整版| 日本成人黄色片| 青青草在线免费观看| 精品免费在线观看| 欧亚乱熟女一区二区在线| 欧美激情aⅴ一区二区三区| 91在线视频导航| 羞羞电影在线观看www| 91精品国产欧美一区二区成人| 四虎影视1304t| 精品一区二区三区久久| 一区二区三区不卡在线| 一级欧美视频| 久青草国产97香蕉在线视频| 国产高清免费观看| 亚洲国产美女搞黄色| 国产草草浮力影院| 男人的天堂亚洲| 欧美精品久久久| 韩日一区二区| 久久天天躁狠狠躁夜夜躁2014| 国产精品国产三级国产普通话对白 | 欧美久久久久久一卡四| 桃花岛tv亚洲品质| 中文字幕亚洲欧美日韩高清 | 不卡一二三区| 中文字幕视频一区二区在线有码| 国产精品免费无遮挡| 一区二区三区毛片| 泷泽萝拉在线播放| 久久国产精品99久久久久久老狼 | 视频在线在亚洲| 亚洲一区二区三区加勒比| 粉嫩一区二区三区在线观看| 欧美极品少妇xxxxⅹ喷水| 污视频网站免费观看| 欧美亚一区二区| 久久免费看少妇高潮v片特黄| 国产·精品毛片| 日韩一级片播放| 伊人久久大香线| 久99久视频| 欧美伊人亚洲伊人色综合动图| 久久久人成影片一区二区三区| 午夜影院在线视频| 欧美美女黄视频| 日本污视频在线观看| 国产欧美综合色| 国产高潮失禁喷水爽到抽搐| 久久亚洲视频| 久久久久久久9| 欧美在线色图| 狠狠干一区二区| 日韩一区中文| 97在线视频免费| 成人短视频在线| 亚洲欧美综合v| 国内老熟妇对白hdxxxx| 欧美在线看片a免费观看| 久草视频在线免费看| 久久久精品蜜桃| 免费黄视频在线观看| 日韩电影免费在线观看网站| 日本一本中文字幕| 偷拍欧美精品| 欧洲精品亚洲精品| 成人爽a毛片免费啪啪红桃视频| 国产精品女人久久久久久| 成人在线高清免费| 久久深夜福利免费观看| 极品美乳网红视频免费在线观看| 日韩精品中午字幕| 亚洲最大成人在线视频| 一本久久综合亚洲鲁鲁五月天| 青青草成人免费| 国产精品成人免费在线| 色噜噜日韩精品欧美一区二区| 风间由美一区二区三区在线观看| 9l视频白拍9色9l视频| 久久高清免费观看| 国产极品尤物在线| 欧美日韩综合| 成人在线观看www| 五月天综合网站| 亚洲人成网站在线播放2019| 在线看成人短视频| 久久福利电影| 青青操综合网| 国产一区二区精品在线| 99国产精品免费网站| 5566av亚洲| 久久久久毛片免费观看| 91精品在线看| 高清在线一区二区| 成人网欧美在线视频| 91精品国产色综合久久不卡粉嫩| 国产精品久久一区主播| 欧美日韩成人影院| 国产成人综合精品在线| 亚洲天堂一区二区| 国产精品电影在线观看| 一区二区视频免费完整版观看| 日韩av快播网址| 外国成人直播| 国产精品高清在线| 国产精品久久久久久久久久齐齐| 国产ts人妖一区二区三区| 欧美日韩大片| 国产精品久久久久影院日本| 国产精品久久久久久妇女| 国产日韩精品视频| 国产麻豆一区二区三区| 91丨九色丨国产| 久久精品色综合| 欧美日韩一区二| 日本不卡免费一区| 亚洲av综合色区| 国语精品一区| 成年人视频观看| 青青草国产精品亚洲专区无| 三级a三级三级三级a十八发禁止| 美国三级日本三级久久99| 日韩va在线观看| 丰满放荡岳乱妇91ww| 精品无码在线视频| 欧美高清在线视频| 91插插插插插插| 亚洲国产精品久久不卡毛片 | 99爱在线观看| 国产精品久久久久久久久久尿| 久久久久伊人| 国产精品毛片va一区二区三区| 欧美天堂影院| 亚洲日本一区二区三区在线不卡| 91精品高清| 国产av人人夜夜澡人人爽麻豆| 久久精品在线| 亚洲精品一二三四| 久久久精品中文字幕麻豆发布| 永久免费看片直接| 亚洲高清一区二区三区| 无码久久精品国产亚洲av影片| 4438x成人网最大色成网站| 性生交大片免费看女人按摩| 亚洲精品一区av在线播放| 三级外国片在线观看视频| 国自在线精品视频| 国产成人a视频高清在线观看| 国产精品大全| 日韩成人三级| 91丨porny丨探花| 麻豆精品新av中文字幕| 在线观看免费视频黄| 国产精品毛片无遮挡高清| 日本五十路女优| 91精品视频网| 国产一级二级三级在线观看| 91在线精品一区二区| 色综合久久久888| 国产伦子伦对白在线播放观看| 国产精品人成电影在线观看| 日韩中文字幕在线一区| 亚洲mv在线看| 国产欧美综合一区二区三区| 天堂av在线8| 2023国产精品| 久久亚洲AV无码| 91精品国产综合久久福利软件| 免费福利在线视频| 久久久亚洲精选| 精品一区二区三区中文字幕在线| 秋霞久久久久久一区二区| 亚洲国产三级| 亚洲丝袜在线观看| 国产精品日产欧美久久久久| 日日骚av一区二区| 亚洲国产精品网站| 少女频道在线观看高清| 国产精品青草久久久久福利99| 日韩成人av在线资源| 妺妺窝人体色777777| 国产风韵犹存在线视精品| 国产免费无遮挡吸奶头视频| 欧美日韩国产影院| 四虎精品一区二区三区| 久久久影视精品| 亚洲综合网狠久久| 黄色小视频大全| 精品一区二区在线免费观看| www.日本高清视频| 精品视频免费看| 3d成人动漫在线| 国产欧洲精品视频| 日韩精品免费| 亚洲精品性视频| 中文字幕视频一区| 亚洲天堂中文字幕在线| 中文字幕亚洲第一| 亚洲欧美在线人成swag| 伊人色综合影院| 国产一区二区不卡老阿姨| 疯狂试爱三2浴室激情视频| 91精品国产综合久久福利| 爆操欧美美女| 国产a一区二区| 亚洲区国产区| 好吊日免费视频| 在线精品视频小说1| eeuss影院www在线观看| 国产伦精品免费视频| 欧美韩日高清| 亚洲精品在线网址| 性做久久久久久免费观看欧美| 神马午夜在线观看| 日本三级韩国三级久久| 欧美一区二区三区激情视频| 国产成人美女视频| 一区二区三区在线观看网站| 黄色av网址在线| 欧美在线观看一区二区三区| 九九久久精品| 日本免费色视频| 亚洲国产欧美日韩另类综合| 手机看片福利在线观看| 日本久久久久久久久久久| 成人中文视频| 伊人av在线播放| 欧美日韩日本国产| 在线免费观看黄色| 99久久久精品免费观看国产 | 欧美激情videoshd| 亚洲ab电影| 在线观看日本www| 五月天视频一区| 98在线视频| 国产91社区| 奇米精品一区二区三区在线观看 | 网站免费在线观看| 欧美伊人精品成人久久综合97 | 亚洲一区在线视频观看| 日韩av地址| 91精品啪aⅴ在线观看国产| 亚洲成人在线| av片在线免费看| 日韩av网址在线| 99久久999| 中文字幕乱码人妻综合二区三区| 中文字幕一区免费在线观看| 天堂av在线免费| 亚洲sss综合天堂久久| 国产精品女主播一区二区三区| 成人三级视频在线观看| 日韩精品视频免费| 精品精品视频| 青青草精品视频在线观看| 亚洲成人手机在线| 国产黄a三级三级三级av在线看|