1、安装包太大会对下载失败率有影响。
2、图片采用webP,可以节省用户流量。
3、减少随机读写操作,以此减少对磁盘的IO操作。
4、避免在主线程中进行I/O操作,尤其是写操写。否则在磁盘空间不足情况下,容易引起写入放大。将IO操作移到非主线程中执行即可。
5、利用缓冲区,会有效减少磁盘IO的操作次数。先将对象序列化后的信息写入到缓存区中,然后再一次性写入到磁盘上。
6、合理设置Buffer的大小,设置小了,起不到减少操作IO的次数。也不能设置太大了,否则会导致申请buffer的时间变长。buffer的大小设置
= 读写大小 / 读写次数。
7、如果ZIP文件已保存在本地,解压ZIP中所有的文件,使用ZipFile效率比ZipInputStream高出15-27%。
8、如果ZIP文件已保存在本地,仅解压ZIP中某些文件,建议使用ZipFile。
9、如果ZIP文件不在本地磁盘上,或者需要顺序解压一小部分文件,又或者ZIP文件目录损坏,建议使用ZipInputStream.
10、首次安装的表为空时,不要做无谓的查询操作。
11、对于覆盖安装,在表已经存在的情况下,可以使用insertor replace语句来完成插入。
12、打开数据库会比较耗时,还伴有一些I/O操作,建议在数据库打开后,先不要关闭,在应用程序退出时再关闭。可以采用缓存数据库连接的做法。
13、数据库表如果使用了autoincrement时,需要要额外维护sqlite_sequence而增加的额外I/O开销。增加这个自动递增后,会比没有加这个,耗时多一倍以上。autoincrement关键字会增加CPU、内存、磁盘空间、磁盘IO的负担,所以尽量不要用,除非一定要这样做。
14、解码Bitmap不要使用decodeFile,这样效率不高,建议使用decodeStream,同时传入的文件流为BufferedInputStream。同样decodeResource同样存在性能问题,建议用decodeResourceStream。
15、避免主线程I/O:
(1)避免主线程操作文件和数据库,50%以前的卡顿问题都是由主线程I/O引起的。
(2)用apply代替Sharepreference.commit,前者是异步,后者是同步操作。
(3)提前初始化SharePreference.多进程的android初始化过程的IO读写都是在主线程中的。
16、减少IO读写量:
(1)减少使用select*,从减少从数据库读取的数据量减少耗时。
(2)利用缓存减少重复读写。内存缓存命中极高,投入产出高。
(3)数据库少用autoincrement。
(4)使用合适的数据库分页,sqlite读写磁盘是以page为单位的。从3.12.0开始,pagesize为4KB。
(5)频繁查询的表使用索引,索引可以极大地减少读磁盘的数据量,极大提高效率。
(6)避免无效索引。无效索引除了会触发全表扫描,产生大量冗余的读写之外,还降低了写入性能。
17、减少IO操作次数:
(1)使用8KBBuffer读写,可以减少2到3倍的耗时。
(2)批量更新数据库使用事务。启用事务,会大量减少IO读写。
(3)ZIP压缩大量小文件时建议使用ZipInputStream.
18、避免内存泄漏:避免Activity泄漏,意味着被引用的View、图片等全部泄漏。
19、减少常驻内存:
(1)尽量使用RGB565,将节省图片的内存,高达50%。
(2)避免内存重复。
(3)res/drawable里的图片建议使用Drawable.createFromStream来加载,图片要放置到合适的资源文件夹(hdpi,xxhdpi),使用错误的文件夹,导致图片被放大,最终使用app内存增加。
20、对所有图片解码API做OutOfMemoryError的异常处理。
21、减少GC:
(1)Bitmap尽量使用inBitmap。
(2)建议使用SpraseMap或ArrayMap.
(3)建议StringBuilder重用。
22、核心场景CPU算法最优:
(1)能用int的绝不用float,比较两个float数值大小的执行时间是int数值的4倍左右。
(2)选择合适的容器:一般的容器:Vector、HashMap、LinkedHashMap等,android提供在内存稀缺的性能场景使用的容器:ArrayMap、SparseArray等,基于线程安全,ConcurrentHashMap等。
23、省电的做法,尽量让CPU休眠:
(1)锁屏、灭屏、程序放置后台时,释放或停止Android涉及的耗电服务:GPS、WifiManager、Sensor等。
(2)锁屏、灭屏释放WakeLock,否则会让CPU无法休眠,导致严重的耗电问题。