一、说明
笔记主要是《Android开发艺术探索》的阅读笔记和自己的理解,笔记中部分内容引自《Android开发艺术探索》。
因此需要着重感谢任玉刚先生和他所著的《Android开发艺术探索》;然后感谢任玉刚先生授权我使用小部分《Android开发艺术探索》原文。
推荐Android开发者购买正版《 Android开发艺术探索》,该书是初级Android开发者进阶的必备良品!
由于本人水平有限,其中出现的错误或者不合理的地方望各位读者多多包含,并指出其中不合理和错误的地方,以便我来修正。谢谢!
二、笔记时间
2018年10月12日
三、简述
本文主要记录《Android开发艺术探索》中第十三章和第十五章中的重要知识点,其中包含crash信息、方法数越界、布局优化等一些重要知识细节。
文中加入了一些个人理解,可能有一些说明不合理或者错误之处,望各位读者指出错误的地方,以便我来修改错误,避免误导读者。谢谢!
四、详情
1、使用CrashHandler来获取应用的crash信息
Android 中不可避免地会发生奔溃,当奔溃的时候系统会杀死应用,出现不友好界面。可以通过setDefaultUncaughtExceptionHandler来捕获异常信息,并进行相应处理。
2、方法数越界
在Android单个dex文件能够包含的最大方法数为65536。当应用的方法数达到65536后,编译就会出现异常。第一种方式是通过multidex来解决方法数越界的问题(开启打包为多dex),即修改工程app目录下的build.gradle,在defaultConfig中添加“multidexEnable = true”这个配置项,然后引入multidex的依赖“compile 'com.android.support.multidex:1.0.2'”。第二种方式是通过动态加载的方法来解决方法数越界的问题,动态加载技术也叫插件化技术,需要处理好其中的资源访问(未安装的插件apk)、Activity的生命周期管理(反射和接口方式等)、插件ClassLoader的管理等。
3、布局优化
布局优化的规则是尽量减少布局文件的层级。布局优化注意以下几点:
1)删除布局中无用的控件和层级。
2)有选择性的使用性能较低的ViewGroup,比如RelativeLayout。
3)如果布局中既可以使用LinearLayout也可以使用RelativeLayout,那么就使用LinearLayout。FrameLayout和LinearLayout一样都是简单高效的ViewGroup,我们可以考虑使用他们。
4)当布局层级比较复杂的时候,建议采用RelativeLayout来布局。
5)多采用<include>标签、<merge>标签和ViewStub。
<include>标签可以将一个布局加载到当前布局中,用来优化布局的复杂性和模块化,当<include>标签使用了android:layout_*属性的时候,那么宽高android:layout_width和android:layout_height必须存在,否则其他android:layout_*属性无法生效;
<merge>标签一般配合<include>标签,用来优化布局的层级。比如当前布局是垂直方法的LinearLayout,被包含的布局也是垂直方法的LinearLayout,那么被包含的布局中的LinearLayout是多余的,可以用<merge>标签来代替,用以减少布局层级。
ViewStub继承了View,它非常轻量级且宽高都是0,因此它本身不参与任何的布局和绘制过程。ViewStub的意义是按需加载所需的布局文件,适合一些布局文件按条件显示的场景。
4、绘制优化
绘制优化是指View的onDraw方法要避免执行大量的操作。注意两方面即可:第一,onDraw中不要插入新的布局对象;第二,onDraw中不要做耗时的任务,也不能执行成千上万的循环操作。这都是因为onDraw可能会被频繁调用,另外Android要求每帧的绘制时间不超过16ms(60fps,1000/60),因此这些操作可能会导致显示卡顿等。
5、内存泄露优化
内存泄露是一个比较重要的问题。内存泄露的优化分两种情况,第一,在开发过程中避免写出有内存泄露的代码;第二,通过工具(MAT)分析找出泄露点来进行优化。
6、性能优化建议
1)避免创建过多的对象。
2)不要过多使用枚举,枚举占有的内存空间比整型大。
3)常量使用 static final来修饰。
4)使用一些Android特有的数据结构,比如SparseArray和Pair等。
5)适当使用软引用和弱引用。
6)采用内存缓存和磁盘缓存。
7)尽量采用静态内部类,这样可以避免潜在的由于内部类而导致的内存泄露。
网友评论