APK瘦身是長久以來的難題,咱們須要經過一些工具和技巧才能讓它瘦下去,下面我來分享一下我在apk瘦身方面的經驗。html
1、apk中有哪些東西node
1.代碼android
2.libgit
3.so本地庫github
4.資源文件(圖片,音頻,字體等)web
2、針對性解決問題架構
1.代碼app
咱們代碼的優化能夠經過混淆來刪除沒有用到的代碼:ide
buildTypes {
debug {
}
release {
minifyEnabled true // 是否混淆
shrinkResources true // 是否去除無效的資源文件
// 混淆的配置文件
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
詳細請參考:http://www.cnblogs.com/tianzhijiexian/p/4457763.htmlsvg
2.lib
儘可能不用太複雜的lib,輕量級lib是首選。若是你的應用沒用到兼容庫,能夠考慮去掉support包。
3.so本地庫
一個硬件設備對應一個架構(mips、arm或者x86),只保留與設備架構相關的庫文件夾(主流的架構都是arm的,mips屬於小衆,默認也是支持arm的so的,但x86的不支持)
4.資源文件
經過Lint工具掃描代碼中沒有使用到的靜態資源。請參考:
須要注意的是:Lint 會分析資源文件(好比 /res
文件夾下面的文件) ,可是會跳過 assets 文件 ( /assets
文件夾下面的文件)。事實上assets 文件是能夠經過它們的文件名直接訪問的,而不須要經過Java引用或者XML引用。所以,Lint 也不能斷定某個 asset 文件在項目中是否有用。這全取決於開發者對這個文件夾的維護了。若是你沒有使用某個asset 文件,那麼你就能夠直接清除這個文件。
5.用一張圖片來實現button.selector的多種狀態
解決思路是:用通用的遮罩來建設重複的圖片,詳情參考:
若是是5.0以上的版本:
一般按鈕的正反旋圖片咱們都是經過提供一張按鈕正常圖片和一張按鈕反選圖片,而後經過selector實現,兩張圖片除了alpha值不同外其它的內容都是重複的,在Android 5.0及以上的版本能夠經過tintcolor實現只提供一張按鈕的圖片,在程序中實現按鈕反選效果,前提是圖片的內容同樣,只是正反選按鈕的顏色不同。
6.複用現有的圖片,多用shape和layer-list
shape和layer-list一個能夠畫出不少常規的圖像,另外一個能夠將現有的圖像進行組合。經過這兩個東西可讓咱們最大限度的複用現有的圖片。儘量的重用已有的圖片資源。
對於下面的圖片:
咱們能夠只要求設計師提供鉛筆的icon,後面用shape畫一下背景就好,而不是要所有的圖片。
對於對稱的圖片,只須要提供一張,另一張圖片能夠經過代碼旋轉的方式實現,須要用到的就是animation的一個小技巧。下面分享一下使用的步驟:
我創建一個rotate_drawable.xml文件:
<?xml version="1.0" encoding="utf-8"?> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/blue_btn_icon" android:fromDegrees="180" android:pivotX="50%" android:pivotY="50%" android:toDegrees="180" />
而後,在button設置background:
<ImageButton android:layout_width="100dp" android:layout_height="100dp" android:background="@drawable/rotate_drawable"/>
7.優化現有的圖片
8.壓縮現有的圖片
圖片資源的優化原則是:在不下降圖片效果、保證APK顯示效果的前提下縮小圖片文件的大小。
tinypng的缺點是在壓縮某些帶有過渡效果(帶alpha值)的圖片時,圖片會失真,這種圖片能夠將png圖片轉換爲下面介紹的webP格式,能夠在保證圖片質量的前提下大幅縮小圖片的大小。
8.2 把現有圖片轉換爲webP
10.使用VectorDrawable和SVG圖片來替換原有圖片
用svg替換原來圖片但是一個大殺,能馬上將圖片減小,並且不用考慮分辨率適配的問題。那麼將svg圖片導入工程呢?答:須要配合vectorDrawable。
在android5.0(API Level 21)中,咱們可使用矢量圖:vector drawable,vector drawable的特色是它不會由於圖像的縮放而失真。在安卓開發中也就意味着你不須要爲不一樣分辨率的設備定義不一樣大小的圖片資源,只需一個vector drawable就夠了。
<!-- res/drawable/vectordrawable.xml --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="64dp" android:width="64dp" android:viewportHeight="600" android:viewportWidth="600"> <group android:name="rotationGroup" android:pivotX="300.0" android:pivotY="300.0" android:rotation="45.0" > <path android:name="v" android:fillColor="#000000" android:pathData="M300,70 l 0,-70 70,70 0,0 -70,70z" /> </group> </vector>
若是想深刻了解請參考:
http://jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0123/2346.html
http://jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0201/2396.html
http://jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0301/2514.html
http://jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0301/2515.html
http://jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0306/2553.html
在低版本中可使用開源的第三方庫來實現:
https://github.com/wnafee/vector-compat
https://github.com/telly/MrVector
9.資源文件最少化配置
Android 開發常常會依賴各類外部開源代碼庫,好比Android Support Library, Google Play Services, Facebook SDK 等等。可是這些庫裏面並非全部的資源文件你都會用到。好比, Google Play Services 裏面會有一些爲其餘語種提供翻譯,而你的app又不須要這個語種的翻譯,並且這個庫裏面還包含了個人app中不支持的 mdpi 資源文件。
還好從Android Gradle Plugin 0.7 開始,你能夠配置你的app的build系統。這主要是經過配置 resConfig
和 resConfigs
以及默認的配置選項。下面的 DSL (Domain Specific Language)就會阻止 aapt(Android Asset Packaging Tool)打包app中不須要的資源文件。
defaultConfig { // ... resConfigs "en", "de", "fr", "it" resConfigs "nodpi", "hdpi", "xhdpi", "xxhdpi", "xxxhdpi" }
你也能夠用這個方式:
android { ... splits { density { enable true exclude "ldpi", "tvdpi", "xxxhdpi" compatibleScreens 'small', 'normal', 'large', 'xlarge' } }
android { ... splits { abi { enable true reset() include 'x86', 'armeabi-v7a', 'mips' universalApk true } } }
詳細請參考:http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits
參考自:
http://zmywly8866.github.io/2015/04/06/decrease-apk-size.html
http://hukai.me/android-tips-for-reduce-apk-size/
http://hao.jser.com/archive/1634/
http://stackoverflow.com/questions/20599840/gradle-builds-for-every-resource-folder