Skip to content

Commit

Permalink
Update android optimize
Browse files Browse the repository at this point in the history
  • Loading branch information
szhangbiao committed Mar 12, 2024
1 parent 848bb09 commit 51c92fd
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 11 deletions.
48 changes: 37 additions & 11 deletions docs/android/android_optimize.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,26 +4,49 @@

#### 启动优化

App 启动 -> 加载空白 Window -> 创建进程 -> 创建 Main 线程 -> 创建入口 Activity -> 加载布局 View -> 在屏幕上执行 View 的绘制过程 measure、layout、draw。
App 启动 -> 加载空白 Window -> 创建进程 -> 创建 Application -> 创建 Main 线程 -> 创建入口 Activity -> 加载布局 View -> 在屏幕上执行 View 的绘制过程 measure、layout、draw。

| 优化方向 | 优化手段 |
| -------- | --------------------------------------------------------------------------------------------- |
| 视觉优化 | 入口 Activity 主题设置图片 |
| 时间统计 | 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 连接池,适当的重试策略

优化手段:

Expand All @@ -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 | 黑科技 |
6 changes: 6 additions & 0 deletions docs/android/android_webview.md
Original file line number Diff line number Diff line change
@@ -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 秒开

0 comments on commit 51c92fd

Please sign in to comment.