面试题:
1. 谈谈你对apk瘦身的经验
2. System.exit(),onDestory,Activity.finish()的区别
1. 谈谈你对apk瘦身的经验
安装包体积对转化率、安装时间、运行内存、ROM空间几个方面影响都比较大。
-
业务梳理,开发模式升级
很多需要使用较大的so库的业务,尝试着使用h5或者小程序等其他方式替代。比如pdf文件加载,可以在使用H5插件转换为网页加载,而不是在客户端引入6M+的so来实现该功能。
-
ProGuard优化
避免过度keep,避免keep *的方式出现,keep整个package也需要谨慎处理。四大组件的进一步混淆,我认为暂时没那么大必要,稳定性为首要任务。
-
参考FaceBook开源的ReDex工具,对Dex文件进行压缩
这个操作生产上我们也没用,测试环境倒是有在使用。
-
图片大小优化
高清大图,进行有损压缩(使用tinypng网站)或者提供webp文件。没用alpha通道的png图,换成jpg图片,可以减少体积。
-
手动lint检查,手动删除无用资源
Android Studio上选择“Analyze”选项,然后选择“Inspect Code…”,范围根据需要选择执行,根据建议处理。
-
尽量少的使用三方库,避免引入体积比较大的libary。
rxJava,rxAndroid,zxing,zbar,Luban等,其实很多功能只需要拿核心代码过来就可以。
-
Gradle中配置shrinkResources打包时移除无用资源。
buildTypes { release { //开启代码混淆 minifyEnabled true //Zipalign优化 zipAlignEnabled true //移除无用的resource文件 shrinkResources true } }
2. System.exit(),onDestory,Activity.finish()的区别
System.exit()是退出进程,Activity.finish()是关闭页面,onDestory是销毁资源,后两个是调用关系。
原先我们项目只有一个Activity,所以会有很多static的资源,在退出app时,必须使用System.exit(),否则再次进入时会有异常发生。
System.exit():
结束整个进程,Activity所占用资源也会被释放。
Activity.finish():
关闭Activtiy,调用这个方法时,Activity栈中已经将该Activity移除,onDestory可能会稍晚执行。
onDestory:
系统销毁Activity所占用的内存空间。