1. 程式人生 > >Android開發中APK瘦身步驟

Android開發中APK瘦身步驟

apk瘦身

想辦法較減少apk大小

必要性

同樣功能,apk越小越好,使用者下載動機更大

瞭解apk的組成

  • classes.dex:是java原始碼編譯後生成的java位元組碼檔案
  • resources.arsc:編譯後的佈局檔案
  • AndroidManifest.xml
  • assets:目錄可以存放一些配置檔案
  • lib目錄下的子目錄armeabi存放的是一些so檔案或者jar包
  • META-INF目錄下存放的是簽名信息,用來保證apk包的完整性和系統的安全
  • res:apk圖片資源

瞭解apk生成過程

輔助分析工具

  • nimbledroid:能夠得知app記憶體使用,網路使用,磁碟輸入/輸出,檔案大小等一些NimbleDroid認為至關重要的資料;
    • 註冊
    • 登入
    • 上傳apk
    • 效果圖:”冒泡新聞_檔案分析.png”

瘦身步驟

0.開始大小–>19039kb
1.開啟minifyEnabled(開啟混淆,刪除沒用的java檔案),混淆筆記檢視 Proguard使用注意_billy–>18447kb

    buildTypes {
        debug {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

Proguard注意

  • 型別轉換錯誤,使用Gson之類的需要注意

    -keepattributes Signature
    
  • 忽略警告

    -ignorewarnings
    
  • webview中js和原生代碼有互動,保持橋樑類不被混淆

    -keepclassmembers  class  com.xxx.xxxx.xxxx.HuodongBeBindedToJS
    {
      public *;
    }
    
  • 第三方包不被混淆

    -libraryjars /libs/core.jar
    -dontwarn com.google.zxing.**
    -keep class com.google.zxing.** { *;}
    
  • 常見第三方包

    #zxing
    -libraryjars /libs/core.jar
    -dontwarn com.google.zxing.**
    -keep class com.google.zxing.** { *;}
    
    #支付寶
    -libraryjars /libs/alipay_sdk.jar
    -dontwarn com.alipay.android.app.**
    -keep class com.alipay.android.app.** {*;}
    #友盟
    -libraryjars /libs/umeng_sdk.jar
    -dontwarn com.umeng.**
    -keep class com.umeng.** { *;}
    -keepclassmembers class * {    public <init>(org.json.JSONObject); }
    -keep public class com.hyx.maizuo.main.R$*{     public static final int *; }
    -keep public class com.umeng.fb.ui.ThreadView { }
    
    
    #百度地圖
    -libraryjars /libs/baidumapapi.jar
    -dontwarn com.baidu.mapapi.**
    -keep class com.baidu.mapapi.** { *;}
    
    #fastJson
    -libraryjars /libs/fastjson-1.1.20.jar
    -dontwarn com.alibaba.fastjson.**
    -keep class com.alibaba.fastjson.** { *;}
    
    
    #微信
    -libraryjars /libs/libammsdk.jar
    -dontwarn com.tencent.mm.sdk.**
    -keep class com.tencent.mm.sdk.** {*;}
    

2.開啟shrinkResources(去除無用資源),同時去除工程中臨時展示的圖片–>17121kb

    debug {
        minifyEnabled true
        shrinkResources true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard.cfg'
    }

3.刪除無用的語言資源–>減少100kb左右

defaultConfig {
    ...
    resConfigs "zh"
    ...
   }    

4.使用tinypng有失真壓縮

  • TinyPNG 使用一種智慧有失真壓縮技術(通過降低圖片中的顏色數量,來減少儲存圖片所需要的資料)來降低 PNG 圖片的大小。這樣的壓縮對圖片的效果影響是很小的,但是可以大大降低圖片的大小,並且還能保持 PNG 的 alpha 透明度
  • 因為 TinyPNG 將 PNG 圖片壓縮成 8 位的 PNG(而不是24位),所以它的壓縮比例非常高,至少都有 50% 以上的壓縮比例,有些甚至可以達到70%,並且壓縮之後的圖片和原圖人眼基本看不出區別。

5.對於非透明的大圖,jpg將會比png的大小有顯著的優勢,在啟動頁,活動頁等之類的大圖展示區採用jpg將是非常明智的選擇–>15615kb
* 使用格式工廠進行轉換
* 瞭解常見圖片格式:http://baike.baidu.com/link?url=MGe8RiFIw8NjAnrE7 ETrr_LTm3y9fRdcjKAa2TSKLiknlGx6vopk8TyzfuFIPaTze9oM4Ljn4lPOCfgIaRC5K#16

7.刪除或者替換相容包(v4 v7 v13)中無用的一些圖
* 刪除drawable-ldrtl:是layout-direction-right-to-left的縮寫,意味著佈局方式從右到左,主要是為了適配阿拉伯語用。這應該是API17,即Android4.2上新出的功能

    drawable-ldrtl-xxxhdpi-v4
    drawable-ldrtl-xxhdpi-v4
    drawable-ldrtl-xhdpi-v4
    drawable-ldrtl-hdpi-v4
    drawable-ldrtl-mdpi-v4
  • 替換v4 v7 v13 中無用圖片資源_可選方式
    • 可以使用1x1畫素圖片,替換v4,v7,v13中的一些圖片資源

8.注意刪除第三方aar庫中使用的大圖_注意情況

9.so庫的刪除:建議實際工作的配置是隻保留armable、x86下的so檔案,算是一個折中的方案。

 armeabi :針對普通的或舊的arm v5 cpu
 armeabi-v7:庫會對圖形渲染方面有很大的改進,如果沒有這方面的要求,可以精簡。針對有浮點運算或高階擴充套件功能的arm v7 cpu.
 arm64-v8a:64位ARM裝置
 mips
 mips64
 x86
 x86_64

10.通過v4包中的DrawableCompat,通過著色方案完成selector效果,參考

Drawable icon = getResources().getDrawable(drawableId)
Drawable tintIcon = DrawableCompat.wrap(icon);
//1.著色一個selector
DrawableCompat.setTintList(tintIcon, getResources().getColorStateList(R.color.xx));
//2.著色一個顏色
DrawableCompat.setTintList(tintIcon, ColorStateList.valueOf(Color.BLUE));
imageView.setImageDrawable(tintIcon);

11.使用shape檔案替換圖片

<?xml version="1.0" encoding="utf-8"?>
<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle"
    >
    <corners android:radius="10dp"></corners>
    <solid android:color="#e6d5d5"></solid>
</shape>

12.切圖使用一套圖即可,參考美團客戶端,美團使用的一套drawable-xhdpi

13.把so檔案放置到網上或者sdcard內,參考https://segmentfault.com/a/1190000004062899

14.配合vectorDrawable使用向量圖 (相容性問題,5.0後才可使用)

15.使用微信資源混淆https://github.com/shwenzhang/AndResGuard

相關推薦

Android開發APK步驟

apk瘦身 想辦法較減少apk大小 必要性 同樣功能,apk越小越好,使用者下載動機更大 瞭解apk的組成 classes.dex:是java原始碼編譯後生成的java位元組碼檔案 resources.arsc:編譯後的佈局檔案

Android開發APK之法

Android 開發後,apk的大小往往會影響到使用者的下載體驗。開發人員本著追求極致的精神,apk瘦身是不得不做的工作。 先分析一下APK是由哪些元素構成的。 Android Studio 2.2 之後的版本,可直接能分析APK的大小,雙擊開啟就能

android APK全面總結——如何從32.6M到13.6M

前言 之前我簡單介紹了關於svg圖片瘦身的問題,在公司,瘦身這個問題是我提出來的,所以這鍋我背了。公司專案是32.6M,我給自己的要求就是低於20M。上週花了一個星期瘦身,至於為什麼花了一週,主要是svg適配問題我被搞矇蔽了。然後發現還要改大量程式碼,想想也就算了,又換了另一種瘦身方法。 很多人是因

android apk

頭條APK瘦身之路 隨著版本迭代,功能增加安裝包體積也會慢慢增大。 今日頭條576版本APK達到了25M,通過一系列的優化,到目前的607版本為12M。本文主要是介紹頭條APK瘦身中用到的一些方法。 APK分析 既然是要優化APK的大小,那首先就得看下APK檔案的構成。 Android

Android效能優化之apk技巧

隨著專案迭代,新功能的增加。回導致apk越大。那麼在下載安裝過程中。使用者耗費的流量越多。 安裝等待的時間也會越長。這就意味著下載轉化率會越低。那麼如何apk瘦身呢? 理解APK結構 在討論怎麼減小Apk體積之前,理解一個應用的APK結構是非常有幫助的。一個ap

Android 安裝包大小優化(Apk

目錄 1. 為什麼? APK越大,在下載安裝過程中,耗費的流量會越多,安裝等待的時間也會越長,安裝包的大小對下載的失敗率也有影響。而對於應用本身,就意味著下載轉化率會越低,在競品中,使用者更願意選擇功能多,體驗號,安裝包最小的應用。

Android效能調優;如何讓你的APK88%

隨著業務複雜度的逐漸增加,程式碼、資源也在不斷的增加,此時你的APP大小也在增加。從使用者層面來說,面對動輒幾十兆的APP來說在非WIFI情況下還是會猶豫要不要下載,不下載你就可能因此失去了一個使用者。從公司層面來講,流量就是錢,減少APP的大小就顯得尤為重要。從開發者層面上來講,你掌握了這個手藝也

Android APK/減小包體

隨著應用的長久迭代,各種功能模組的加入,APK包體越來越大,減小包體是必要的。 所以,從最簡單的來。 1.刪除無用資源 應用迭代就了,功能增刪,總會有無用資源殘留,所以,定期刪除無用資源是

Android APK 實踐(減小apk的大小)

因為推廣的需要,公司需要把APK的大小再“減小”一下,4M以內! 當達到4M以內之後,公司建議說,能否再壓壓?2M如何? 瘦身前 因為平時就考慮到大小的限制,所以很多工作已經做過了,如下列舉現在的狀態: 7.3M(Debug版本)和6.5M(Release版本)

[Android 之美] 那些你不知道的APK ,讓你的APK更小

[Android 之美] APK 瘦身,減少APK的大小 讓我們的apk檔案儘可能更小,移除那些未使用的程式碼和資原始檔。本章節介紹瞭如何做到讓APK更小,效能更好,下載轉化率會更高,以及如何指定在構建APK過程中保留或移除專案中的程式碼和資源,在我們還

Android 效能優化之記憶體檢測、卡頓優化、耗電優化、APK

導語 自2008年智慧時代開始,Android作業系統一路高歌,10年智慧機發展之路,如今 Android 9.0 代號P  都發布了,Android系統性能已經非常流暢了。但是,到了各大廠商手裡,改原始碼自定系統,使得Android原生系統變得魚龍混雜。另外,到了不同層次的

Android APK之旅

從APK的檔案結構說起 APK在安裝和更新之前都需要經過網路將其下載到手機,如果APK越大消耗的流量就會越多,特別是對於使用行動網路的使用者來講,消耗流量越多就代表需要花更多的錢去購買流量。同時一

Android XML shape 標籤使用詳解(apk,減少記憶體好幫手)

Android XML shape 標籤使用詳解   一個android開發者肯定懂得使用 xml 定義一個 Drawable,比如定義一個 rect 或者 circle 作為一個 View 的背景。但是,也肯定也有人在能使用 Drawable 的地方選擇使用一

android apk實戰

瘦身的目的 app運營中經常會聽到一句話:提高下載轉化率。什麼是下載轉化率?舉個栗子:你的應用大小是 18MB ,有100個潛在使用者想要去下載嘗試使用,結果有20個使用者嫌棄安裝包太大直接揚長而去,有20個使用者在等待下載的過程中取消下載,最終只有60

談談Android開發的Gradle那些事之不同BuildType編譯出不同版本號的apk

今天我們要來談談 如何讓不同的BuildType編譯出不同的版本號 沒搞錯吧?這有什麼用??為什麼會有這樣的需求??? 不想當產品的QA不是一個好RD RD不只是PM的RD, QA也總能在非常時期提出一些非常獨(坑)特(爹)的需求,而我們只能說沒問題!(: 男人怎

Gradle外掛開發 APK資源自定義7z壓縮

APK瘦身實戰 資源自定義7z壓縮 專案開發中,隨著業務的增長,常常需要在apk編譯階段對包程式碼或是資源做一定的自定義修改,比如熱修復,外掛生成,無埋點統計,渠道包生成等等。 但是公司專案業務開發人員基本上都很少接觸到相關技術,這裡以學習的態度,實現一套用

Android開發支付寶接入支付功能實現(詳細步驟

今天做了一下支付寶的支付功能的實現,記錄一下。(注意:因為服務時常更新,所以主要記錄操作方法,而非依葫蘆畫瓢。另外,這次簡單實現了訂單提交—結果獲取,並沒有做那些進一步的驗證,後期會逐步完善)步驟如下:下載最新的sdk則點選上圖中下面的那個"SDK及DEMO下載",然後選擇相

Android開發, 將apk和SQLite資料庫一起打包釋出 (沒root手機)

要把SQLite資料庫與apk一起打包很簡單,只要把資料庫匯出,並放在assets資料夾中,app首次開啟時載入就可以了。 但有個問題:沒root的手機不能通過DDMS檢視/data/的檔案(資料庫儲存在這裡)。我們只能通過adb shell來獲取資料庫檔案了。 開啟命

【實踐】Android apk實踐

專案背景: 更小的安裝包可以提升使用者轉化率,所以安裝包瘦身是很有必要的。 1:去除無用的語言資源 resConfigs “zh” 2:so庫相容 So(shared object,共享庫)是機器可以直接執行的二進位制程式碼,是Andr

玩轉APK:實現Android APK99.99%

下面我們將刪除 strings.xml檔案,並將AndroidManifest中的android:label屬性值更改為“A”。這看上去是一個小更改,但是它從resources.arsc中刪除了一項,削減了 Manifest 檔案中的字元數,並從“res”目錄中移除了一個檔案。略有裨益,我們削減了 22