APK的基本概念
在Android裝置上,直接運作APK檔案即可完成安裝
APK檔案其實是zip格式,但字尾名被修改為apk,通過解壓,可以看到Dex檔案,Dex是DalvikVM executes的簡稱,即Android Dalvik執行程式,并非Java ME的位元組碼而是Dalvik位元組碼
下圖是解壓之後的APK目錄
- META-INF\ (注:Jar檔案中常可以看到);
- res\ (注:存放資源檔案的目錄) ;
- AndroidManifest.xml (注:程式全局配置檔案) ;
- classes.dex (注:Dalvik位元組碼);
- resources.arsc (注:編譯後的二進制資源檔案)。
windows平台檢視某一個檔案的大小應該不是很困難的事情吧?
定義分工,優化APK是誰的責任?
首先得從APK的解壓目錄說起
通常來說占據APK記憶體大小的前四名為 classes.dex>=res>assets>lib
直接由程式員産生的其實隻有classes.dex檔案,因為這都是Java代碼,是以在這裡某些程式員同仁可能要甩鍋了,“APK安裝包過大,明明就是UI,美工切圖的問題!”
- 給的圖檔太占記憶體?寬高幾百像素的Imageview,UI給了我2M的圖檔,尼瑪,坑比!
- 圖檔适配給的太多?1280*720,1920*1080….整個res目錄全是各種分辨率合适嗎?
- 阿西巴,日語,韓語,英語,法語…?國際化素材打包這麼多?關鍵還包含北韓語,什麼鬼?
- 應用寶首發,小米首發,各種首發,需要高清大圖,安裝包滿的塞不下啦!
其實不然,不論我們拿到怎樣設計稿,切圖,作為程式員,我們都應該優雅的解決:
- 對UI給的圖檔進行極緻壓縮
- 格式壓縮,PNG轉成WebP,JPEG,壓縮工具-iSparta 由此可見WebP的體積減少最高可至80%!
- 尺寸壓縮 壓縮工具-tinypng,可以實作在無損壓縮的情況下圖檔檔案大小縮小到原來的30%-50%
- 圖檔僅使用一套,目前來說放在hdpi或者xhpdi目錄下都可以
-
國際化,多管道,針對不同情況下,由程式員打不同的APK包
方法1:打包過程中,清除沒有被引用過的資源通過
和shrinkResources true
minifyEnabled true
方法2:通過android { ... buildTypes { release { shrinkResources true minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } }
屬性指定的語言。未指定的語言的任何資源都被删除。resconfig
方法3:android { defaultConfig { ... resConfigs "en", "fr" } }
建構APK,支援按不同ABI,不同分辨率分割打包APKAPK Splits
android { ... splits { density { enable true exclude "ldpi", "tvdpi", "xxxhdpi" compatibleScreens 'small', 'normal', 'large', 'xlarge' } }
abi { enable true reset() include 'x86', 'armeabi-v7a', 'mips' universalApk true }
其次美工們也應當從根源上做起,切圖時需要遵循“圖檔像素不浪費”原則,設計稿标注多大的像素,那麼切的圖就應當為多大,此外,儲存圖檔格式時,可以适當降低圖檔品質,達到減小圖檔大小的問題。
APK加強
本人對加強技術所知甚淺,此處參考兩篇資料作出總結
- 對時下流行的Android應用加強技術分析
- Android App安全加強行業分析報告
大多數移動安全廠商其實的加強方案是整體dex加密技術,定制版加強與免費版加強方案上沒有差別,都是可執行檔案的加密保護。
總結資料
- 圖檔壓縮工具-iSparta
- 圖檔壓縮工具-tinypng
- 指定打包某一些資源檔案至APK中,清除沒有被引用的資源
- Wep探尋之路
- 對時下流行的Android應用加強技術分析
- Android App安全加強行業分析報告