精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

欧美97人人模人人爽人人喊视频| 国产精品高潮呻吟AV无码| 欧美sss在线视频| 在线免费观看日韩欧美| 国产又粗又硬又长| 婷婷婷国产在线视频| 奇米精品一区二区三区在线观看一 | 国产免费区一区二区三视频免费| 亚洲成av人片在线| 少妇免费毛片久久久久久久久| 国产女18毛片多18精品| 国产精品久久久免费| 久久精品中文字幕电影| 老熟妇精品一区二区三区| 国模私拍国内精品国内av| 亚洲国产sm捆绑调教视频| 亚洲精品在线免费| 亚洲区小说区图片区| 国产毛片一区二区| 国产精品高精视频免费| 久久久久久久99| 婷婷精品进入| 色999久久久精品人人澡69 | 久久久久久久香蕉| 欧美黄色小说| 国产不卡视频在线播放| 国产精品aaaa| 圆产精品久久久久久久久久久| 四虎成人精品永久免费av九九| 亚洲国产精品成人精品| 少妇愉情理伦片bd| 成人在线视频免费| 日本乱人伦一区| 国产黄视频在线| 国产激情小视频在线| 国产三级一区二区| 九九九九久久久久| 成人毛片在线免费观看| 国产剧情在线观看一区二区| 国产精品视频在线播放| 亚洲欧美综合自拍| 国产日韩欧美一区在线| 欧美精品18videosex性欧美| 中文字幕在线2021| 亚洲精品久久| 日韩在线免费高清视频| 精品熟妇无码av免费久久| 精品在线观看入口| 亚洲欧洲av一区二区| 黄瓜视频污在线观看| 台湾佬综合网| 亚洲欧美精品伊人久久| 一区二区黄色片| 精品国产乱码久久久久久1区2匹| 亚洲黄色在线观看| av网站有哪些| 免费成人网www| 亚洲人成电影网站| 99久久99久久精品免费| 香蕉国产精品| 欧美日韩福利电影| 国产 日韩 欧美 成人| 在线视频观看日韩| 日韩av片电影专区| 在线观看色网站| 激情综合色丁香一区二区| 亚洲www在线| 刘玥91精选国产在线观看| 99在线精品观看| 欧美高清视频一区| 午夜免费播放观看在线视频| 国产精品久久看| 黄色录像特级片| 99thz桃花论族在线播放| 精品欧美激情精品一区| 男人操女人免费| 欧美美女被草| 精品国产乱码久久| 蜜桃无码一区二区三区| 四虎成人精品永久免费av九九| 超在线视频97| 欧美啪啪小视频| 麻豆精品新av中文字幕| 99热在线播放| 国产精品久久久久一区二区国产 | www.在线观看av| 一区二区三区四区日本视频| 欧美日韩aaaaaa| 国产一区 二区| 色综合久久天天| 国产成人黄色网址| 亚洲精品aⅴ| 日韩精品免费在线| 99久久人妻无码精品系列| 久久国产精品成人免费观看的软件| 麻豆国产精品va在线观看不卡 | 色妹子一区二区| 亚洲精品视频三区| 欧美三级电影在线| 久久精品小视频| 亚洲另类欧美日韩| 黑人巨大精品欧美一区| 久久免费看av| 午夜小视频在线观看| 日韩欧美成人精品| 亚洲精品乱码久久久久久9色| 五月天亚洲一区| 欧美成人免费va影院高清| 日本视频网站在线观看| 国产激情91久久精品导航| 日韩亚洲视频| 欧美大胆a人体大胆做受| 在线播放一区二区三区| 亚洲一级中文字幕| 亚洲午夜极品| 亚洲最大的成人网| jizz视频在线观看| 岛国精品视频在线播放| 潘金莲一级淫片aaaaaaa| jizzjizz欧美69巨大| 91精品国产91久久久久久吃药| 国产精品自产拍| 国产精品午夜免费| 亚洲中文字幕无码不卡电影| heyzo欧美激情| 久久久极品av| 亚洲字幕av一区二区三区四区| 91免费观看国产| 日韩日韩日韩日韩日韩| 欧美一级片网址| 久久精品视频在线观看| 一区二区三区免费在线| 国产午夜精品理论片a级大结局| 国产精品国产亚洲精品看不卡| 日本成人手机在线| 欧美成人精品一区二区| 国产精品亚洲lv粉色| 中文字幕成人网| 国产天堂在线播放| 成人影院在线| 国产久一一精品| 91短视频版在线观看www免费| 91黄色在线观看| 99久久久无码国产精品衣服| 久久不射2019中文字幕| 茄子视频成人在线观看 | 黄色日韩精品| 国产日韩久久| 川上优av中文字幕一区二区| 精品国产乱码久久久久久图片| 免费一级肉体全黄毛片| 国产成人丝袜美腿| 国产www免费| 激情小说亚洲色图| 97色在线视频观看| 黄色av网址在线免费观看| 色哟哟亚洲精品| 国产1区2区在线观看| 麻豆久久久久久| 黄色特一级视频| 国产+成+人+亚洲欧洲在线 | 久久天堂影院| 麻豆国产va免费精品高清在线| 亚洲精品久久久久久无码色欲四季| 亚洲午夜日本在线观看| 日韩免费高清一区二区| 亚洲欧美卡通另类91av| 日韩欧美三级一区二区| 亚洲黑人在线| 久久久免费精品| 男人久久精品| 7777精品伊人久久久大香线蕉 | 国产综合久久久久久鬼色| 一区中文字幕在线观看| 2020国产精品极品色在线观看| 88xx成人精品| 色大18成网站www在线观看| 日韩三级视频在线观看| 久久狠狠高潮亚洲精品| 中文字幕乱码一区二区免费| 天天操精品视频| 亚洲精品美女| 亚洲资源在线网| 精品av导航| 国产日韩欧美在线| 91丝袜在线| 日韩在线精品一区| 亚洲欧美丝袜中文综合| 欧美二区三区的天堂| 日本少妇毛茸茸高潮| 国产精品午夜免费| 人妻av一区二区| 另类小说欧美激情| 亚洲 欧美 日韩 国产综合 在线| 精品久久久久中文字幕小说 | 国产高清在线不卡| av免费在线网站| 亚洲午夜精品久久久久久性色| a在线观看视频| 色婷婷av久久久久久久| 少妇久久久久久被弄高潮| 久久精品一区二区三区av| 丰满人妻一区二区三区大胸| 久热国产精品| 国产a级片网站| 91欧美在线| 欧美亚州在线观看| 国产精品国产| 91社区国产高清| www.国产精品| 日本精品免费观看| heyzo在线欧美播放| 美女国内精品自产拍在线播放| 国产视频第一区| 亚洲福利在线看| 国产ts变态重口人妖hd| 欧美日韩视频在线一区二区| 九九热精品视频在线| 一区二区三区产品免费精品久久75| 天天摸日日摸狠狠添| 久久精品人人做人人爽97| 无码人妻精品一区二区三| 韩国一区二区三区| 亚洲免费999| 日产国产欧美视频一区精品| 成人一级片网站| 国产精品一区亚洲| 欧美二区在线视频| 91久久亚洲| 少妇人妻无码专区视频| 亚洲欧美一区在线| 色噜噜狠狠一区二区三区| 欧美**vk| 日本一区二区不卡高清更新| 视频一区中文| 欧美在线激情| 国产精品亚洲二区| 日韩高清dvd| 精品99在线| 欧美专区一二三| 欧美久久综合网| 亚洲欧美日韩精品在线| 色婷婷综合网| 精品国产无码在线| 91精品国产91久久久久久黑人| 永久免费精品视频网站| 午夜精品久久久久久久四虎美女版| 亚洲日本无吗高清不卡| 欧美国产美女| 2021国产视频| 亚洲精品少妇| 青青草原成人网| 日韩av在线播放中文字幕| 日本999视频| 精品一区二区三区免费观看| 想看黄色一级片| 国产高清亚洲一区| 国产a级黄色片| 国产午夜精品一区二区| 一本在线免费视频| 亚洲日本乱码在线观看| 免费中文字幕视频| 欧美日韩午夜激情| 国产精品第6页| 欧美一区国产二区| 免费观看的毛片| 亚洲人午夜精品免费| 日本三级在线视频| 欧美黑人性猛交| 欧美电影h版| 成人www视频在线观看| 亚洲精品视频一二三区| 久久久国产精品一区二区三区| 精品毛片免费观看| 精品一区二区三区毛片| 99综合视频| 污污的网站免费| 成人黄色网址在线观看| 欧美丰满老妇熟乱xxxxyyy| 亚洲精品大片www| 在线观看国产亚洲| 69av一区二区三区| 午夜影院免费视频| 丝袜亚洲另类欧美重口| 黄色羞羞视频在线观看| 国产成人aa精品一区在线播放 | 日韩av中文字幕一区二区| 国产美女18xxxx免费视频| 成人黄色a**站在线观看| 日本理论中文字幕| 亚洲一区二区av电影| 日韩国产亚洲欧美| 精品国产一区二区国模嫣然| 国产视频第一区| 97国产精品免费视频| 国产成人久久精品一区二区三区| 精品亚洲欧美日韩| 亚洲精品极品少妇16p| 熟妇人妻va精品中文字幕| 国产精品1区2区3区| 51妺嘿嘿午夜福利| 亚洲成人资源网| 国产精品热久久| 国产亚洲人成网站在线观看| 国精一区二区三区| 成人精品网站在线观看| 激情五月色综合国产精品| 成人在线国产视频| 国产一区二区精品久久| 91成人在线免费视频| 激情懂色av一区av二区av| 国产免费黄色录像| 最近的2019中文字幕免费一页| 亚洲精品88| 国产女主播一区二区| 亚洲欧美在线专区| 欧美特级aaa| 久久精品视频一区二区三区| 日本少妇性高潮| 精品毛片乱码1区2区3区 | 亚洲天堂2014| 中文字幕一级片| 亚洲人成电影网| 日韩激情电影免费看| 国产精品成人观看视频免费| 亚洲女同一区| 不用播放器的免费av| 中文字幕欧美三区| 中文字幕一区二区三区人妻四季 | 日本在线播放一区二区三区| 泷泽萝拉在线播放| 精品人伦一区二区三区蜜桃网站 | 最近中文字幕日韩精品| 成人自拍av| 亚洲成人午夜在线| 日韩av成人高清| 手机看片国产日韩| 欧美日韩极品在线观看一区| 91啦中文在线| 国产欧美亚洲精品| 久久久久电影| 欧美色图校园春色| 一卡二卡欧美日韩| 亚洲a视频在线| 久久久人成影片一区二区三区观看 | 亚洲国产一区二区三区a毛片| 在线免费看黄色片| 精品成人久久av| 男人天堂网在线观看| 国产精品69av| 日韩精品欧美| 亚洲综合123| 亚洲国产cao| 日本免费不卡| 国产欧美日韩综合精品| 欧美激情91| a视频免费观看| 欧美色综合天天久久综合精品| 在线观看免费网站黄| 亚洲mm色国产网站| 亚洲高清不卡| 久久av无码精品人妻系列试探| 欧美视频在线一区二区三区| 免费a级毛片在线播放| 999视频在线免费观看| 亚洲久久成人| 美国黄色特级片| 日韩欧美精品在线| 岛国av在线播放| 亚洲国产精品综合| 国产激情精品久久久第一区二区| 日本三级小视频| 日韩一区二区欧美| 福利片一区二区| 亚洲 欧美 日韩系列| 亚洲黄一区二区三区| 午夜福利一区二区三区| 国产精品久久久久久久久久| 亚洲天天影视网| 精品人妻无码一区二区三区| 这里只有精品视频在线观看| 黑人极品ⅴideos精品欧美棵| 欧美日韩免费精品| 国产精品123| 天堂网视频在线| 欧美伦理91i| 精品美女久久| 无码av免费精品一区二区三区| 在线免费观看一区| av中文字幕电影在线看| 亚洲精品国产精品国自产| 国产91露脸合集magnet| jizz国产在线| 国模私拍视频一区| 围产精品久久久久久久| 中文字幕一区二区三区人妻不卡| 在线播放视频一区| 亚洲综合在线电影| 免费看国产一级片| 亚洲欧美韩国综合色|