本文同步自 我是一只香脆的大鸡排
有同学问我,对应用开发你有没有值得注意或小技巧的地方可以分享的.比如适配,优化,排查错误什么的.鸡排把自己的总结笔记整理出来了.供大家参考.
开工准备
在项目业务代码开工之前,最好把这些问题都解决掉,否则必将酿成大祸害.它们是:
组件路由
异步处理
组件化模块工程
全局网络拦截器
异常统一处理器
基础视图组件封装
日志记录工具
解决写无数次一模一样代码的模板(如自定义 MVP 模板)
机型适配
特定的机型上出问题时,别着急.我们可以尝试以下几个办法.
反编译 rom,看底层改动 (条件略高)
联系该厂商的工程师(如果可以的话)
拷贝整个我们调用 api 的源码进行单独依赖,而放弃系统内的.
逆向在该机型上正常的同类 app,参考逆向后的代码实现
参考各个版本不同的 Android API 变化,可以从源码入手进行对
利用反射获取该特定机型上的某个我们想知道的方法,动态调试
排查崩溃闪退日志:
1. 如果 app 在调试的过程中出现闪退, 此时在 logcat 下日志会被新起来的进程冲刷掉. 这时需要把过滤器选择为 No filter 把日志级别选为 error 即可查看到上一次崩溃的日志.
2. 有一种情况是手机并不在我们身边, 我们也无法使用调试工具. 此时可以接入一些第三方的日志记录工具. 在开发状态下不建议使用友盟 360 之类 sdk, 因为很有可能我们的 app 根本无法连接到网络就崩溃了. 可以选择把日志存到本地文件中. 再又使用手机的人发回来. 一般这个人是测试.
3. 如果 app 未接入任何日志保存工具, 可以在 data/anr / 目录下查看到所有的 ANR 异常信息. 但需要 su 权限. 否则无法访问到.
APP 性能体验优化
1. 素材有必要使用压缩后的. 推荐熊猫 PNG 压缩.
2. 资源能用代码画尽量使用代码去画. 而不要使用静态资源.
3. 在复杂的布局上, 比如很多 app 的首页需要加载不同类型的 item. 使用了 RecyclerView 多类型加载, 刷新数据时一定要使用单独对 item 刷新 api. 切勿使用 notifyitemchanged() 方法., 这里要用两个参数的 notifyItemChanged(1,"gfg") 方法
4. 数据懒加载,或排队加载
5. 混淆可以使包减小含:(xml 资源 class 等)
6. 如果玩得不是很 6,尽量不要写静态引用,匿名内部类这种会导致内存泄漏的东西.如果很担心自己失误的写了,一定要去分析它们,把他们揪出来.
7.Activity 的层级不要太深.过深会在低内存设备上被回收栈底的.
建议和技巧
1. 发现某处代码可以复用性的封装一下或者改良一下会更好的时候一定要乘早,不要拖延.(烂泥巴只会越来越烂,后面改 = 永远没可能)
2.debug 编译期间可以把用不到的 abi 过滤掉,会让我们加速部署.
3. 尽量保持较新的 support library 依赖.因为较高的版本中修复了一些 bug.
4. 接入第三方包时,最好与自身模块保持独立,做到随时解耦,随便复用.
5. 多个 native 库依赖时,若发现某些 abi 上不支持,那么就需要保持最小的 abi.否则会给某些机型优先读取它更合适的架构.会造成灾难性的崩溃.如:(ARM 文件夹中含两个 so,ARMv8 中只有一个.届时手机优先加载了 ARMV8 的情况下,将带来找不到 so 库的崩溃异常.)
6. 不要太随性的引入第三方依赖库,如果只是用了很小一部分功能,建议剥出来自己封装.
7. 第三方的包含私有 api 为暴露时,记得用反射去实现.当然这一切需要我们能翻他们的 sdk 源码读.也许被混淆了.这时就可以使用动态调试去跟踪.
8. 多数情况下官方的 support 包比第三方要好得多.只是我们不知道,或者不熟悉.
9. 渐变图,纯色图,带一根线的图 用 shape 用 shape 不要静态图 不要静态图,会引发血案!!!
10. 当无法通过搜索解决问题的时候,读源码是最快的解决思路.千万不要瞎猜和尝试随缘写代码来解决问题.
11. 封装控件时注意对资源类型做校验 如: Image.setImageResource(img); 这里的 img 需要做强校验,类型检测,防止别人用的时候不小心写错了.因为如果我们不主动抛出异常.靠 LayoutInflater 通过反射去解析 xml 时提示出了的错误日志非常难看.一般还会伴随一大堆调用栈和闪退出现.
12. 冷启动优化,不要在 Application 启动时里做过多的任务 & 第一个 Activity 里也是一样.最好把初始化的白屏 Window 设上一张图片过渡一下.
有不妥之处,欢迎指出和补充,拼死挣扎的 Android 程序员.
来源: https://juejin.im/post/5a66bea86fb9a01caf378d33