讓你的APK瘦成一道閃電

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工具掃描代碼中沒有使用到的靜態資源。請參考:

在Android Stuido中使用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.優化現有的圖片

  • jpeg仍是png,根據須要作選擇,在某些時候jpeg能夠減小圖片的體積。
  • 對於9.png的圖片,可拉伸區域儘可能切小,另外能夠經過使用9.png拉伸達到大圖效果的時候儘可能不要使用整張大圖。
  • 有選擇性的提供hdpi,xhdpi,xxhdpi的圖片資源。建議優先提供xhdpi的圖片,對於mdpi,ldpi與xxxhdpi根據須要提供有差別的部分便可。

 

8.壓縮現有的圖片

圖片資源的優化原則是:在不下降圖片效果、保證APK顯示效果的前提下縮小圖片文件的大小。

8.1 使用tinypng優化大部分圖片資源:

使用tinypng優化Android的資源圖片

tinypng的缺點是在壓縮某些帶有過渡效果(帶alpha值)的圖片時,圖片會失真,這種圖片能夠將png圖片轉換爲下面介紹的webP格式,能夠在保證圖片質量的前提下大幅縮小圖片的大小。

 

8.2 把現有圖片轉換爲webP

其餘圖片和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"
}

 

你也能夠用這個方式:

Density Splits

android {
  ...
  splits {
    density {
      enable true
      exclude "ldpi", "tvdpi", "xxxhdpi"
      compatibleScreens 'small', 'normal', 'large', 'xlarge'
    }
  }
enable: enables the density split mechanism
exclude: By default all densities are included, you can remove some densities.
include: indicate which densities to be included
reset(): reset the list of densities to be included to an empty string (this allows, in conjunctions with include, to indicate which one to use rather than which ones to ignore)
compatibleScreens: indicates a list of compatible screens. This will inject a matching <compatible-screens><screen ...> node in the manifest. This is optional.
 
Note that this will also always generate a universal APK with all the densities.
 

ABIs Splits

android {
  ...
  splits {
    abi {
      enable true
      reset()
      include 'x86', 'armeabi-v7a', 'mips'
      universalApk true
    }
  }
}
enable: enables the ABIs split mechanism
exclude: By default all ABIs are included, you can remove some ABIs.
include: indicate which ABIs to be included
reset(): reset the list of ABIs to be included to an empty string (this allows, in conjunctions with include, to indicate which one to use rather than which ones to ignore)
universalApk: indicates whether to package a universal version (with all ABIs) or not. Default is false.
 
 

詳細請參考:http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits

一個完整的例子:https://android.googlesource.com/platform/tools/base/+/2101d189d85dd46f865726b9b7aa0012832a6d9c/build-system/tests/regular/densitySplit/build.gradle

 

 

參考自:

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

相關文章
相關標籤/搜索