本書旨在為Android開發者指明提高應用程序性能的方向。第1章就什么是高性能,為什么需要高性能展開討論。第2章為讀者展示了一些用于調試應用程序的工具,方案以及技巧。第3-8章,圍繞著布局,內存,多線程,網絡,安全,電量消耗,等多個方面,闡述如何打造高性能應用程序。第9章相對獨立,介紹的是原生開發。第10章與前面章節的關系也不大,涵蓋了一些瑣碎,但對性能至關重要的提示,例如,圖像處理,序列化,優化APK文件等等。
序言應用程序在移動世界中能否成功,性能是其中一個關鍵的因素。如果一個應用程序運行緩慢,用戶可能會放棄繼續使用它。學習如何創建一個應用程序,讓程序在速度、性能,以及功能交互之間達到平衡,將會是一個挑戰。做到這點比以往任何時候都更重要。《Android高性能編程》將讓你學習到如何讓程序能夠運行到盡可能多的硬件設備上,使得應用程序覆蓋更多用戶。這本書首先簡要地介紹了Android開發中一些最先進的技術,以及性能對Android應用程序的重要性。接著,介紹了使用Android SDK工具,對Android應用程序進行調試和分析的常規做法。本書將討論一些先進的主題,例如,打造布局、多線程、網絡以及安全。電池電量是應用程序的最大瓶頸之一,本書將通過典型的代碼,闡釋如何減少電量消耗,以及在不同情形下如何測量電量的消耗。本書探討的技術,是為打造一個優化高效的系統。這是一個不會消耗大量電量,或引起內存泄露,隨著時間的推移,運行越來越慢的系統。這本書涵蓋了什么第1章,引言:為什么需要高性能?對主題進行概要介紹,簡要分析了Android平臺的現狀,以及高性能對Android應用程序的重要性。第2章,高效調試。涵蓋了調試和分析Android應用程序常用的一些工具, 不僅限于Android SDK 所提供的,還包括一些第三方的。第3章,打造布局。展示優化Android程序的相關技術,編寫內存高效的應用程序,并介紹內存分配以及垃圾回收的相關概念。第4章,內存。提供了許多UI設計方面的見解,通過學習這些內容,打造加載迅速,更新高效,不會令用戶察覺到延遲的UI界面。第5章,多線程。介紹了Android應用程序中可供使用的各種線程,以及它們特定的使用場景。一些先進的技術,例如IPC,將會通過代碼示例來展示。第6章,網絡。介紹了高效操作網絡的相關技術,以及從服務端獲取數據的一些技術,例如指數退避算法或避免輪詢。第7章,安全。涵蓋了確保Android應用程序安全的相關技術,如何利用Android自帶的安全加密機制,以及如何獲取關于連接的信息,或者只是在連接變化的時候得到通知。第8章,優化電量消耗。通過典型的代碼,演示如何耗盡電池的電量,如何阻止它,以及在各種情形下如何權衡電量的消耗;許多開發者不知道,開發一個拍照或錄制視頻的應用程序時,任何處理預覽以及保存數據。第9章,Android中的原生代碼。這一章節將全部用于介紹Android中的原生代碼和C 以及它們的用法。第10章,性能提示。幫助開發者在平時的開發中,避開影響效率的方案;這是前面章節中未涉及的一個最佳實踐指南。你需要準備什么?你需要準備以下硬件設備。?運行環境為Windows、Linux,或者Mac OS X 的PC/筆記本電腦。?Android手機。最好是高端一點的,并且系統版本高于Android5.0。這本書為誰而寫?這本書是為那些已經擁有豐富Android知識,想要進一步鞏固和學習技術,來提高應用程序性能的開發者而寫的。我假設他們已經熟悉整個Android SDK,且為此工作了多年。他們也熟悉Android框架,比如,能使用NDK編寫原生代碼,NDK對性能來說至關重要。約定本書會涉及幾種不同的文本樣式,分別代表不同類型的信息。下面展示了其中一些樣式及它們代表的意思。代碼文本、數據庫表名、文件名、文件擴展名、路徑、URLs、用戶輸入,以及推特賬號名的文本樣式如下。If you go to this folder and call the command adb, you will see on the screen a list of available options.代碼塊的格式如下。<resources> <style name=Theme.NoBackgroundparent=android:Theme> <item name=android:windowBackground>@null</item> </style></resources>任何命令行輸入輸出的格式如下。adb shell dumbsys gfxinfo <PACKAGE_NAME>新條款以及重要的詞會以黑體展示。屏幕上顯示的單詞,例如菜單或者對話框內出現的文本格式類似這樣:To debug the overdraw on the device,Android provides a helpful tool that can be enabled inside the Developer options.
警告或重要提示或出現這樣一個框框中。
提示及小技巧會以這樣的形式出現。讀者反饋歡迎讀者反饋。你對這本書的看法喜歡或者不喜歡。讀者的反饋對我們來說非常重要,它能最大程度地幫助我們寫出讀者需要的內容。發送郵件到feedback@packtpub.com,并在郵件的標題中附上書名,即可給我們反饋。如果你對某個主題有豐富的經驗并且有興趣寫作或者參與對某本書的編寫,可以查看我們的作者引導頁面www.packtpub.com/authors。客服支持很高興您成為Packt系列叢書的擁有者,為此,我們會為您提供一系列服務。下載示例代碼可以到http://www.packtpub.com登錄賬戶,下載本書的示例代碼文件。如果你從別處購買本書,可以訪問http://www.packtpub.com/support并注冊,我們會通過郵件直接將文件發送給你。你可以通過下列步驟下載代碼文件。1.到我們的網站登錄或注冊。2.點擊網站頂部的SUPPORT tab頁面。3.點擊Code Downloads & Errata。4.在搜索框中輸入書本的名字。5.選中你要下載代碼的對應的圖書。6.在下拉菜單中選擇圖書的購買地。7.點擊Code Download。可以在Packt 出版社網站對應的書本頁面,點擊Code Files按鈕來下載本書的代碼文件。書本頁面可以通過搜索框中輸入書本名進入。注意,前提是你需要登錄你的Packt賬戶。文件下載好后,請確使用的解壓工具是最新版本。?Windows使用WinRAR / 7-Zip?Mac 使用 Zipeg / iZip?Linux 使用 7-Zip / PeaZip這本書的代碼也存放在GitHub上https://github.com/PacktPublishing/ Android-High-Performance-Programming。同時,我們也有其他豐富的代碼、書本目錄、視頻等可以提供給你。https://github.com/PacktPublishing/。歡迎下載它們!下載本書的彩圖我們也為你提供了本書所用到的截屏和圖表。這些彩圖更利于你理解和區別代碼結果的變化。你可以在以下網址中下載這些文件http://www.packtpub.com/sites/default/files/downloads/AndroidHighPerformanceProgramming_ColorImages.pdf。勘誤盡管我們已經非常仔細,以確保書本內容的準確性,但是錯誤難免還是會發生。如果你在書中遇到一個錯誤(可能是一個文本錯誤或者代碼錯誤),如果你能報告給我們,我們不甚感激。這樣做能夠減少對其他讀者的困擾并能幫助我們在后續版本中改進這些問題。如果你遇到任何錯誤,請訪問http://www.packtpub.com/submit-errata,選擇你要報告的圖書中,點擊Errata Submission Form鏈接,輸入你所遇到錯誤的詳細信息,發送給我們。一旦錯誤被確認,你所提交的內容會被接受,并且更新到我們網站中,或者添加到要報告的圖書中已有的相應章節下的勘誤表中。通過訪問https://www.packtpub.com/books/content/support并輸入圖書名進行搜索,可以查看之前已經提交的勘誤。相關的信息將會出現在Errata部分中。版權保護對互聯網上所有的媒體資源來說,版權保護一直以來都是一個問題。Packt出版社十分重視對版權和許可證的保護。如果你在互聯網上遇到以任何形式非法盜版我們內容的情況,請立刻為我們提供地址或網站名,以便我們及時補救。請將涉嫌盜版的材料的鏈接地址發送到copyright@packtpub.com。非常感謝您對維護我們作者的權益、打擊盜版,并使得我們能為用戶帶來更好的內容所給予的幫助。問題如果有任何關于這本書的問題,可以通過questions@packtpub.com聯系我們,我們將會盡可能為你解答。
Enrique López Ma?as是Google公司的一位研發專家和獨立IT顧問。他從2007年開始學習并從事移動研發技術。他是一名狂熱的開源社區貢獻者,一位免費開源軟件擁護者,德國排名前10的Java開源貢獻者。他加入了Google創業加速器計劃,其中,他參與并影響了來自全球的幾百個最佳孵化項目。同時,他也是一位大數據和機器學習愛好者。Diego Grancini擁有佩魯賈大學的電信IT工程學位。他致力于研究Android開發超過6年的時間,領導并促成了多個項目,在他的職業生涯中,十分熱衷于教授和分享他的技術。
葉坤,豆瓣Android工程師。負責豆瓣FM Android客戶端研發。熱愛運動、旅行、畫畫、探戈,偶爾玩玩鋼琴。負責豆瓣FM Android客戶端研發。熱愛運動、旅行、畫畫、探戈,偶爾玩玩鋼琴。
1 引言:為什么需要高性能?1
為什么應用程序的性能意味著這么多?2
手動測試和自動測試3
ANR和軟件中的延遲3
什么會觸發ANR,我該如何避免它們?4
Android架構4
Dalvik虛擬機5
內存管理5
電量消耗6
Java語言7
NDK/在需要時進行原生開發7
程序響應相關的3個臨界值8
軟件質量的商業價值8
總結9
2 高效調試11
ADB11
DDMS12
采集和分析線程信息14
堆分析和可視化16
Allocation Tracker19
網絡使用20
Emulator Control22
系統狀態23
調試UI24
使用Hierarchy Viewer26
Systrace28
Android設備調試選項29
Android即時運行38
GPU分析器39
使用GPU分析器進行調試41
ClassyShark42
開始使用42
總結46
3 打造布局47
預覽47
渲染性能47
屏幕撕裂和垂直同步50
多窗口模式57
最佳實踐63
布局概述64
布局層次管理64
布局復用70
ViewStub73
AdapterView和視圖回收74
自定義視圖和布局78
屏幕縮放83
調試工具84
Design窗口85
Hierarchy Viewer86
設備上的調試工具90
Systrace97
總結101
4 內存103
預覽103
內存如何工作104
垃圾回收104
內存共享104
運行時105
Android N 即時編譯器106
內存泄露107
內存抖動108
引用108
內存相關的項目109
最佳實踐111
數據類型111
語法117
常量123
對象管理124
內存設計模式129
Android組件泄露137
進程150
內存API151
主要組件和內存管理153
調試工具156
LogCat156
ActivityManager API159
StrictMode160
Dumpsys161
總結168
5 多線程169
預覽169
線程基礎170
Android多線程環境174
Android應用程序線程175
Android線程消息176
最佳實踐179
線程179
HandlerThread179
AsyncTask181
Loaders185
Services188
進程間通信197
先進的技術202
調試工具210
StrictMode210
總結211
6 網絡213
預覽213
協議215
方法216
頭部216
超時217
內容217
響應碼218
連接類型218
最佳實踐219
延遲測定219
批量連接221
對響應進行緩存222
指數退避算法226
輪詢VS推送228
所提供的API229
Android N帶來的新變化234
調試工具243
Android N網絡ADB工具244
Fiddler244
Wireshark245
Application Resource Optimizer246
網絡衰減248
模擬網絡加速和延遲248
總結252
7 安全255
WhatsApp ?C 連續出現問題256
深入代碼258
捕獲APK文件259
從設備上拉取APK文件259
利用Wireshark捕獲APK文件260
利用外部網站261
剖析APK文件262
代碼注入267
操作碼270
注入新代碼270
簽名并重新構建應用程序273
保護應用程序274
非安全存儲277
SharedPreferences277
內部存儲278
外部存儲280
刪除文件282
使用外部存儲還是內部存儲282
數據庫283
數據庫中的性能284
SQL注入284
ORM框架286
OrmLite286
SugarORM287
GreenDAO288
Realm289
網絡289
通信加密290
嗅探290
總結292
8 優化電量消耗295
分析295
監測電池電量和充電狀態298
識別充電狀態的變化299
確定及響應電池電量的變化300
Doze和App Standby301
理解Doze301
避免無用的網絡請求302
按需對待BroadcastReceivers304
網絡305
總結306
9 Android中的原生代碼309
入門在系統中配置NDK310
JNI311
基本概念312
創建首個JNI程序HelloWorld-JNI313
使用Android NDK創建一個原生Activity318
調試NDK321
Android.mk324
NDK定義的變量325
TARGET_PLATFORM325
TARGET_ARCH325
TARGET_ABI326
NDK提供的宏326
Application.mk327
引入已存在的庫329
導出頭文件330
總結330
10 性能提示333
位圖333
加載334
處理340
緩存341
顯示346
管理內存348
圖像優化352
分辨率353
壓縮354
序列化354
JSON的改進354
JSON的替代品356
本地序列化363
代碼改進363
Getter和Setter364
內部類365
Android N中的Java 8368
設置368
特性368
Jack工具鏈372
APK優化374
移除未使用的代碼374
移除未使用的資源374
總結376