1. 程式人生 > >老司機談APK瘦身套路-圖片資源篇

老司機談APK瘦身套路-圖片資源篇

       APK作為Android系統安裝包的檔案格式,一直備受廣大使用者的關注,APK越是臃腫肥大,在下載安裝過程中,它們耗費的流量會越多,安裝等待時間也會越長;對於產品本身,意味著下載轉化率會越低(因為競品中,使用者有更多機會選擇那個體驗最好,功能最多,效能最好,包最小的);對於研發來說,是一種優化改進技術的機會。今天老司機將帶領大家一起探討下APK脂肪含量最高的圖片資源瘦身套路。
這裡寫圖片描述

套路一:查詢並清除未使用圖片資源

       通常使用AndroidStudio中自帶的Lint工具來幫助我們查詢未使用的圖片資源,在AndroidStudio的選單中選擇Analyze->Inspecting Code即可進入Lint工具分析。
       分析過後,我們在結果列表中找到Unused resource這一欄開啟,裡面顯示的都是未被使用的資源列表,使用者可以參照來手動刪除資源。
這裡寫圖片描述

套路二:使用tinypng優化Android的資源圖片

這裡寫圖片描述

最簡單的使用點選上圖中虛線框,上傳需要壓縮的圖片

這裡寫圖片描述

這裡寫圖片描述
需要注意的是:

  • tinypng支援png和jpg圖片的壓縮,並且也支援9圖的壓縮。
  • tinypng的缺點是在壓縮某些帶有過渡效果(帶alpha值)的圖片時,圖片會失真。
  • tinypng提供了開放介面供開發者開發屬於自己的壓縮工具,不過這是付費服務,對於普通使用者來說,tinypng為每個使用者提供的每月圖片免費壓縮數量已經足夠了。

套路三:將Android的資源圖片轉化成Webp

套路四:不是每張圖片都需要適配多套解析度

       通常開發中我們會據不同尺寸的螢幕讓美工給我們切出多套圖片,比如hdpi、mdpi、xhdpi、xxhdpi、xxxhdpi等。但是實際上有些圖片可能不需要放置多套,比如ldpi解析度的種手機目前很少了。
       此外,我們所引入的第三方包中可能也引用了資源圖片,但是其中的某些我們可能是不想要的,比如ldpi和xxxhdpi,那麼是否可以設定什麼東西來讓打包的時候剔除他們呢?是可以的,可以配置下build.gradle

defaultConfig {
    resConfigs "en", "de", "fr", "it"
    resConfigs "hdpi", "xhdpi", "xxhdpi"
}

defaultConfig提供了resConfig這個flavor來指定打包出只打包某些資源,比如字串、圖片等等。

套路五:覆蓋第三方庫裡的大圖

       很多時候我們引入了大量的第三方庫,這些第三方庫裡又引用了一些大圖但是實際上並不會被我們用到,刪除又怕出錯,這時候我們就可以考慮用1x1的透明圖片覆蓋,已達到減少圖片資源空間佔用的問題。

套路六:使用9.png圖

       9.png格式的圖片在android 環境下具有自適應調節大小的能力。
(1)允許開發人員定義可擴充套件區域,當需要延伸圖片以填充比圖片本身更大區域時,可擴充套件區的內容被延展。
(2)允許開發人員定義內容顯示區,用於顯示文字或其他內容
        對於9.png的圖片,在繪製過程中,可拉伸區域儘量切小,另外可以通過使用9.png拉伸達到大圖效果的時候儘量不要使用整張大圖。

這裡寫圖片描述

套路七:用程式碼代替圖片

  • 使用shape製作背景圖


            很多背景圖比如按鈕的背景、純色背景都是可以用shape來製作的,這樣僅用xml程式碼就能代替png資源。比如這麼要給按鈕背景圖(純色背景、帶邊框、圓角)可以用shape而不是png圖片來製作:
    這裡寫圖片描述
<?xml version="1.0" encoding="utf-8"?>
<selector
  xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape>
            <stroke android:width="0.5dp" android:color="@android:color/white"/>
            <gradient android:startColor="#ffffff" android:endColor="#ffffff" android:angle="0.0" />
            <corners android:topLeftRadius="4dp" android:topRightRadius="0dp" android:bottomLeftRadius="4dp" android:bottomRightRadius="0dp" />
        </shape>
    </item>
</selector>
  • 用RotateDrawable代替僅僅是方向不同的“內容相同”的圖片

        這裡兩個圖片是兩個按鈕箭頭,但是僅僅方向不同而已,其實可以只用其中一個圖片即可,而另一個用RotateDrawable來讓其“調轉”180度:
這裡寫圖片描述

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/ic_arrow_left"
    android:fromDegrees="180"
    android:pivotX="50%"
    android:pivotY="50%"
    android:toDegrees="180" />
  • 用layer-list來製作多層圖片從而達到複用


            有些需求中需要一種圖片,但是明顯這個圖片是其他幾個圖片簡單疊加而已,那麼可以使用layer-list來達到目的:
    這裡寫圖片描述
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <!-- 最底層的圖片,以x,y軸座標為中心進行旋轉-->
        <rotate android:pivotX="0" android:pivotY="0"
            android:fromDegrees="-10" android:toDegrees="-10">
            <bitmap android:src="@mipmap/ic_launcher"/>
        </rotate>
    </item>
    <!-- 第二層的圖片,以x,y軸座標為中心進行旋轉-->
    <item>
        <rotate android:pivotX="0" android:pivotY="0"
            android:fromDegrees="15" android:toDegrees="15">
            <bitmap android:src="@mipmap/ic_launcher"/>
        </rotate>
    </item>
    <!-- 最上層的圖片,以x,y軸座標為中心進行旋轉-->
    <item>
        <rotate android:pivotX="0" android:pivotY="0"
            android:fromDegrees="35" android:toDegrees="55">
            <bitmap android:src="@mipmap/ic_launcher"/>
        </rotate>
    </item>
</layer-list>

套路八:用一張圖片實現按鈕按下和普通效果的樣式

方法:使用selector做遮罩,原圖做background
我們做按鈕的時候經常需要用兩個圖片來實現按鈕點選和普通狀態的樣式,這就需要提供兩種圖片,而且每個解析度下還有多套圖片,大大增加了apk的大小。
這裡寫圖片描述
這裡寫圖片描述

我們希望讓這兩張圖片合二為一,而且還能實現兩種或者多種狀態,怎麼做呢?我們首先建立一個圓形的selector,正常情況下是完全透明的,按下後透明度變小。
castiel_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true">
        <shape android:shape="oval">
            <solid android:color="#21000000" />
        </shape>
    </item>

    <item>
        <shape android:shape="oval">
            <solid android:color="#00000000" />
        </shape>
    </item>
</selector>

然後我們需要把selector檔案當作遮罩,用上面的安卓icon作為bg,放到一個ImageButton中:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <ImageButton
        android:id="@+id/btn_test"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:src="@drawable/castile_selector"
        android:background="@mipmap/ic_launcher" />

</LinearLayout>

總結

通過以上八大套路,相信已上車的小夥伴都能很好地掌握APK圖片資源瘦身方法,選擇適合自己專案的套路,相信你的APK會成功瘦掉圖片資源這塊脂肪。

安卓開發高階技術交流QQ群:108721298 歡迎入群

微信公眾號:mobilesafehome

(本公眾號支援投票)

Android安全技術大本營

相關推薦

司機APK套路-圖片資源

       APK作為Android系統安裝包的檔案格式,一直備受廣大使用者的關注,APK越是臃腫肥大,在下載安裝過程中,它們耗費的流量會越多,安裝等待時間也會越長;對於產品本身,意味著下載轉化率會越低(因為競品中,使用者有更多機會選擇那個體驗最好,功能最多,

APK套路-專案優化

1.專案結構瘦身套路 套路一:引入庫的優化 去掉無用的庫        專案中如果apk支援的最低版本是API14,而程式碼中沒有用到高於api14的api就可以考慮去掉整個android supp

安卓APK

android post 安卓 ons blog view git 用法 strong 之前打包的時候直接就用eclipse或者android studio直接生成簽名文件,並沒有關心大小問題,近期有人問我有沒有對APK進行瘦身。對這方面內容一致沒有關註過,今天試用了

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

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

APK優化,減小apk的大小

首先通過Android Studio自帶的工具分析我們的apk 這樣我們就可以很清楚地看到我們的apk中最大一部分是誰,點選對應項就可以檢視它的具體內容,如下圖 這裡我們可以詳細的看到apk中用到的所有的相關庫,可以根據自己的實際情況進行刪減,比如:我在壓縮

apk以及啟動速度優化

一、apk瘦身 1、minifyEnabled true,可以幫助移除那些在程式中使用不到的程式碼。 如下圖: 2、shrinkResources true移除那些在程式中使用不到的資源,幫助減少APP的安裝包大小。   二、apk啟動速度優化: 在app

android apk

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

Android效能優化之apk技巧

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

2M-APK實測可行又便捷的方法 (應用上架 陣前磨槍)

新專案上線,新應用原始apk大小在6.9M左右,然後公司和第三方運營公司合作,加入其提供的第三方SDK,瞬間apk體積增大3M;接著為了應用上線後的安全性,對應用進行了加固處理,套了一層殼之後,應用又增大了1.7M,最後上線之前包的體積已經超過10M,計算器這一工具類的應用包

微博 Qzone 微信 看某明星偷稅不如看司機Kafka的Broker和叢集是什麼回事

一個獨立的伺服器被稱之為Broker。Broker接收來自生產者的訊息,為訊息設定偏移量,並提交訊息到磁碟儲存。Broker為消費者提供服務,對讀取分割槽的請求做出響應,返回已經提交到磁碟上的訊息。根據特點的硬體及其特性特徵,單個Broker可以輕鬆的處理數千個分割槽以及每秒

Android 安裝包大小優化(Apk

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

新網站百度不收錄?司機教你三個套路

很多站長都會遇到這個問題,網站開發完成上線後,百度一直不收錄。 即使收錄也只是收錄個首頁,內頁很難快速被收錄。如何解決這個問題? 搜尋引擎的進化 網際網路早期,網站數量有限,所以人工整理是可行的,比如就有DMOZ這樣的人工編輯的網站資料庫,分門別類的整理好各種網

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過程中保留或移除專案中的程式碼和資源,在我們還

APK——更全面的方案

前陣子做了一次減包體的工作,過後覺得這項工作還是套路性挺強的,於是綜合當時的經驗以及廣泛瀏覽了網上的各種大牛小牛的部落格,實踐後特總結了以下的一些思路和做法,不求內容最豐富,只求方案更全面。 APK瘦身的目的 瘦身的目的最明顯的一個就是:提高下載轉化率。

Android開發中APK步驟

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

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

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

Apk、混淆、加固

一、 apk的組成元素: resources.arsc:編譯後的佈局檔案 assets:目錄存放一些配置檔案 lib:下的子目錄armeabi存放一些so檔案或者jar包 META-INF目錄下存放的是簽名信息,用來保證apk包的完整性和系統的安全 res:apk