內容提要
《Android高性能編程》旨在為Android 開發者指明提高應用程式性能的方向。第1 章就什麼是高性能、為什麼需要高性能展開討論。第2 章為讀者展示了一些用於調試應用程式的工具、方案以及技巧。第3~8 章圍繞著布局、記憶體、多執行緒、網路、安全、電量消耗等多個方面,闡述如何打造高性能應用程式。第9 章相對獨立,介紹的是原生開發。第10 章與前面章節的關係也不大,涵蓋了一些瑣碎但對性能至關重要的小技巧,例如,圖像處理、序列化、最佳化APK 檔案,等等。
《Android高性能編程》面向具有一定Android 開發經驗,希望得到進一步提升的工程師。
目錄
1 引言:為什麼需要高性能?
為什麼應用程式的性能意味著這么多?
手動測試和自動測試
ANR和軟體中的延遲
什麼會觸發ANR,我該如何避免它們?
Android架構
Dalvik虛擬機
記憶體管理
電量消耗
Java語言
NDK/在需要時進行原生開發
程式回響相關的3個臨界值
軟體質量的商業價值
總結
2 高效調試
ADB
DDMS
採集和分析執行緒信息
堆分析和可視化
Allocation Tracker
網路使用
Emulator Control
系統狀態
調試UI
使用Hierarchy Viewer
Systrace
Android設備調試選項
Android即時運行
GPU分析器
使用GPU分析器進行調試
ClassyShark
開始使用
總結
3 打造布局
預覽
渲染性能
螢幕撕裂和垂直同步
多視窗模式
最佳實踐
布局概述
布局層次管理
布局復用
ViewStub
AdapterView和視圖回收
自定義視圖和布局
螢幕縮放
調試工具
Design視窗
Hierarchy Viewer
設備上的調試工具
Systrace
總結
4 記憶體
預覽
記憶體如何工作
垃圾回收
記憶體共享
運行時
Android N 即時編譯器
記憶體泄露
記憶體抖動
引用
記憶體相關的項目
最佳實踐
數據類型
語法
常量
對象管理
記憶體設計模式
Android組件泄露
進程
記憶體API
主要組件和記憶體管理
調試工具
LogCat
ActivityManager API
StrictMode
Dumpsys
總結
5 多執行緒
預覽
執行緒基礎
Android多執行緒環境
Android應用程式執行緒
Android執行緒訊息
最佳實踐
執行緒
HandlerThread
AsyncTask
Loaders
Services
進程間通信
先進的技術
調試工具
StrictMode
總結
6 網路
預覽
協定
方法
頭部
逾時
內容
回響碼
連線類型
最佳實踐
延遲測定
批量連線
對回響進行快取
指數退避算法
輪詢VS推送
所提供的API
Android N帶來的新變化
調試工具
Android N網路ADB工具
Fiddler
Wireshark
Application Resource Optimizer
網路衰減
模擬網路加速和延遲
總結
7 安全 255
WhatsApp – 連續出現問題
深入代碼
捕獲APK檔案
從設備上拉取APK檔案
利用Wireshark捕獲APK檔案
利用外部網站
剖析APK檔案
代碼注入
操作碼
注入新代碼
簽名並重新構建應用程式
保護應用程式
非安全存儲
SharedPreferences
內部存儲
外部存儲
刪除檔案
使用外部存儲還是內部存儲
資料庫
資料庫中的性能
SQL注入
ORM框架
OrmLite
SugarORM
GreenDAO
Realm
網路
通信加密
嗅探
總結
8 最佳化電量消耗
分析
監測電池電量和充電狀態
識別充電狀態的變化
確定及回響電池電量的變化
Doze和App Standby
理解Doze
避免無用的網路請求
按需對待BroadcastReceivers
網路
總結
9 Android中的原生代碼
入門——在系統中配置NDK
JNI
基本概念
創建首個JNI程式HelloWorld-JNI
使用Android NDK創建一個原生Activity
調試NDK
Android.mk
NDK定義的變數
TARGET_PLATFORM
TARGET_ARCH
TARGET_ABI
NDK提供的宏
Application.mk
引入已存在的庫
導出頭檔案
總結
10 性能提示
點陣圖
載入
處理
快取
顯示
管理記憶體
圖像最佳化
解析度
壓縮
序列化
JSON的改進
JSON的替代品
本地序列化
代碼改進
Getter和Setter
內部類
Android N中的Java 8
設定
特性
Jack工具鏈
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.NoBackground”parent=”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.”
警告或重要提示或出現這樣一個框框中。
提示及小技巧會以這樣的形式出現。
讀者反饋
歡迎讀者反饋。你對這本書的看法——喜歡或者不喜歡。讀者的反饋對我們來說非常重要,它能最大程度地幫助我們寫出讀者需要的內容。
客服支持
很高興您成為Packt系列叢書的擁有者,為此,我們會為您提供一系列服務
你可以通過下列步驟下載代碼檔案。
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
同時,我們也有其他豐富的代碼、書本目錄、視頻等可以提供給你。
我們也為你提供了本書所用到的截屏和圖表。這些彩圖更利於你理解和區別代碼結果的變化。你可以在以下網址中下載這些檔案
勘誤
儘管我們已經非常仔細,以確保書本內容的準確性,但是錯誤難免還是會發生。如果你在書中遇到一個錯誤(可能是一個文本錯誤或者代碼錯誤),如果你能報告給我們,我們不甚感激。這樣做能夠減少對其他讀者的困擾並能幫助我們在後續版本中改進這些問題。
著作權保護
對網際網路上所有的媒體資源來說,著作權保護一直以來都是一個問題。Packt出版社十分重視對著作權和許可證的保護。如果你在網際網路上遇到以任何形式非法盜版我們內容的情況,請立刻為我們提供地址或網站名,以便我們及時補救。
非常感謝您對維護我們作者的權益、打擊盜版,並使得我們能為用戶帶來更好的內容所給予的幫助。