《Android高級進階》是據我所知的市面上惟一一本技術工具書,比較的高大全,做者的目的是爲了對全領域有個初步的概念java
No1:linux
在Android系統中,擁有事件傳遞處理能力的類有如下三種android
1)Activity:擁有dispatchTouchEvent和onTouchEvent兩個方法git
2)ViewGroup:擁有dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent三個方法github
3)View:擁有dispatchTouchEvent和onTouchEvent兩個方法web
No2:數據庫
UI管理系統的層級關係json
PhoneWindow是Android系統中最基本的窗口系統,每一個Activity會建立一個。數組
PhoneWindow是Activity和View系統交互的接口。DecorView本質上是一個FrameLayout,是Activity中全部View的祖先。緩存
No3:
MeasureSepc是View的一個靜態內部類,用來講明應該如何測量這個View。
遍歷測量ViewGroup中全部的View:measureChildren方法
測量某個指定的View:measureChild方法
No4:
Android Support Library包含如下幾個系列的Jar包
另外還有Annotaion Library
No5:
@Nullable:返回值能夠爲空
@NonNull:返回值不能夠爲空
No6:
線程註解
1)@UiThread:運行在UI線程
2)@MainThread:運行在主線程
3)@WorkerThread:運行在後臺線程
4)@BinderThread:運行在Binder線程
No7:
值範圍註解
1)@Size(min=1):集合不能夠爲空
2)@Size(max=23):字符串最大字符個數23
3)@Size(2):數組元素個數2
4)@Size(multiple=2):數組大小是2的倍數
@IntRange(from=0,to=255)
@FloatRange(from=0.0,to=1.0)
No8:
權限註解:
1)@RequiresPermission(Manifest.permission.SET_WALLPAPER)
2)@RequiresPermission(anyOf={Manifest.permission.SET_WALLPAPER,Manifest.permission.SET_WALLPAPER}):須要最少一個權限
3)@RequiresPermission(allOf={Manifest.permission.SET_WALLPAPER,Manifest.permission.SET_WALLPAPER}):須要同時聲明多個權限
4)@RequirePermission.Read(@RequiresPermission(Manifest.permission.SET_WALLPAPER))
@RequirePermission.Write(@RequiresPermission(Manifest.permission.SET_WALLPAPER)):讀寫權限
No9:
方法上加@Keep:不須要混淆
No10:
相比較Maven Central,JCenter具備以下有點
1)基於CDN分發函數庫,JCenter提供了更快的下載速度
2)JCenter是最大的Java倉庫,能夠說Maven Central是JCenter的一個子集,託管在Maven Central中的函數庫,幾乎也都託管在JCenter上面
3)上傳函數到JCenter上面是一件很是簡單的事情,Bintray的用戶界面對用戶友好
4)若是想要同時將函數上傳到Maven Central上面,Bintray網站上經過簡單的點擊操做就能夠完成
但它們是由不一樣的提供商託管在不一樣的服務器上面,二者並沒有關係
No11:
一個完整的函數庫依賴字符串包含三部分:GROUP_ID:ARTIFACT_ID:VERSION
GROUP_ID:函數庫所屬Group,通常爲包名或組織名
ARTIFACT_ID:標識函數庫的名字
VERSION:版本號
No12:
Serializable是JDK提供的接口,這種序列化方法是基於磁盤或者網絡的,而Parcelable是Android SDK提供的,它是基於內存的,因爲內存讀寫速度高於磁盤,所以在Andorid中跨進程對象的傳遞通常使用Parcelable。
No13:
Parcelable插件:android parcelable code generator
實現parcelable實現方法
1)describeContents:接口內容的描述,通常默認返回0便可
2)writeToParcel:序列化的方法,將類的數據寫入到Parcel容器中
3)靜態的Parcelable.Creator接口,這個接口包含兩個方法
* createFromParcel:反序列化的方法,將Parcel還原成java對象
* newArray:提供給外部類反序列化這個數組使用
No14:
編碼規範檢查插件:CheckStyle
No15:
app理想架構圖
No16:
開源日誌記錄庫:Logger+LogUtils(https://github.com/pengwei1024/LogUtils)+timber(https://github.com/JakeWharton/timber)
No17:
fastjson還存在一個專門爲Android定製的版本———fastjson.android(https://github.com/alibaba/fastjson/wiki/Android%E7%89%88%E6%9C%AC)
No18:
數據庫:對象關係映射(ORM)框架:
greenDAO———https://github.com/greenrobot/greenDAO 推薦
Realm———https://realm.io
No19:
傳統的圖片緩存方案中設置有兩級緩存,分別是內存緩存和磁盤緩存。在Fackbook推出的Fresco中,它增長了一級緩存,也就是Native緩存,這極大地下降了使用Fresco的app出現oom的機率
No20:
Glide和Picasso有90%的類似度,能夠說就是Picasso的克隆版本,只是在細節上仍是存在很多區別。
Glide爲包含圖片的滾動列表作了儘量流暢的優化。除了靜態圖片,Glide也支持GIF格式圖片的顯示。
Glide提供了靈活的API可讓開發者方便的替換下載圖片所用的網絡函數庫,默認狀況下,它使用HttpUrlConnection做爲網絡請求模塊,開發者也能夠根據本身項目的實際需求靈活使用Google的Volly或者Square的okhttp等函數庫進行替換
No23:
全部的插件haul方案都是使用了DexClassLoader來加載插件APK中的.class文件的
No24:
插件框架:
android-pluginmgr:使用DexMaker的動態熱部署功能來生成Activity,讓這個Activity繼承目標插件所在的Activity
dynamic-load-apk:基於代理的方式實現插件框架的,須要按照必定的規則來開發插件apk,插件中的組件須要實現通過改造後的activity、fragmentactivity、service等的子類
DynamicApk:攜程實現的一種實現多APK/DEX加載的插件框架解決方案,使用這個框架,咱們能夠實現Android Studio多module工程並行開發模式,同時能夠實如今線熱修復功能
DroidPlugin:是360手機助手實現的一種插件框架,它能夠直接運行第三方的獨立APK文件,徹底不須要對APK進行修改或者安裝
Small:目的是實現輕巧的跨平臺插件化框架,他最低支持Android API Level8和IOS 7
No25:
推送方案推薦:基於MQTT協議
No26:
在android中想要創建TCP長鏈接,就不能使用HttpUrlConnection或者HttpClient等Http協議級別的,而要使用TCP級別的Socket
長鏈接經過Socket的connect方法實現,setKeepAlive(true)
No27:
META-INF存放的是簽名相關的信息,用於驗證APK包的完整性以及保證系統的安全
* MANIFEST.MF:主要存放APK包中每一個文件的名字及每一個文件的SHA1哈希值
* CERT.SF:一般每一個APP會有一個特定的名字,它保存的是MANIFEST.MF的哈希值以及MANIFEST.MF文件中每個哈希項的哈希值
* CERT.RSA:保存了APK的簽名和證書的公鑰信息
No28:
最終影響apk包大小的文件可分爲:classes*.dex、lib目錄下的so.文件、資源文件(assets目錄、res目錄、resources.arsc索引表文件)
No29:
android可以使用的圖片編解碼格式只有三種:JPEG、PNG、WEBP(首選)
No30:
圖片壓縮工具:無損壓縮ImageOptim、有損壓縮ImageAlpha、有損壓縮TinyPNG
webp轉換工具能夠選擇智圖和iSparta
No31:
android sdk自帶ninePatch圖的編輯工具,位於sdk/tools/draw9patch中
或者在android studio右擊某張圖片,選擇create 9-patch file進行轉換
No32:
資源混淆推薦微信的AndResGuard:https://github.com/shwenzhang/AndResGuard
No33:
ButterKnife版本7.0.1依然是經過運行時反射實現View的注入,性能較低下。版本8.0.0-SNAPSHOT使用編譯時註解來提高性能。
No34:
依賴注入框架的對比:
ButterKnife是純粹的View注入框架。
RoboGuice3.0版本開始使用編譯時註解提高性能,但還有不少地方用到反射機制。而且使用代碼侵入性比較大。
Dagger使用編譯時註解,但在對象圖的構建時仍是使用到了反射機制,在運行時檢測依賴注入是否正常工做,耗了性能。
Dagger2徹底拋棄了反射機制,轉而在編譯階段完成。但沒有實現動態機制,缺少靈活性。
No35:
React Native是使用Javascript語言進行開發,同時基於ReactJS框架語法。
No36:
AOP開源框架:Hugo,gradle-android-aspectj-plugin,RoboAspetJ,gradle_plugin_android_aspectjx
No37:
gradle的替換工具:Facebook Buck(暫時只支持mac os x和linux)
No38:
網絡優化:
1)避免DNS解析
2)合併網絡請求
3)預先獲取數據
4)避免輪詢:儘可能使用推送
5)優化重連機制:設定一個最大重連次數
6)離線緩存
7)壓縮數據大小
8)不一樣的網絡環境使用不一樣的超時策略
9)CDN的使用:內容分發網絡
No39:
Proguard特性:壓縮源代碼,優化java字節碼,混淆重命名,預校驗代碼
No40:
Android應用加固是指在APK的外面加一層殼,並對APK裏面的dex文件進行加密,能夠有效防止app被反編譯。
No41:
Android調試工具:Facebook Stetho:
1)視圖佈局監視
2)數據庫監視
3)網絡監視
No42:
LeakCanary原理:
1)RefWatcher.watch()函數會爲被監控的對象建立一個KeyedWeakReference弱引用對象
2)在後臺線程AndroidWatchExecutor中,檢查KeyedWeakReference弱引用是否已經被清除,若是還存在,則觸發一次垃圾回收。垃圾回收以後,若是弱引用對象依然存在,說明發生了內存泄漏
3)接着在一個獨立的進程中啓動HeapAnalyzerService服務,基於惟一的reference key,HeapAnalyzer能夠在heap dump中找到對應的KeyedWeakReference,並定位到發生內存泄漏的對象引用。
HeapAnalyer會計算到GC Roots的最短強引用路徑,並判斷是否存在泄漏,並構建出致使泄漏的對象引用鏈
No43:
Android單元測試框架Robolectric 3.0:設計思想是經過實現一套JVM可以運行的Android代碼,從而實現脫離Android環境進行測試
No44:
Android UI自動化測試框架:Monkey,MonkeyRunner,UIAutomator,Robotium,Espresso,Appium
No45:
Android靜態代碼分析工具:CheckStyle,FindBugs,PMD,Lint
No46:
Jenkins全局配置須要進行JDK,Android SDK,Git,SVN和Gradle的環境配置