面試題:
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所佔用的內存空間。