成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

類比于微信,如何對Apk進行極限壓縮,談下Android壓縮8大步

移動開發 Android
隨著項目的不斷迭代,代碼量跟資源文件不斷增多。那么就會出現打包后的 APK 文件越來越大,如果突然有一天你們老板或領導叫你優化 APK 大小,你還不知道怎么優化那就有點說不過去了,這篇文章咱們就來一起分析并優化 APK 體積大小吧。

簡介

隨著項目的不斷迭代,代碼量跟資源文件不斷增多。那么就會出現打包后的 APK 文件越來越大,如果突然有一天你們老板或領導叫你優化 APK 大小,你還不知道怎么優化那就有點說不過去了,這篇文章咱們就來一起分析并優化 APK 體積大小吧。

分析 APK 資源占用

注意:

我是在 GitHub 找了一個人氣比較高的開源項目,需要的話自己可以點擊下載,自己動手嘗試一番。 

類比于微信,如何對Apk進行極限壓縮,談下Android壓縮8大步

分析工具直接用的 AS Build/Analyze APK 

從上面圖中得出 assets > classes.dex > res > lib 其中資源文件占用最大。

下面我們就來看看怎么減小 APK 大小吧。

優化 APK 體積八大步

1. 將圖片轉換為 webp 格式

Webp 概念

WebP 是一種同時提供了有損壓縮與無損壓縮的圖片文件格式,派生自視頻編碼格式 VP8。WebP 最初在2010年發布,目標是減少文件大小,但達到 和 JEPG 格式相同的圖片質量,希望能夠減少圖片檔在網絡上的發送時間。2011年11月8日,Google 開始讓 WebP 支持無損壓縮和透明色的功能。

根據 Google 較早的測試,WebP 的無損壓縮比網絡上找到的 PNG 檔少了 45% 的文件大小,即使這些 PNG 檔在使用 PNGCRUSH 和 PNGOUT 處理過,WebP 還是可以減少 28% 的文件大小。就目前而言,Webp 可以讓圖片大小平均減少 70% 。WebP 是未來圖片格式的發展趨勢。

PNG / JPG to Webp

類比于微信,如何對Apk進行極限壓縮,談下Android壓縮8大步

點擊圖片或者文件夾右鍵選擇 Convert to Webp 格式,將 png / jpg 圖片壓縮為 webp 格式圖片。

類比于微信,如何對Apk進行極限壓縮,談下Android壓縮8大步

最后我們只減少了不到 200 kb 左右,有可能項目圖片資源本來就沒有多大,只是太多小圖片導致的。

應用場景及優勢

  • 客戶端軟件,內嵌了基于 Chromium 的 webview,這類瀏覽器中應用的網頁是可以完全使用WebP 格式,提升加載渲染速度,不考慮兼容。
  • 用 node-webkit 開發的程序,用 WebP 可以減少文件包的體積。
  • 移動應用 或 網頁游戲 ,界面需要大量圖片,可以嵌入 WebP 的解碼包,能夠節省用戶流量,提升訪問速度優勢:
  • 對于 PNG 圖片,WebP 比 PNG 小了45%。

2. 去除多語言

在 app/build.gradle 添加

  1. android{ 
  2.  ... 
  3.  defaultConfig{ 
  4.  ... 
  5.  //只保留英語 
  6.  resConfigs "en" 
  7.  } 

 

類比于微信,如何對Apk進行極限壓縮,談下Android壓縮8大步

這里我們發現減少了大概 200 kb

 

3. 去除不必要 so 庫

通過反編譯 Android 微信版本 得知,微信也只適配了 armeabi-v7a 架構,那么我們刪掉其它庫的支持吧。

  1. android{ 
  2.  ... 
  3.  defaultConfig{ 
  4.  ... 
  5.  ndk { 
  6.  //設置支持的SO庫架構 
  7.  abiFilters "armeabi-v7a" 
  8.  } 

 

類比于微信,如何對Apk進行極限壓縮,談下Android壓縮8大步
又優化了差不多 600 kb ,繼續。 

4. 去除無用資源 Link 檢查(謹慎刪除)

概念

Lint 是 Android Studio 提供的 代碼掃描分析工具,它可以幫助我們發現代碼結構 / 質量問題,同時提供一些解決方案,而且這個過程不需要我們手寫測試用例。代碼迭代版本一多,很容易會遺留一些無用的代碼、資源文件,我們可以使用 Lint 進行清除。

怎么使用 Link 檢查

打開 AS 工具,找到 Analyze > Run Inspection By Name > unused resources

優化

類比于微信,如何對Apk進行極限壓縮,談下Android壓縮8大步

發現我們 link 大概優化了 700 kb繼續。

注意

因為 link 是檢查有沒有引用來做的判斷是否使用了資源,那么如果是這種方式勒,所以在刪除的時候一定要謹慎。

  1. //動態獲取資源 id , 未直接使用 R.xx.xx ,則這個 id 代表的資源會被認為沒有使用過(類似不能混淆反射類) 
  2. int indetifier =getResources().getIdentifier("img_bubble_receive""drawable", getPackageName()); getResources().getDrawable(indetifier); 

5. 開啟混淆

類比于微信,如何對Apk進行極限壓縮,談下Android壓縮8大步

優化了大概 1.7M 繼續。

 

6.移除無用資源 shinkResource

開啟 shinkResource = true

  1. buildTypes { 
  2. release { 
  3. minifyEnabled true 
  4. shrinkResources = true 
  5. proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
  6. debug { 
  7. shrinkResources = true 
  8. minifyEnabled true 
  9. proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 

  類比于微信,如何對Apk進行極限壓縮,談下Android壓縮8大步  

這個有可能 link 刪除了無用資源,所以沒有在優化了。

7.開啟刪除無用資源 (嚴格模式和普通模式) - 這個我這里就不可測試,你們下來可以測試下效果。

普通模式也就是自定義模式

如果您有想要保留或舍棄的特定資源,請在您的項目中創建一個包含 標記的 XML 文件,并在 tools:keep 屬性中指定每個要保留的資源,在 tools:discard 屬性中指定每個要舍棄的資源。這兩個屬性都接受逗號分隔的資源名稱列表。您可以使用星號字符作為通配符。

例如:

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <resources xmlns:tools="http://schemas.android.com/tools" 
  3.  tools:keep="@layout/l_used*_c,@layout/l_used_a,@layout/l_used_b*" 
  4.  tools:discard="@layout/unused2" /> 

將該文件保存在項目資源中,例如,保存在 res/raw/keep.xml。構建不會將該文件打包到 APK 之中。

指定要舍棄的資源可能看似愚蠢,因為您本可將它們刪除,但在使用構建變體時,這樣做可能很有用。例如,如果您明知給定資源表面上會在代碼中使用(并因此不會被壓縮器移除),但實際不會用于給定構建變體,就可以將所有資源放入公用項目目錄,然后為每個構建變體創建一個不同的 keep.xml 文件。構建工具也可能無法根據需要正確識別資源,這是因為編譯器會添加內聯資源 ID,而資源分析器可能不知道真正引用的資源和恰巧具有相同值的代碼中的整數值之間的差別。

嚴格模式

正常情況下,資源壓縮器可準確判定系統是否使用了資源。不過,如果您的代碼調用 Resources.getIdentifier()(或您的任何庫進行了這一調用 - AppCompat 庫會執行該調用),這就表示您的代碼將根據動態生成的字符串查詢資源名稱。當您執行這一調用時,默認情況下資源壓縮器會采取防御性行為,將所有具有匹配名稱格式的資源標記為可能已使用,無法移除。

例如,以下代碼會使所有帶 img_ 前綴的資源標記為已使用。

  1. String name = String.format("img_%1d", angle + 1); 
  2. res = getResources().getIdentifier(name"drawable", getPackageName()); 

資源壓縮器還會瀏覽代碼以及各種 res/raw/ 資源中的所有字符串常量,尋找格式類似于 file:///android_res/drawable//ic_plus_anim_016.png 的資源網址。如果它找到與其類似的字符串,或找到其他看似可用來構建與其類似的網址的字符串,則不會將它們移除。

這些是默認情況下啟用的安全壓縮模式的示例。但您可以停用這一“有備無患”處理方式,并指定資源壓縮器只保留其確定已使用的資源。要執行此操作,請在 keep.xml 文件中將 shrinkMode 設置為 strict,如下所示:

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <resources xmlns:tools="http://schemas.android.com/tools" 
  3.  tools:shrinkMode="strict" /> 

如果您確已啟用嚴格壓縮模式,并且代碼也引用了包含動態生成字符串的資源(如上所示),則必須利用 tools:keep 屬性手動保留這些資源。

8. AndResGuard 微信資源壓縮方案

什么是 AndResGuard

AndResGuard 是一個縮小 APK 大小的工具,它的原理類似 Java Proguard ,但是只針對資源。它會將原本冗長的資源路徑變短,例如將 res/drawable/wechat 變為 r/d/a。

為什么使用 AndResGuard

在以往的開發中,我們通常只混淆了代碼,資源文件卻暴露在他人面前,res 文件夾下所有文件名的可讀性過強。

使用后的效果 

類比于微信,如何對Apk進行極限壓縮,談下Android壓縮8大步

AndResGuard 的配置

項目根目錄下 build.gradle 中,添加插件的依賴:

  1. dependencies { 
  2.  classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.2.16' 
  3.  } 

在 app 目錄下,創建 and_res_guard.gradle 文件。

  1. apply plugin: 'AndResGuard' 
  2. andResGuard { 
  3.  mappingFile = null 
  4.  use7zip = true 
  5.  useSign = true 
  6.  keepRoot = false 
  7.  compressFilePattern = [ 
  8.  "*.png"
  9.  "*.jpg"
  10.  "*.jpeg"
  11.  "*.gif"
  12.  "resources.arsc" 
  13.  ] 
  14.  whiteList = [ 
  15.  // your icon 
  16.  "R.drawable.icon"
  17.  // for fabric 
  18.  "R.string.com.crashlytics.*"
  19.  // for umeng update 
  20.  "R.string.tb_*"
  21.  "R.layout.tb_*"
  22.  "R.drawable.tb_*"
  23.  "R.drawable.u1*"
  24.  "R.drawable.u2*"
  25.  "R.color.tb_*"
  26.  // umeng share for sina 
  27.  "R.drawable.sina*"
  28.  // for google-services.json 
  29.  "R.string.google_app_id"
  30.  "R.string.gcm_defaultSenderId"
  31.  "R.string.default_web_client_id"
  32.  "R.string.ga_trackingId"
  33.  "R.string.firebase_database_url"
  34.  "R.string.google_api_key"
  35.  "R.string.google_crash_reporting_api_key"
  36.  //友盟 
  37.  "R.string.umeng*"
  38.  "R.string.UM*"
  39.  "R.layout.umeng*"
  40.  "R.drawable.umeng*"
  41.  "R.id.umeng*"
  42.  "R.anim.umeng*"
  43.  "R.color.umeng*"
  44.  "R.style.*UM*"
  45.  "R.style.umeng*"
  46.  //融云 
  47.  "R.drawable.u*"
  48.  "R.drawable.rc_*"
  49.  "R.string.rc_*"
  50.  "R.layout.rc_*"
  51.  "R.color.rc_*"
  52.  "R.id.rc_*"
  53.  "R.style.rc_*"
  54.  "R.dimen.rc_*"
  55.  "R.array.rc_*" 
  56.  ] 
  57.  sevenzip { 
  58.  artifact = 'com.tencent.mm:SevenZip:1.2.10' 
  59.  } 

在 app 模塊下的 build.gradle 文件添加:

  1. apply from'and_res_guard.gradle' 

打包完之后效果圖

類比于微信,如何對Apk進行極限壓縮,談下Android壓縮8大步  

類比于微信,如何對Apk進行極限壓縮,談下Android壓縮8大步

資源壓縮了大概 1M 

總結

項目體積越大,資源越多,效果就越明顯。

使用 Link 刪除資源的話,一定要謹慎,提前做好備份。

咱們這里因為項目本身只有 22 M 多,最后優化了 4.5 M 下去。也還是很不容易的。

 

責任編輯:未麗燕 來源: 安卓巴士
相關推薦

2021-09-27 16:39:10

PythonGif壓縮

2022-08-11 07:07:46

系統Linux日志

2021-03-19 12:53:35

微步在線威脅情報安全

2023-11-27 15:06:24

2009-07-20 17:42:04

iBATIS入門

2012-12-04 11:07:29

專家惠普轉型

2009-05-08 09:20:56

IT創業員工就業

2010-05-19 13:27:58

IIS壓縮

2016-04-01 10:34:29

APK壓縮Android

2010-01-04 09:27:31

Linux壓縮解壓縮命令詳解

2009-07-17 10:20:24

iBATIS實例

2023-07-05 07:36:36

SpringJava代碼

2013-10-09 09:32:58

2024-07-02 11:30:00

存儲壓縮算法

2015-12-31 11:02:32

SDN軟件定義網絡2016

2012-07-27 15:53:42

微信

2016-12-01 09:43:21

RDMA over FSSDRDMA

2010-03-02 17:55:33

Android系統

2013-10-08 09:27:15

Linux
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91精品久久久久久久久中文字幕 | 日韩一区二区三区视频在线观看 | 欧美极品一区二区 | 天天夜碰日日摸日日澡 | 成人免费大片黄在线播放 | 日韩二三区 | www国产成人免费观看视频,深夜成人网 | 在线视频亚洲 | 久久免费精品视频 | 九九久久久| 成人在线免费观看 | 草久久 | 精品久久久久久久久久久久久久 | 91综合网 | 日韩成人在线网站 | 中文字幕在线第一页 | 欧美做暖暖视频 | 色婷婷综合久久久中字幕精品久久 | 九色视频网站 | 五月天天丁香婷婷在线中 | 日韩精品一区二区三区视频播放 | 黄色大片网 | 亚洲一区高清 | 久久久久国产 | 日韩一区二区在线观看 | 亚洲69p| 在线精品一区 | 午夜小视频在线播放 | 亚洲一区二区高清 | 五月综合激情在线 | 日本在线观看视频 | 日本淫视频 | 国产精品久久久久无码av | 中文字幕亚洲一区二区三区 | 精品一二三区在线观看 | 国产乱码精品一区二三赶尸艳谈 | 日本久久久久久 | 在线观看成人 | 看a级黄色毛片 | 日韩高清中文字幕 | 午夜成人在线视频 |