国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Android 性能監控系列一(原理篇)

yacheng / 1332人閱讀

摘要:全稱應用性能管理監控后面我會通過一系列的文章來介紹的原理框架設計與實現等等。在應用構建期間,通過修改字節碼的方式來進行字節碼插樁就是實現自動化的方案之一。

歡迎關注微信公眾號:BaronTalk,獲取更多精彩好文!
一. 前言

性能問題是導致 App 用戶流失的罪魁禍首之一,如果用戶在使用我們 App 的時候遇到諸如頁面卡頓、響應速度慢、發熱嚴重、流量電量消耗大等問題的時候,很可能就會卸載掉我們的 App。而往往獲取用戶的成本是高昂的,因此因為性能問題導致用戶流失的情況是我們要極力避免的,做不好這一點是我們開發人員的失職。

去年我們團隊完成了整個項目架構方面的重構(有興趣的同學可以參考我之前的文章安居客 Android 項目架構演進 與Android 模塊化探索與實踐 ),目前已經能夠很好的支撐我們的業務,并對團隊的開發效率也有了一定的提升、項目質量也有了大幅的進步。

但是項目上線后,到底有沒有性能問題?用戶體驗到底怎么樣?在用戶的使用場景中到底會遇到哪些性能問題?我們項目的性能短板又在哪里?這些問題的答案我們都不得而知,因此開發一套完善的性能監控體系勢在必行。我們團隊在今年開始著手開發自己的性能監控組件 APM,希望通過它來采集線上性能數據,找到性能短板,針對性的優化用戶體驗。

APM 全稱 Application Performance Management & Monitoring (應用性能管理/監控)

后面我會通過一系列的文章來介紹 APM 的原理、框架設計與實現等等。本篇就是這個系列的第一篇,主要從實現原理方面來介紹 APM。按照目前的計劃,這個系列大致會從如下幾個方面來展開:

原理篇:主要介紹 APM 的實現原理;

設計篇:介紹整個 APM 框架設計;

實現篇-Gradle Plugin:介紹 Gradle 插件在 APM 項目中的應用,以及如何開發一個 Gradle Plugin;

實現篇-Javassist/ASM:Javassist、ASM 等字節碼操作庫的介紹,以及如何使用它們在編譯時插入代碼來采集各項性能數據;

實現篇-數據存儲及上報:介紹 APM 框架的存儲上報機制及實現過程;

發布集成:最后會介紹如何將庫發布到 jCenter() 以及如何在生產項目中集成。

這里要向大家交代一點是,之前的文章為了極力做到將復雜的問題用通俗易懂的方式解釋清楚,又要面面俱到,往往篇幅過長;諸如之前寫過的RxJava系列6(從微觀角度解讀RxJava源碼) 、神兵利器Dagger2 、安居客 Android 項目架構演進 、Android 模塊化探索與實踐 、寫給 Android 應用工程師的 Binder 原理剖析等文章,篇幅通常都在 8000~10000字以上,通篇閱讀下來可能需要近半個小時的時間,不太符合當下碎片化閱讀的需求;因此在后面的寫作上會控制篇幅,盡量控制在 10 分鐘以內的長度。

這也是我為什么會將 APM 作為一個系列來介紹的原因,同時這也能保證后面在介紹 APM 的時候能夠深入到實現細節,避免泛泛而談。

二. Android APM 的基本原理

市場上有很多商業化的 APM 平臺,比如著名的 NewRelic,還有國內的 聽云、OneAPM 等等。這些平臺的工作流程基本都是一致的:

首先在客戶端(Android、iOS、Web等)采集數據;

接著將采集到的數據整理上報到服務器;

服務器接收到數據后建模、存儲、挖掘分析,讓后將數據可視化,供用戶使用。

如下圖:

我們介紹的 Android APM 框架其實就是在 Android 平臺上應用的一個數據采集上報 SDK。主要包含三大模塊:

數據采集

數據存儲

數據上報

其中數據采集是整個 APM 框架的核心。

數據采集我們可以通過手動埋點的方式,但這種方式工作量巨大、不靈活,而且無法覆蓋到所有場景;因此只能通過自動化的方式來采集數據。在應用構建期間,通過修改字節碼的方式來進行字節碼插樁就是實現自動化的方案之一。

三. Android 打包流程及字節碼插樁原理

在談字節碼插樁的原理之前,首先我們看看 Android 的打包流程,如下圖:

從上面這張打包流程圖我們可以看到,一個 App 的所有 class 文件,包括第三方的 class 文件都會經過 dex 的過程打包成一個或者多個 dex 文件。

這其中涉及到兩個很關鍵的環節:

javac:將 .java 格式的源代碼文件編譯成 class 文件;

dex: 將 class 格式的文件打包匯總,組成一個或者多個 dex 文件。

我們想要對字節碼進行修改,只需要在 javac 之后 dex 之前遍歷所有的字節碼文件,并按照一定的規則過濾修改就好了,這里便是字節碼插樁的入口。

那么我們到底如何介入打包過程,在 class 轉換為 dex 文件的時候實現對字節碼的修改呢?

答案是 transform api

Android Gradle Plugin 1.5.0 及以上版本,Google 官方提供了 transform api 作為字節碼插樁的入口。我們只需要實現一個自定義的 Gradle Plugin,然后在編譯階段去修改字節碼文件。對于 Gradle Plugin 的具體實現后面的文章再做詳細講解。

四. 修改字節碼

找到了插樁入口,接下來就要對字節碼進行修改。對于字節碼的修改,比較常用的框架有 Javassist 和 ASM。

Javassist 是一個開源的分析、編輯和創建 Java 字節碼的類庫,它提供了源碼級別的 API 以及字節碼級別的 API,源碼級別的 API,直接使用 Java 編碼的形式,而不需要深入了解虛擬機指令,就能動態改變類的結構或者動態生成類。

ASM 是一個 Java 字節碼操控框架。它能被用來動態生成類或者增強既有類的功能。ASM 可以直接產生二進制 class 文件,也可以在類被加載入 Java 虛擬機之前動態改變類行為。

ASM 和 Javassit 相比,API 貼近底層,比較難使用,需要對 Java 字節碼和虛擬機方面有一定程度的了解。ASM 的優點就在于性能上的優勢,且更加靈活;Javassist 的實現中大量使用的反射,所以性能偏低。

簡單的說就是 ASM 雖然難以使用,但是功能強大效率高。是很多無痕埋點、APM框架的首選方案。

ASM 的具體時候我們放到這個系列后面的文章介紹。

五. 總結

Android APM 的原理其實非常簡單,用一句話總結就是:

依據打包原理,在 class 轉換為 dex 的過程中,調用 gradle transform api 遍歷 class 文件,借助 Javassist、ASM 等框架修改字節碼,插入我們自己的代碼實現性能數據的統計。

以上所有過程都是在編譯期完成的。

其實 Android 上的無痕埋點也是同樣的原理,區別只不過是我們 hook 的點不同,采集的數據不同,因此掌握了 APM 的實現原理同樣可以實現無痕埋點系統。

原理很簡單,難的是實現細節。比如如何插樁采集到頁面幀率、流量、耗電量等等。這些具體細節我們放到后面一一介紹。至于為什么放到后面……因為很多東西自己沒做過我也不知道啊……

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/69645.html

相關文章

  • 性能優化全新思路!實踐騰訊、字節、阿里、百度、網易等互聯網公司項目實戰+案例分析(附PDF源碼)

    摘要:不努力不奮斗,可能就會在基層一輩子止步不前。不過,只一句,如果你還在做這一行,還是一名程序猿媛,想走上坡路的你,也許我這到手的十幾家一線互聯網公司性能優化項目實戰可能會對你有所幫助。 ...

    ytwman 評論0 收藏0
  • 后端知識拓展 - 收藏集 - 掘金

    摘要:阻塞,非阻塞首先,阻塞這個詞來自操作系統的線程進程的狀態模型網絡爬蟲基本原理一后端掘金網絡爬蟲是捜索引擎抓取系統的重要組成部分。每門主要編程語言現未來已到后端掘金使用和在相同環境各加載多張小圖片,性能相差一倍。 2016 年度小結(服務器端方向)| 掘金技術征文 - 后端 - 掘金今年年初我花了三個月的業余時間用 Laravel 開發了一個項目,在此之前,除了去年換工作準備面試時,我并...

    CoderBear 評論0 收藏0
  • 后端知識拓展 - 收藏集 - 掘金

    摘要:阻塞,非阻塞首先,阻塞這個詞來自操作系統的線程進程的狀態模型網絡爬蟲基本原理一后端掘金網絡爬蟲是捜索引擎抓取系統的重要組成部分。每門主要編程語言現未來已到后端掘金使用和在相同環境各加載多張小圖片,性能相差一倍。 2016 年度小結(服務器端方向)| 掘金技術征文 - 后端 - 掘金今年年初我花了三個月的業余時間用 Laravel 開發了一個項目,在此之前,除了去年換工作準備面試時,我并...

    Carl 評論0 收藏0
  • Android程序員完全沒時間提升自己怎么辦?

    摘要:昨天有個小學弟給我發來微信,說他現在有點后悔選擇開發了,月月光不說,還加班特別嚴重,平時也沒有屬于自己的時間去學習,問我剛畢業的時候是不是這樣。每天回到出租屋都是倒頭就睡,非常累,也沒有其他時間提升自己的技術。 昨天有個小學弟給我發來微信,說他現在有點后悔選擇Android開發了,月月光不說...

    kohoh_ 評論0 收藏0

發表評論

0條評論

yacheng

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<