赞
踩
主要总结 用两周的时间浅显的过了一遍shwen大佬的高手开发课 高质量开发章节内容,以便后续继续学习使用
Android 崩溃分为 Java 崩溃和 Native 崩溃。
Java 崩溃 : 是在 Java 代码中,出现了未捕获异常,导致程序异常退出。
Native 崩溃 : 一般都是因为在 Native 代码中访问非法地址,也可能是地址对齐出现了问题,或者发生了程序主动 abort,这些都会产生相应的 signal 信号,导致程序异常退出。
崩溃捕捉流程
崩溃捕捉难点:
使用Breakpad 捕捉Native异常 :链接 Github lib 工具类
崩溃分析
崩溃现场:
崩溃尝试解决:
内存造成的问题:
举例子:
Android 3.0到8.0 关于Bitmap优化的演变,从开始的数据放native bitmap放java内存,到都放Java内存,演变到8.0则都放在Native层。
如何将Bitmap定义在Native层
eg:
// 步骤一:申请一张空的 Native Bitmap Bitmap nativeBitmap = nativeCreateBitmap(dstWidth, dstHeight, nativeConfig, 22); // 步骤二:申请一张普通的 Java Bitmap Bitmap srcBitmap = BitmapFactory.decodeResource(res, id); // 步骤三:使用 Java Bitmap 将内容绘制到 Native Bitmap 中 mNativeCanvas.setBitmap(nativeBitmap); mNativeCanvas.drawBitmap(srcBitmap, mSrcRect, mDstRect, mPaint); // 步骤四:释放 Java Bitmap 内存 srcBitmap.recycle(); srcBitmap = null; 存在的问题:1.版本兼容问题 2频繁申请释放Java Bitmap
测量内存
adb shell dumpsys meminfo <package_name|pid> [-d]
脱离 Android Studio,实现一个自定义的“Allocation Tracker”
原理:
项目使用了 inline hook 来拦截内存对象分配时候的 RecordAllocation 函数,通过拦截该接口可以快速获取到当时分配对象的类名和分配的内存大小。
在初始化的时候我们设置了一个分配对象数量的最大值,如果从 start 开始对象分配数量超过最大值就会触发内存 dump,然后清空 alloc 对象列表,重新计算。
内存优化
app启动四个状态
优化方式
更黑科技点的优化方式
4. I/O 优化 (磁盘I/O优化 sp文件过大,db过大 都需要优化,启动过程不建议出现网络 I/O)
5. 数据/类/资源 重排 (ReDex 调整dex排序 、支付宝资源重排优化 )
CPU 和内存相比磁盘是高速设备,整个流程的瓶颈在于磁盘 I/O 的性能
文件系统
磁盘
在一些低端机上面,大量跟 I/O 相关的卡顿原因:
系统为了缓解磁盘碎片问题,可以引入 fstrim/TRIM 机制,在锁屏、充电等一些时机会触发磁盘碎片整理。
mmap
它是通过把文件映射到进程的地址空间,带来的好处:
缺点:
I/O跟踪
I/O优化
SharedPreferences 存在的问题
MMKV 的实现原理,里面有一些非常不错的思路。例如利用文件锁保证跨进程的安全、使用 mmap 保证数据不会丢失、选用性能和存储空间更好的 Protocol Buffer 代替 XML、支持增量更新等
ContentProvider
ContentProvider 的生命周期默认在 Application onCreate() 之前,而且都是在主线程创建的,尽量不做过多操作,通过 ContentProvider 也可以获取到数据,比如系统提供的 日历、通讯录等等
序列化
Java原生序列化机制 缺点:大量的反射和临时变量,而且在序列化对象的时候,不仅会序列化当前对象本身,还会递归序列化对象引用的其他对象。
我们能做的优化:1. writeObject 和 readObject 方法,Serializable在反射的时候会先检查是否自己实现了 writeObj 和 readObj . 2 writeReplace 和 readResolve 方法,可以自定义序列化返回结果,
read/writeResolve read/writeObject 顺序 区别
// 序列化
E/test:SerializableTestData writeReplace
E/test:SerializableTestData writeObject
// 反序列化
E/test:SerializableTestData readObject
E/test:SerializableTestData readResolve
Serializable 注意: 类的 static 变量以及被声明为 transient 的字段,默认的序列化机制都会忽略该字段。 开发中尽量设置 serialVersionUID
2. Parcelable
在写入和读取的时候都需要手动添加自定义代码,使用起来相比 Serializable 会复杂很多。但Parcelable 不需要采用反射的方式去实现序列化和反序列化
3. Json
优点:速度更快,体积更小,结果可读便于排查问题。使用方便,支持跨平台、跨语言,支持嵌套引用
4. Protocol Buffers
由于使用二进制格式,相比Json 体积更小,传输更快。
5. SQLite
SQLite本身是支持多线程 多进程操作的,通过文件锁来控制多进程的并发。SQLite 锁的粒度精确到db,没有到某一行。
多进程可以同时获取 SHARED 锁来读取数据,但是只有一个进程可以获取 EXCLUSIVE 锁来写数据库。
多线程情况下可以使用连接池,或者使用WAL模式,将读和写完全的并发执行。
通过正确的建立索引,可以提升 SQLite 的查询速度。通过调整默认的页大小和缓存大小,可以提升 SQLite 的整体性能。
网络优化大头在网络请求:
优化点:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。