定 價(jià):¥89.00
作 者: | 金凱 |
出版社: | 電子工業(yè)出版社 |
叢編項(xiàng): | |
標(biāo) 簽: | 暫缺 |
ISBN: | 9787121359248 | 出版時(shí)間: | 2019-03-01 | 包裝: | 平裝 |
開(kāi)本: | 16開(kāi) | 頁(yè)數(shù): | 400 | 字?jǐn)?shù): |
第1章 探尋高效易用的反射API
1.1 反射的能力
1.1.1 得到Class對(duì)象
1.1.2 操作Field
1.1.3 調(diào)用Method
1.1.4 動(dòng)態(tài)代理
1.2 反射封裝庫(kù)――JOOR
1.2.1 反射的流程
1.2.2 VirtualApp中的反射
1.2.3 一行代碼建立對(duì)象
1.2.4 簡(jiǎn)化Field的相關(guān)操作
1.2.5 簡(jiǎn)化方法調(diào)用
1.2.6 封裝動(dòng)態(tài)代理
1.3 注意事項(xiàng)
1.3.1 反射的性能問(wèn)題
1.3.2 反射的使用時(shí)機(jī)
1.3.3 如何降低反射的性能損耗
1.3.4 反射的危險(xiǎn)性
1.3.5 反射和混淆的關(guān)系
1.4 總結(jié)
第2章 打造高擴(kuò)展性的Log系統(tǒng)
2.1 基本概念
2.2 命令行操作Log
2.2.1 輸出日志
2.2.2 過(guò)濾日志
2.3 Android Studio中的Log
2.3.1 設(shè)置模板
2.3.2 正則過(guò)濾
2.3.3 熱部署Log
2.4 微信的Xlog
2.4.1 設(shè)計(jì)和開(kāi)發(fā)目標(biāo)
2.4.2 編譯、引入和使用
2.4.3 對(duì)Log文件進(jìn)行優(yōu)化
2.5 美團(tuán)的Logan
2.6 擴(kuò)展Log的功能
2.6.1 TAG的自動(dòng)化
2.6.2 文本內(nèi)容的設(shè)計(jì)
2.6.3 開(kāi)關(guān)的設(shè)計(jì)
2.7 封裝Log庫(kù)
2.7.1 Timber
2.7.2 LogDelegate
2.7.3 Logger
2.7.4 擴(kuò)展Timber的功能
2.7.5 分發(fā)日志
2.8 實(shí)用日志
2.8.1 操作耗時(shí)日志
2.8.2 頁(yè)面跳轉(zhuǎn)日志
2.8.3 網(wǎng)絡(luò)請(qǐng)求日志
2.9 總結(jié)
第3章 萬(wàn)變不離其宗的Intent
3.1 源碼分析
3.1.1 靜態(tài)變量的寫(xiě)法
3.1.2 Intent的深拷貝
3.1.3 makeMainActivity
3.1.4 Intent的Chooser
3.1.5 用URI代替Intent
3.1.6 存取值的底層實(shí)現(xiàn)
3.1.7 區(qū)分顯式和隱式Intent
3.1.8 拋棄Bundle的傳值策略
3.2 序列化方案
3.2.1 Serializable/Externalizable
3.2.2 Android中的Parcelable
3.2.3 Google的Protocol Buffer
3.2.4 Twitter的Serial
3.3 常見(jiàn)問(wèn)題
3.3.1 父類(lèi)的序列化
3.3.2 類(lèi)型轉(zhuǎn)換異常
3.3.3 重復(fù)啟動(dòng)的問(wèn)題
3.3.4 傳遞大對(duì)象
3.4 簡(jiǎn)單的傳值庫(kù)――Parceler
3.4.1 降低Key的維護(hù)成本
3.4.2 自動(dòng)維護(hù)Intent的Key
3.4.3 Jetpack中的自動(dòng)化
3.4.4 自動(dòng)保存狀態(tài)
3.4.5 處理ClassCastException
3.4.6 IntentLauncher
3.4.7 統(tǒng)一存取的API
3.5 總結(jié)
第4章 SharedPrefrences的再封裝
4.1 源碼分析
4.1.1 緩存機(jī)制
4.1.2 SharedPreferencesImpl
4.1.3 值操作
4.1.4 提交操作
4.2 異常處理
4.2.1 name為null
4.2.2 管理好Key的取名
4.2.3 清空操作失效
4.2.4 磁盤(pán)寫(xiě)入異常
4.2.5 出現(xiàn)ANR
4.2.6 存序列化對(duì)象
4.2.7 多App和多進(jìn)程訪(fǎng)問(wèn)異常
4.3 性能優(yōu)化
4.3.1 避免儲(chǔ)存大量數(shù)據(jù)
4.3.2 盡可能提前初始化
4.3.3 避免Key過(guò)長(zhǎng)
4.3.4 多次操作,批量提交
4.3.5 緩存Editor對(duì)象
4.3.6 不存放HTML和JSON
4.3.7 拆分高頻和低頻操作
4.4 封裝SharedPreferences
4.4.1 PreferenceDataStore
4.4.2 通過(guò)接口提高內(nèi)聚
4.4.3 得到SharedPreferences
4.4.4 多用戶(hù)存儲(chǔ)設(shè)計(jì)
4.4.5 統(tǒng)一管理Key
4.4.6 自動(dòng)判斷返回值類(lèi)型
4.4.7 決定是否使用Apply
4.4.8 存放序列化對(duì)象
4.4.9 支持?jǐn)?shù)據(jù)格式轉(zhuǎn)換器
4.5 思維擴(kuò)展
4.5.1 偏好界面的實(shí)現(xiàn)方案
4.5.2 監(jiān)聽(tīng)數(shù)據(jù)的改變
4.5.3 利用Tray實(shí)現(xiàn)多進(jìn)程訪(fǎng)問(wèn)
4.5.4 React Native中的使用
4.6 總結(jié)
第5章 尋找Fragment的繼任者
5.1 使用場(chǎng)景
5.1.1 日夜間模式
5.1.2 緩存界面數(shù)據(jù)
5.1.3 作為搜索頁(yè)
5.1.4 作為Presenter
5.2 源碼分析
5.2.1 Transaction簡(jiǎn)介
5.2.2 提交操作
5.2.3 commitAllowingStateLoss
5.2.4 Add操作的原理
5.2.5 Replace操作的本質(zhì)
5.2.6 Fragment的可見(jiàn)性監(jiān)聽(tīng)
5.2.7 ViewPager中的懶加載
5.3 常見(jiàn)問(wèn)題
5.3.1 Activity為空
5.3.2 startActivityForResult
5.3.3 ViewPager的getItem
5.3.4 FragmentPagerAdapter
5.3.5 顯示一個(gè)對(duì)話(huà)框
5.3.6 重疊顯示的問(wèn)題
5.3.7 Fragment的StateLoss
5.4 Fragment的替代品
5.4.1 Jetpack的Navigation
5.4.2 Square的Flow
5.4.3 簡(jiǎn)化版的Fragment
5.5 Shatter庫(kù)
5.5.1 建立Shatter類(lèi)
5.5.2 設(shè)計(jì)ShatterManager
5.5.3 分發(fā)生命周期
5.5.4 使用方式
5.6 總結(jié)
第6章 讓alertDialog為我所用
6.1 Dialog
6.1.1 Dialog和Window
6.1.2 Show和Dismiss方法
6.2 alertDialog
6.2.1 alertController
6.2.2 alertDialog.Bulder
6.3 dialogFragment
6.3.1 Fragment和Dialog
6.3.2 Show和Dismiss方法
6.4 實(shí)際問(wèn)題
6.4.1 無(wú)法彈出輸入法
6.4.2 如何支持層疊彈窗
6.4.3 容易引起內(nèi)存泄露
6.4.4 修改尺寸、背景和動(dòng)畫(huà)
6.4.5 點(diǎn)擊后會(huì)自動(dòng)關(guān)閉
6.4.6 在關(guān)閉或開(kāi)啟時(shí)出現(xiàn)崩潰
6.5 封裝dialogFragment
6.5.1 用現(xiàn)成的alertParams
6.5.2 讓Builder類(lèi)支持繼承
6.5.3 建立dialogFragment框架
6.6 easyDialog
6.6.1 基本用法
6.6.2 自定義一個(gè)Dialog
6.6.3 BottomSheetDialog
6.6.4 設(shè)置全局樣式
6.6.5 支持動(dòng)態(tài)樣式
6.6.6 避免丟失監(jiān)聽(tīng)器
6.7 可全局彈出的Dialog
6.8 總結(jié)
第7章 Gradle的使用技巧
7.1 全局配置
7.1.1 設(shè)定UTF-8
7.1.2 依賴(lài)Google倉(cāng)庫(kù)
7.1.3 支持Groovy
7.1.4 定義全局變量
7.1.5 配置Lint選項(xiàng)
7.2 操控Task
7.2.1 更改輸出的APK的名字
7.2.2 更改AAR輸出的位置
7.2.3 跳過(guò)AndroidTest
7.2.4 找出耗時(shí)的Task
7.2.5 抽離Task腳本
7.3 動(dòng)態(tài)化
7.3.1 動(dòng)態(tài)設(shè)置buildConfig
7.3.2 填充Manifest中的值
7.3.3 讓buildType支持繼承
7.3.4 讓Flavor支持繼承
7.3.5 內(nèi)測(cè)版本用特定的Icon
7.3.6 不同渠道不同包名
7.3.7 自動(dòng)填充版本信息
7.4 遠(yuǎn)程依賴(lài)
7.4.1 配置Maven倉(cāng)庫(kù)
7.4.2 依賴(lài)相關(guān)的API
7.4.3 組合依賴(lài)
7.4.4 依賴(lài)傳遞
7.4.5 動(dòng)態(tài)版本號(hào)
7.4.6 強(qiáng)制版本號(hào)
7.4.7 exclude關(guān)鍵字
7.4.8 依賴(lài)管理
7.5 本地依賴(lài)
7.5.1 引用AAR
7.5.2 依賴(lài)Module/Jar
7.5.3 自建本地倉(cāng)庫(kù)
7.5.4 本地依賴(lài)React Native
7.5.5 重新打包第三方Jar
7.6 資源管理
7.7 總結(jié)
第8章 縮減APK的編譯時(shí)間
8.1 分析項(xiàng)目現(xiàn)狀
8.1.1 Gradle Profile
8.1.2 BuildTimeTracker
8.1.3 Dexcount GradlePlugin
8.1.4 經(jīng)驗(yàn)小結(jié)
8.2 編譯環(huán)境優(yōu)化
8.2.1 升級(jí)硬件設(shè)備
8.2.2 升級(jí)軟件
8.2.3 優(yōu)化工程配置
8.2.4 配置Studio的可用內(nèi)存
8.2.5 提升JVM的堆內(nèi)存
8.2.6 開(kāi)啟并行編譯
8.2.7 啟用Demand模式
8.2.8 配置DexOptions
8.3 善用緩存
8.3.1 減少動(dòng)態(tài)方法
8.3.2 硬編碼BuildConfig和Res
8.3.3 拆分腳本
8.3.4 拆分代碼
8.3.5 寫(xiě)死庫(kù)的版本號(hào)
8.4 精簡(jiǎn)工程
8.4.1 差異化加載Plugin
8.4.2 使用WebP和SVG
8.4.3 精簡(jiǎn)語(yǔ)言和圖片資源
8.4.4 善用no-op
8.4.5 Exclude無(wú)用庫(kù)
8.4.6 刪減Module
8.4.7 去掉MultiDex
8.4.8 刪除無(wú)用的資源
8.5 綜合技巧
8.5.1 構(gòu)建開(kāi)發(fā)時(shí)的Flavor
8.5.2 優(yōu)化MultiDex
8.5.3 跳過(guò)無(wú)用的Task
8.5.4 關(guān)閉AAPT的圖片優(yōu)化
8.5.5 調(diào)試時(shí)關(guān)閉Crashlytics
8.5.6 謹(jǐn)慎使用AspectJ
8.6 多渠道打包工具
8.6.1 MultiChannelPackageTool
8.6.2 美團(tuán)的Walle
8.6.3 騰訊的VasDolly
8.7 總結(jié)
第9章 APP終極瘦身實(shí)踐
9.1 安裝包的構(gòu)成
9.1.1 Assets
9.1.2 Lib
9.1.3 Resources.a(chǎn)rsc
9.1.4 META-INF
9.1.5 Res
9.1.6 Dex
9.2 優(yōu)化Assets目錄
9.2.1 刪除無(wú)用的字體
9.2.2 減少I(mǎi)conFont的使用
9.2.3 動(dòng)態(tài)下載資源
9.2.4 壓縮資源文件
9.3 優(yōu)化Lib目錄
9.3.1 配置ABI Filters
9.3.2 根據(jù)CPU引入so
9.3.3 動(dòng)態(tài)加載so
9.3.4 避免復(fù)制so
9.3.5 謹(jǐn)慎處理so
9.4 優(yōu)化Resources.a(chǎn)rsc
9.4.1 刪除無(wú)用的映射
9.4.2 進(jìn)行資源混淆
9.5 優(yōu)化META-INF
9.5.1 MANIFEST.MF
9.5.2 CERT.SF
9.5.3 CERT.RSA
9.5.4 優(yōu)化建議
9.6 優(yōu)化Res目錄
9.6.1 通過(guò)IDE刪除無(wú)用資源
9.6.2 打包時(shí)剔除無(wú)用資源
9.6.3 刪除無(wú)用的語(yǔ)言
9.6.4 控制Raw中的資源大小
9.6.5 減少Shape文件
9.6.6 減少M(fèi)enu文件
9.6.7 減少Layout文件
9.6.8 動(dòng)態(tài)下載圖片
9.6.9 分目錄放置圖片
9.6.10 合理使用圖片資源
9.6.11 丟棄特定的資源
9.6.12 開(kāi)啟嚴(yán)格模式
9.6.13 移除Lib庫(kù)中的配置文件
9.7 優(yōu)化圖片資源
9.7.1 使用VectorDrawable
9.7.2 使用WebP
9.7.3 替換support庫(kù)中的圖
9.7.4 精簡(jiǎn)動(dòng)畫(huà)圖片
9.7.5 復(fù)用相同的Icon
9.7.6 使用Tint
9.7.7 復(fù)用按壓效果
9.7.8 通過(guò)旋轉(zhuǎn)復(fù)用
9.8 優(yōu)化Dex
9.8.1 分析Dex
9.8.2 利用Lint分析無(wú)用代碼
9.8.3 刪除R文件
9.8.4 啟用ProGuard
9.8.5 使用拆分后的support庫(kù)
9.8.6 盡量不用Mulitdex
9.8.7 使用更小庫(kù)或合并現(xiàn)有庫(kù)
9.8.8 根據(jù)環(huán)境依賴(lài)庫(kù)
9.9 總結(jié)
第10章 編寫(xiě)針對(duì)性的TestCase
10.1 基礎(chǔ)概念
10.1.1 什么代碼應(yīng)被測(cè)試
10.1.2 編寫(xiě)易于被測(cè)試的代碼
10.1.3 測(cè)試框架的選型
10.2 邏輯測(cè)試
10.2.1 Junit測(cè)試
10.2.2 Mockito
10.2.3 Robolectric的使用
10.2.4 Espresso
10.3 集成測(cè)試網(wǎng)絡(luò)層
10.3.1 編寫(xiě)網(wǎng)絡(luò)層邏輯
10.3.2 建立測(cè)試對(duì)象
10.3.3 測(cè)試HTTP的異常情況
10.3.4 測(cè)試業(yè)務(wù)代碼的正確性
10.3.5 用Interceptor模擬返回值
10.4 總結(jié)
第11章 Android Studio使用經(jīng)驗(yàn)
11.1 調(diào)試篇
11.2 插件篇
11.2.1 統(tǒng)計(jì)相關(guān)
11.2.2 工具相關(guān)
11.3 總結(jié)
第12章 抓包工具Whistle實(shí)踐
12.1 抓包工具
12.1.1 Charles
12.1.2 Fiddler
12.1.3 AnyProxy
12.1.4 Whistle
12.2 Whistle的安裝和使用
12.2.1 安裝和更新
12.2.2 查看Request和Response
12.2.3 代理技巧
12.2.4 過(guò)濾規(guī)則
12.3 Whistle的各項(xiàng)功能
12.3.1 替換域名
12.3.2 修改請(qǐng)求參數(shù)
12.3.3 修改返回值
12.3.4 模擬低網(wǎng)速的情形
12.3.5 查看WebView的Console
12.4 總結(jié)