From 51c92fd82647fbbad255e4b6977760dd41a3e25e Mon Sep 17 00:00:00 2001 From: Barry Date: Tue, 12 Mar 2024 17:53:00 +0800 Subject: [PATCH] Update android optimize --- docs/android/android_optimize.md | 48 ++++++++++++++++++++++++-------- docs/android/android_webview.md | 6 ++++ 2 files changed, 43 insertions(+), 11 deletions(-) diff --git a/docs/android/android_optimize.md b/docs/android/android_optimize.md index 1591759..b1d2e75 100644 --- a/docs/android/android_optimize.md +++ b/docs/android/android_optimize.md @@ -4,7 +4,7 @@ #### 启动优化 -App 启动 -> 加载空白 Window -> 创建进程 -> 创建 Main 线程 -> 创建入口 Activity -> 加载布局 View -> 在屏幕上执行 View 的绘制过程 measure、layout、draw。 +App 启动 -> 加载空白 Window -> 创建进程 -> 创建 Application -> 创建 Main 线程 -> 创建入口 Activity -> 加载布局 View -> 在屏幕上执行 View 的绘制过程 measure、layout、draw。 | 优化方向 | 优化手段 | | -------- | --------------------------------------------------------------------------------------------- | @@ -12,18 +12,41 @@ App 启动 -> 加载空白 Window -> 创建进程 -> 创建 Main 线程 -> 创 | 时间统计 | adb 命令、线上代码统计(Application -> attachBaseContext 到 Activity -> onWindowFocusChanged) | | 检测工具 | TraceView、SysTrace | | ReDex | dex 类重排 | +| MutilDex | multiDex 在 attachBaseContext 启动子进程加载 | #### UI 渲染优化 造成界面卡顿的原因 -> 过度绘制、自定义 View 里 onDraw 方法里有重叠、内存抖动 考虑使用对象池,最后使用完要释放 +优化技巧: + +1. 减少 overdraw,减少不必要的背景绘制 +2. 较少嵌套层次及控件个数 +3. 自定义 View 的 onDraw 方法里限制 View 的绘制区域 +4. ImageView 的 bg 和 src 重叠 +5. 借助 ViewStub 按需加载 +6. 选择合适的布局类型 + #### 内存优化 +1. 单例模式引发的内存泄露 +2. 集合操作不当,导致的内存泄露 +3. 线程操作不当:线程持有的对象引用在后台执行,与对象的生命周期不一致 +4. 匿名内部类/非静态内部类导致持有对象无法释放 +5. 常用资源未关闭回收,像 BroadcastReceiver,File,Cursor,IO 流、Bitmap 等 +6. Handler 使用不当:持有 Activity 引用 +7. 加载大图时先调整尺寸再加载,不要创建过多的静态变量 + #### 网络优化 +- 使用 IP 建立连接,减少 DNS 解析时间 +- Gzip 压缩数据包大小:压缩数据包可以减少流量消耗,也可以让请求更快或 Protocol Buffer 更快 +- 请求图片的 Url 中添加格式、质量、宽高等参数 +- 使用缓存:统一图片加载框架,统一网络数据缓存框架 +- 监听设备网络状态、根据不同状态使用不同的请求策略 - 减少活跃时间:减少网络数据获取的频次 -- 压缩数据包大小:压缩数据包可以减少流量消耗,也可以让请求更快 +- Okhttp: 复用 http 连接池,适当的重试策略 优化手段: @@ -38,12 +61,15 @@ Facebook 的 Battery-Metrics 开源库 #### 安装包大小优化 -| 优化方法 | 优化实现 | -| --------------- | -------------------------------------------------------------------------------------- | -| 清理无用资源 | Refactor -> Remove unused resources | -| Lint 工具扫描 | 列出优化的点 | -| shrinkResources | 使用 shrinkResources 配置去除无用资源 | -| 国际化支持 | 在配置里去除语言国际化支持 | -| 资源压缩 | 大图压缩、只保留一套图片、使用 svg 或 webp 格式的图片、打包时使用 AndResGuard 压缩方案 | -| 插件化 | 资源动态加载 | -| 只支持主流架构 | 只支持 arm 架构,对于 mips 和 x86 架构不支持 | +| 优化方法 | 优化实现 | +| ------------------ | -------------------------------------------------------------------------------------- | +| 清理无用资源 | Refactor -> Remove unused resources | +| Lint 工具扫描 | 列出优化的点 | +| shrinkResources | 使用 shrinkResources 配置去除无用资源 | +| 国际化支持 | 在配置里去除语言国际化支持 | +| 资源压缩 | 大图压缩、只保留一套图片、使用 svg 或 webp 格式的图片、打包时使用 AndResGuard 压缩方案 | +| 插件化 | 资源动态加载 | +| 只支持主流架构 | 只支持 arm 架构,对于 mips 和 x86 架构不支持 | +| 非透明大图使用 JPG | JPG 格式图片大小上占优 | +| 选择第三方库小的 | 技术选型方面的决策 | +| redex | 黑科技 | diff --git a/docs/android/android_webview.md b/docs/android/android_webview.md index fa7db28..74ab11b 100644 --- a/docs/android/android_webview.md +++ b/docs/android/android_webview.md @@ -1,3 +1,9 @@ ### Android Webview 实践 #### Hybrid 应用 native 与 js 如何互相调用 + +#### WebView 优化 + +1. 进程化-> Webview 对象池 -> Webview 对象复用 (缺点是进程间的通信) +2. Webview url host 和客户端 Api host 保持一致 -> DNS 缓存复用 / Webview 网络请求被客户端托管 +3. H5 离线包:提前下载离线的 H5 数据包,通过 WebView 加载离线包实现 Webview 秒开