拓冰建站拓冰建站
首页 / 资讯中心 / 正文

十年车机性能优化经验总结系列(五):车机性能优化八维清单

《十年车机性能优化》系列前四篇都在聊系统整体维度的打法这篇切到 App 维度——聊聊一个车机应用自己在代码层能折腾点什么。做车机这么多年性能这摊事我来回踩过不少坑。这份清单是我站在龙鹰一号 / 8155 / 8295 这类低内存平台的视角把你那份八维草稿从头过了一遍顺手把车机特有的坑补了进去。下面每一项都标了难易度和收益你照着排期直接干就行不用再琢磨先做哪个。第一维启动速度用户的第一个印象启动慢一秒用户就已经在心里给你差评了。这维度性价比最高先做。优化项具体动作难易度收益备注踩坑点启动闪屏消除 主题占位给 LaunchActivity 套个带背景图的 Theme用windowBackground顶住首帧前的空白⭐极高这步零代码成本只改 Theme但立竿见影——白屏黑屏全没了。原本拆成白屏消除和视觉优化两行本质一个事合一起了。冷启动逻辑裁剪Application.onCreate里只留非它不可的 SDK其余统统延迟初始化⭐⭐极高用 Jetpack App Startup 管起来不阻塞的 SDK 挪到onCreate之后、或者等第一个真实用例触发再懒加载。启动任务图把 SDK 依赖关系理成一张有向无环图定好初始化顺序⭐⭐⭐⭐高提醒一句App Startup 只是帮你排序默认主线程串行想并行得自己切线程见第 0 条第 3 点。首页预加载Splash 阶段就把首页 Fragment 预创建好非首屏区块用 ViewStub 拖到用时再 Inflate⭐⭐⭐高预创建 Fragment 是冲着首屏更快可见去的ViewStub 是非首屏别占首帧俩目的不一样不冲突。耗时布局配AsyncLayoutInflater异步填。第二维内存与 GC别让 OOM 和卡顿找上门车机内存比手机紧这一维优先级得往前排。优化项具体动作难易度收益备注踩坑点图片内存治理Glide / CoilasBitmap指定RGB_565配 DiskCache⭐⭐极高带透明/圆角的图别用 565会黑边换ARGB_8888见第 0 条。图片是内存大头优先治它。Bitmap 复用池BitmapFactory.Options.inBitmap复用大图内存⭐⭐⭐⭐高8.0 基本不用管尺寸匹配了低版本才要一致Glide 自带BitmapPool不用自己造轮子。内存泄露治理静态内部类 弱引用销毁时清掉 Handler 回调和监听器⭐⭐极高LeakCanary 必装。重点盯匿名内部类持 Activity、没反注册的广播/EventBus/传感器。大对象及时释放onDestroy里把 Adapter 数据清掉、置 null⭐高太容易被忽略尤其 ViewPager 和长列表退页不清理就是慢性泄漏。ViewBinding ViewHolder别在 RecyclerView 里反复findViewByIdViewHolder 复用起来⭐中ViewBinding 本身就免 findViewById核心是 ViewHolder 复用 setHasStableIds。Native 内存监控Debug.getNativeHeapAllocatedSize()盯 C 层泄漏⭐⭐⭐⭐⭐中极难定位建议只盯着音视频、地图这类 Native 重模块配dumpsys meminfo和 MAT 一起看。第三维UI 渲染与流畅度稳住 60 帧掉帧用户一眼就看出来这维度全是细活。优化项具体动作难易度收益备注踩坑点过度绘制消除去掉布局里没必要的背景色默认背景叠子 View 背景那种⭐⭐高开发者选项开调试 GPU 过度绘制大面积应该是蓝/绿一片红就得砍。ViewStub 延迟加载非首屏的 View 用 ViewStub 包着用时才 Inflate⭐中简单粗暴有效别让首帧扛全部布局。RecyclerView 嵌套内层 RecyclerView 重写canScrollVertically返回 false⭐⭐中解决嵌套滑动冲突导致的重复测量代价是内层自己不能滑了交给外层接管。横向内层用canScrollHorizontally。异步 InflateAsyncLayoutInflater填耗时布局⭐⭐⭐高结果必须回主线程再 add 进视图树失败会退回主线程别以为异步就一定快。压层级用ConstraintLayout替掉 LinearLayout RelativeLayout 叠叠乐⭐⭐中层级压到 10 层以内复杂列表 item 更要拍平。动画走属性ObjectAnimator替掉ValueAnimator 手动invalidate开硬件加速⭐⭐中属性动画天生走硬件层复杂动画再上View.setLayerType(LAYER_TYPE_HARDWARE)。第四维网络与 IO又耗电又拖速度车机网络环境比手机野弱网和缓存这块值得多花点心思。优化项具体动作难易度收益备注踩坑点接口合并同页多个接口用 BFFmerge或 GraphQL 聚成一个⭐⭐⭐极高得后端配合但车机弱网下收益最大一次往返顶好几趟。三级缓存内存LruCache 磁盘Retrofit Cache 本地Room⭐⭐⭐极高Retrofit 的 Cache 得服务端给Cache-Control头才生效不然自己塞拦截器见第 0 条。离线体验就靠它。DNS 预热启动阶段异步把主域名 IP 解析了⭐⭐⭐高车机网络复杂建议直接上 HTTPDNS既能防劫持又能省掉系统解析那一下。Json 解析用MoshiKSP/Kapt codegen或kotlinx.serialization别走反射⭐⭐⭐⭐中是 Moshi 不是 Moshic编译期生成 Adapter 免反射。还在用 Gson 的记得注册TypeAdapter。图片预加载Wi-Fi 下提前把列表下一页缩略图拉了⭐⭐⭐中Glidepreload()一把注意流量策略——只 Wi-Fi 或充电时才预载。弱网容错Charles 限速测超时走指数退避重试⭐⭐高必做。重试逻辑统一收进拦截器别让每个调用方各写一套。第五维包体积APK 别太胖优化项具体动作难易度收益备注踩坑点资源裁剪开shrinkResourcesresConfigs只留中/英文⭐⭐高记住shrinkResources得minifyEnabled true才干活中文写resConfigs zh。图片转格式PNG 转 WebP有损/无损大图上 AVIF⭐⭐极高WebP 很早就支持了不是 8.0见第 0 条AVIF 压缩更狠但编解码吃 CPU列表缩略图慎用车机端尤其要测。SO 裁剪abiFilters只留armeabi-v7aarm64-v8a⭐高armeabi-v7a是 32 位新机器只留arm64-v8a还能再瘦看老旧设备占比定。动态下发Play Core / App Bundle 做 On-Demand Delivery⭐⭐⭐⭐⭐极高国内商店支持参差不齐华为小米各家能力不一样得按渠道取舍。混淆优化开 R8 全量优化⭐⭐中全模式android.enableR8.fullModetrue反射/序列化/JNI 的-keep规则配齐不然上线就崩。依赖去重gradle dependencyInsight清掉重复/没用的库⭐⭐⭐中隐性收益常见的多版本okhttp、kotlin-stdlib一清就好几百 K。第六维电量与 CPU后台别乱来优化项具体动作难易度收益备注踩坑点后台任务调度JobScheduler / WorkManager 接管利用系统 Batching⭐⭐高别再用AlarmManager精确唤醒了WorkManager 会自动选后端。传感器注销onPause里把 GPS / 加速度计监听撤了⭐极高最容易忘的耗电大户。GPS 在onPause/onStop就停onResume再开。合并网络唤醒别频繁晃醒 Radio用setAllowedNetworkTypes约束⭐⭐⭐中这其实是 WorkManager/JobScheduler 的 Network 约束少晃几次 Radio 续航就好看很多。滑动降帧列表快速滑时把 GIF / 视频播停放一放⭐⭐⭐高用RecyclerView.OnScrollListener的onScrollStateChanged控播放GPU 负载立马下来。第七维稳定性与容灾最后一道防线优化项具体动作难易度收益备注踩坑点全局异常捕获UncaughtExceptionHandler抓到后写日志、清资源⭐⭐极高别让它静默崩。抓到之后别再搞重 UI落盘上报就够了。ANR 监控Watchdog 盯主线程超时或接 Bugly / Firebase⭐⭐⭐⭐极高ANR 难复现监控优先主线程Looper卡顿采样 上报堆栈。页面状态保存onSaveInstanceState存列表 Position / 表单数据⭐⭐高别往里塞大列表Binder 有上限见第 0 条大对象丢 ViewModel 本地存储。降级开关远程配置动态关掉高耗能动画/特效⭐⭐⭐⭐中专门照顾低端机开关要能实时下发还得有本地默认值兜底。第八维数据库与存储高频读写优化项具体动作难易度收益备注踩坑点事务批量多条 SQL 用beginTransaction()包一层⭐⭐极高批量插列表必做别一条条写 I/O。Room 用Transaction或runInTransaction。建索引给WHERE/ORDER BY的字段加索引⭐⭐⭐高索引别滥加写多读少的表加了反而拖插入。预编译语句SQLiteStatement或 RoomQuery⭐⭐中Room 默认编译期生成天然预编译省心。异步查询查库必须在子线程Dispatchers.IO/ RxJava⭐极高这是红线。主线程读 DB 严格模式/新版 Android 直接给你抛异常。落地路线图四周干完第一周先摘低垂的果子把 ⭐ 和 ⭐⭐ 的做了——闪屏消除、冷启动裁剪、内存泄露治理、传感器注销、异步查询。这一周下来启动速度肉眼可见地快OOM 和漏电基本清零。第二周啃硬骨头上 ⭐⭐⭐ 的——启动任务图DAG 手动并行、Bitmap 复用池、三级缓存、依赖去重。第三周打数据地基网络三级缓存、数据库索引 事务批量、Json 编译期解析。第四周把监控立起来ANR 监控、LeakCanary、内存抖动检测Matrix / Perfetto全接上。长尾的活儿往后放⭐⭐⭐⭐⭐ 那些Native 内存、动态下发、AVIF 编解码等版本稳了再迭代项目初期千万别往里砸时间。最后几句车机跟手机不一样龙鹰一号/8155/8295 内存更紧、后台调度更抠内存和启动这两维比包体积更要紧AVIF 编解码的 CPU 开销在车机端一定自己测一遍别想当然。先有监控再谈优化启动耗时、PSS、FPS、ANR 率这几个数先能看、能量再动手别凭手感调。启动立减 20%是经验值不是承诺。拿adb shell am start -W包名/启动 Activity 的TotalTime当基线优化前后拉出来比比啥都实在。干完这四周你的车机应用基本就能在低端硬件上跑得又稳又快了。剩下的就是长期盯着监控看曲线哪根毛刺冒出来灭哪根。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门