Android 開發了解 Android虛擬機或者 JVM ,會有什麼樣的直接提升,或者實踐呢?

最近買了一本書,關於 Android 虛擬機的。之前包括垃圾回收,還是 JVM 的基本情況,有點小懂,想看看這本書,但是剛開始看的時候,發現全是概念,一時間迷惑了,不知道現階段的我,了解 Android 虛擬機對於我有哪方面的提高。而且在 Android 開發中有哪方面的實踐?


不知題主看的是哪本書,據我所知,目前專門講Android虛擬機(非Java,也非Android Framework)的書,兩本名為《深入解析Android虛擬機》,一本名為《Android Dalvik虛擬機結構及機制剖析》;前兩本書質量都不是很高,其中一本大量抄襲R大的博客,另外一本對主流的ART提的很少,還有大量內容其實是講Android Framework,而非虛擬機;講dalvik的一那本質量還行但是過時了。所以就事論事的話,如果你看的是這幾本書之一,不建議花大量時間。

那麼,對Android開發來說,了解虛擬機有什麼好處呢?

單純的應用開發,了解這些底層的東西,其實並沒有什麼用。Java的語言特性使得你不需要關注內存布局之類的東西,虛擬機的運行時又屏蔽了底層細節;所以不存在說底層了解的多代碼就寫得好。相反,這麼做可能會弄巧成拙——比如說如果你學習虛擬機了解到了目前Android的ART虛擬機在對象布局上的實現細節,如果寫某個類的時候想著我怎麼安排成員變數,怎麼安放padding可以讓虛擬機內存更加緊湊。。又或者你知道了虛擬機如何實現的Enum,覺得枚舉佔用內存比int大轉而用int去取代枚舉來節省內存。。再比如跨dex調用比如dex內方法調用高效而捨棄multidex,靜態方法比虛方法高效而不用OOP。。這些都是捨本逐末,你做上層開發的時候,應該更多地關注開發效率,可維護性等問題,而非這種「實際上很難說有多大優化的」的細節。

如果你不想止步於成天寫if..else的業務邏輯,改界面調動畫等,那麼了解虛擬機是很有必要的。

各大熱修復方案離不開對虛擬機機制的研究。比如 alibaba/AndFix ,其實就是搞清楚了虛擬機的方法調用原理之後提煉出來的; 滴滴的熱修復 對內聯方法的處理,也是弄明白了方法的編譯過程;QFix探索之路-手Q熱補丁輕量級方案 - DEV CLUB 的「無需插樁去 preverify」就是仔細研究了preverify過程的成果。再比如Hook方案,dalvik上幾近完美的 alibaba/dexposed;ART上的各種(不成熟的)Hook方案 mar-v-in/ArtHook、asLody/legend、tiann/epic,alibaba/dexposed(dev_art) 都建立在對於ART方法調用機制的理解上。

如果你做性能優化,那麼虛擬機的對象分配、垃圾回收,線程調度、磁碟管理無一不與設備的各項性能相關。比如我之前寫的 Android性能優化之虛擬機調優 就是簡單滴了解GC參數之後的結果;再比如FaceBook的facebook/redex,那它又是為何有性能提升呢?Redex初探與Interdex:Andorid冷啟動優化 - DEV CLUB 這篇文章給出了答案。拿線程調度來說,你如何精確地知道一個線程在每一個狀態停留的時間進而針對性地對App的任務做優化?當然,以各大APP的業務之複雜,根本輪不到拼虛擬機性能的地步。。。

上面說的這兩點算得上你說的「直接提升」(當然想像空間遠不止這麼大),如果你深入了解了虛擬機,可以做出很多有意思的東西。

除去這些可能直接有成果的方面,學習虛擬機對你的編程語言基礎計算機基礎都是非常有幫助的。因為一個虛擬機包含了幾乎所有計算機基礎需要的知識。Java語言中那些語法結構最終表現出來的是什麼東西?這種高級語言的語句是如何最終被CPU執行的?一個對象在內存中是什麼樣?調用一個Java方法最終是發生了什麼?面向對象的繼承,多態是如何實現的?自動內存管理是又是怎麼回事?AOT、JIT是如何實現的?說到底這些都是編譯原理、體系結構,數據結構的知識;你看輪子哥年輕的時候就自己擼過一門語言跟vczh看實例學編譯原理--零:序言 - 陳梓瀚(vczh) - 博客園,還有搞虛擬機的R大,編譯原理的知識紮實的讓人可怕。你要又問我這些知識有什麼實際用途,編譯原理乃屠龍之技啊。就算20年後出現了某新語言,你也能分分鐘學會80%,根本不愁飯碗的好伐?你要還問我飯碗有啥實際用途。。出任CEO,迎娶白富美,走上人生巔峰啊。。(認真臉)


其實是有很大幫助的,比如你去看一下AndFix的源碼,會發現針對Dalvik的處理相對簡單,但是涉及到Art就非常複雜了,這些就是Android虛擬機的東西。如果你連一個基本的概念都沒有,怎麼去啃虛擬機的源碼。源碼在這裡: https://android.googlesource.com/platform/art/ 建議把源碼clone下來之後,一邊看書一邊Debug,效果會比較好。


獲贊最多哥們的回答可消化一陣了。現在Android應用流行趨勢是組件化/解耦,不懂JVM代碼估計代碼都看不懂,夠直接了吧。除了開源的項目,書籍推薦(我自己看過的)《深入理解Java虛擬機:JVM高級特性與最佳實踐》(第2版),《Java性能優化》,《性能之巔》(我前司老大傾力推薦)

性能優化符合冰山模型,水面之山稱為「交互類性能」,主要是響應時間和流暢度;水面之下稱為「資源類性能」包括CPU/GPU/內存/磁碟/網路/耗電/,業內基本思路是監控-分析-調優,書籍推薦《Android移動性能實戰》,SNG團隊出品,和他們的老大面聊過,踩過很多坑總結的幹活。做性能首先要培養大局觀,從整體帶著體系去看問題,以前我們的打法也是「順瓜摸騰」,正朝著「順藤摸瓜」走。


說實話,就算你了解了這本書的內容,也並不會在短時間內對你的安卓開發能力有很大的提升,但是會對你的後續學習java,android,有很大的幫助,JVM你可以把它想像成一台虛擬的電腦,我們寫的程序運行在其中,看完這本書,你知道各種實例變數,類變數,常量在虛擬機的什麼位置,線程在虛擬機中是以什麼方式存在的,內存是怎麼回收的,理解了內存,再回過頭來看代碼,一切就清晰了。這本書好比修鍊內功,短時間看不到多大效果,堅持下去,理解了,會帶來質的提升。


先下結論:很有幫助。

從知識體系上看,認識虛擬機同時,可以加深你對語言的理解,更加有把握寫出高效的代碼。

從實踐角度,在Android開發上,熱修復,熱更新等很多時候都離不開你對虛擬機的了解,因為很多時候你需要hook某些虛擬機的實現,如果不了解怎麼可能做得到,例如阿里的sophix。

從裝逼角度,如果你不懂虛擬機,和別人爭論Java好,還是C++好等諸如此類問題,你哪來底氣,哪能吹出花來。

忠告:一定要去看。


同意樓上觀點 對系統調優很有幫助 也會使得你寫出高效低耗的代碼


不限於app開發,了解這類下層技術沒有什麼直接幫助,但是一般調bug,找最優技術方案,下層技術會給你方向,類似於哲學的感覺

打個比方,你寫的東西性能有問題,解決思路分三個方向

1. 經驗豐富:我知道大概哪些API大概最耗性能,或者我知道大概什麼功能容易出問題,然後調試

2. 溝通能力:能夠找到厲害的人幫你解決這個問題

3. 底層技術:通過底層提供的性能分析工具,觀測app運行狀態,結合對底層的理解,推導出你上層代碼的問題點,比如那些方法導致內存,網路IO,內部存儲IO,CPU等資源到達瓶頸。


推薦閱讀:

如何看待 Airbnb 新發布的 Lottie?
為什麼Android系統升級這麼難?
你見過哪些令你瞠目結舌的 Android 代碼技巧?
因為不想在簡歷上作假找了個工資低的工作,這樣值得么?
Android 4.4 還流行 tab bar 底部導航欄嗎?

TAG:Android開發 | Java虛擬機JVM | Android |