apk瘦身的幾個技巧 - Optimize your app

轉(zhuǎn)載請注明原作者救氯,如果你覺得這篇文章對你有幫助或啟發(fā)想暗,可以關(guān)注打賞物遇。


使用VectorDrawable代替?zhèn)鹘y(tǒng)的png格式的ico

Android 5.0開始提供了新的API VectorDrawable 可以使用SVG類型的資源狈醉,也就是矢量圖喝峦。

與矢量圖相對應(yīng)的是柵格圖,png,jpg等格式的是柵格圖敷钾,在android中因為要適配不同分辨率的機型枝哄,我們需要在不同的資源文件夾下放置不同尺寸的圖片資源肄梨,因為柵格圖形是有固定數(shù)量的像素組成阻荒,放大會導(dǎo)致圖像失真模糊。

現(xiàn)在有了矢量圖的支持众羡,我們只需要一套圖標(biāo)資源就OK了侨赡,而且更節(jié)省空間png格式要好幾k,現(xiàn)在只需幾百字節(jié)粱侣。那要怎么做呢羊壹?

  • 添加VectorDrawable兼容包

      compile 'com.android.support:support-vector-drawable:24.1.0'
    
  • 將UI(UI使用Adobe Illustrator可以制作svg圖)給你的svg圖轉(zhuǎn)換為VectorDrawable

例如上面這個svg格式的icon用文本編輯器打開只這樣的:

    <?xml version="1.0" encoding="utf-8"?>
    <!-- Generator: Adobe Illustrator 17.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
    <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
    <svg version="1.1" id="圖層_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
         width="46.051px" height="46.051px" viewBox="0 0 46.051 46.051" enable-background="new 0 0 46.051 46.051" xml:space="preserve">
    <g>
        <g>
            <g id="XMLID_16_">
                <path fill="#040000" d="M36.219,10.212L21.707,8.94L3.025,27.407l15.799,15.618l18.681-18.467L36.219,10.212z M30.97,17.792
                    c-1.235,0-2.264-1.017-2.264-2.238c0-1.221,1.029-2.238,2.264-2.238c1.235,0,2.264,1.017,2.264,2.238
                    C33.235,16.825,32.205,17.792,30.97,17.792z"/>
            </g>
            <g id="XMLID_15_">
                <path fill="#040000" d="M35.653,17.601c-1.662,0-3.207-0.516-4.47-1.492l0.396-0.501c1.148,0.887,2.557,1.357,4.073,1.357
                    c3.71,0,6.729-2.984,6.729-6.652c0-3.668-3.019-6.652-6.729-6.652c-3.294,0-6.083,2.285-6.631,5.434l-0.634-0.108
                    c0.601-3.455,3.656-5.962,7.265-5.962c4.065,0,7.372,3.269,7.372,7.288S39.718,17.601,35.653,17.601z"/>
            </g>
        </g>
    </g>
    </svg>
    
轉(zhuǎn)換稱VectorDrawable后是什么樣呢?

    <vector android:height="20dp" android:viewportHeight="48.0"
    android:viewportWidth="48.0" android:width="20dp" xmlns:android="http://schemas.android.com/apk/res/android">
    <path android:fillColor="#040000" android:pathData="M36.219,10.212L21.707,8.94L3.025,27.407l15.799,15.618l18.681-18.467L36.219,10.212z M30.97,17.792
                c-1.235,0-2.264-1.017-2.264-2.238c0-1.221,1.029-2.238,2.264-2.238c1.235,0,2.264,1.017,2.264,2.238
                C33.235,16.825,32.205,17.792,30.97,17.792z"/>
    <path android:fillColor="#040000" android:pathData="M35.653,17.601c-1.662,0-3.207-0.516-4.47-1.492l0.396-0.501c1.148,0.887,2.557,1.357,4.073,1.357
                c3.71,0,6.729-2.984,6.729-6.652c0-3.668-3.019-6.652-6.729-6.652c-3.294,0-6.083,2.285-6.631,5.434l-0.634-0.108
                c0.601-3.455,3.656-5.962,7.265-5.962c4.065,0,7.372,3.269,7.372,7.288S39.718,17.601,35.653,17.601z"/>
</vector>

svg的path節(jié)點與VectorDrawable的path節(jié)點齐婴,fill屬性對應(yīng)fillColors屬性油猫,定義顏色,d屬性對應(yīng)pathData屬性柠偶,我們只需要在res/drawable目錄下創(chuàng)建xml文件情妖,將svg中的對應(yīng)屬性值復(fù)制過來即可。
height和width屬性定義絕對寬高诱担,viewportWidth和viewportHeight屬性定義畫布大小毡证,path超出畫布部分就不顯示了。
更多詳情請移步:
<https://developer.android.com/training/material/drawables.html>
<https://developer.android.com/reference/android/graphics/drawable/VectorDrawable.html>
<https://developer.android.com/reference/android/graphics/drawable/AnimatedVectorDrawable.html>
<http://www.w3.org/TR/SVG11/paths.html#PathData>

大圖使用webp格式

對于大圖蔫仙,無論是png 還是 jpg格式的料睛,可以將其轉(zhuǎn)換為webp格式的。

WebP格式摇邦,谷歌(google)開發(fā)的一種旨在加快圖片加載速度的圖片格式恤煞。圖片壓縮體積大約只有JPEG的2/3,并能節(jié)省大量的服務(wù)器帶寬資源和數(shù)據(jù)空間施籍。

webp可以作為應(yīng)用圖片傳輸?shù)母袷骄影牵梢怨?jié)省服務(wù)器的資源,用戶流量消耗及客戶端緩存空間占用法梯,當(dāng)然客戶端的靜態(tài)資源使用webp格式苔货,好處是顯而易見的犀概,當(dāng)然解析需要的cpu資源會增加,但相對于當(dāng)前移動設(shè)備的硬件性能過剩夜惭,這就不算什么了姻灶。

根據(jù)我個人的實驗,轉(zhuǎn)換格式的壓縮率是波動的诈茧,最多可縮減70%多产喉,少的可縮減1/3左右,對于一些只有十幾k的圖就不要轉(zhuǎn)換格式了敢会,反而會增加其大小曾沈。

那么怎么轉(zhuǎn)換格式呢?這里給大家一個網(wǎng)站(支持將文件轉(zhuǎn)存到Dropbox和GoogleDrive)鸥昏。將轉(zhuǎn)換后的webp格式的圖片直接放置到項目的mipmap目錄中即可塞俱,android4.0以上是可以直接使用的,包括在xml中引用,但AndroidStudio好像沒法預(yù)覽吏垮。
http://image.online-convert.com/convert-to-webp

對于其他的一些png圖使用tinypng壓縮

這里給大家一個好用的網(wǎng)站:
https://tinypng.com/

去除冗余依賴

謹(jǐn)慎引入開源庫障涯,因為一不小心就會導(dǎo)致你的app增加好幾兆。
對于那些app中引入好幾個網(wǎng)絡(luò)框架膳汪,或圖片加載框架唯蝶,無力吐槽了,最好將引入的第三方框架進(jìn)行封裝遗嗽,這樣方便以后的遷移粘我。
去除冗余的依賴,例如項目中要使用firebase分析痹换,我只需要添加
compile 'com.google.android.gms:play-services-base:9.4.0'
而不是整個:play-services包
compile 'com.google.android.gms:play-services:9.4.0'

去除第三方sdk冗余so庫

在build.gradle中android節(jié)點下添加

 packagingOptions {
    ***
    exclude 'lib/x86_64/libucrop.so'
    ***
    }

去除用不上的so庫征字,對于用到的只需保留armeabi-v7a的即可,v8指令集是兼容v7的晴音。

ShrinkResourcesGradle以及MinifyEnabled

添加到代碼中的庫可能包含未使用的資源柔纵。在APP的build.gradle文件中啟動shrinkResourcesGradle,它能自動替你刪除這些資源锤躁。

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

為了使用shrinkResources搁料,你必須啟動代碼壓縮,將minifyEnabled設(shè)置為true系羞。在構(gòu)建的過程中郭计,首先ProGuard會移除沒有使用的代碼,接著Gradle會移除沒有使用的資源椒振。
在Proguard中昭伸,是否保留符號表對APP的大小是有顯著的影響的,可酌情注釋下面這行代碼澎迎,但是建議盡量保留庐杨,它可以用于保留調(diào)試信息选调。

-keepattributes SourceFile,LineNumberTable  

微信資源壓縮打包

微信中的資源混淆工具主要為了混淆資源ID長度(例如將res/drawable/welcome.png混淆為r/s/a.png),同時利用7zip深度壓縮灵份,大大減少了安裝包體積仁堪,同時也增加了逼格,提升了反破解難度填渠。效果非常的好弦聂。
實現(xiàn)原理請查看:http://www.iteye.com/topic/1141990
使用請查看:https://github.com/shwenzhang/AndResGuard

That's all ! Sharing creates value.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市氛什,隨后出現(xiàn)的幾起案子莺葫,更是在濱河造成了極大的恐慌,老刑警劉巖枪眉,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捺檬,死亡現(xiàn)場離奇詭異,居然都是意外死亡瑰谜,警方通過查閱死者的電腦和手機欺冀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門树绩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來萨脑,“玉大人,你說我怎么就攤上這事饺饭〔吃纾” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵瘫俊,是天一觀的道長鹊杖。 經(jīng)常有香客問我,道長扛芽,這世上最難降的妖魔是什么骂蓖? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮川尖,結(jié)果婚禮上登下,老公的妹妹穿的比我還像新娘。我一直安慰自己叮喳,他們只是感情好被芳,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著馍悟,像睡著了一般畔濒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上锣咒,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天侵状,我揣著相機與錄音赞弥,去河邊找鬼。 笑死趣兄,一個胖子當(dāng)著我的面吹牛嗤攻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播诽俯,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼妇菱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了暴区?” 一聲冷哼從身側(cè)響起闯团,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎仙粱,沒想到半個月后房交,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡伐割,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年候味,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片隔心。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡白群,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出硬霍,到底是詐尸還是另有隱情帜慢,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布唯卖,位于F島的核電站粱玲,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏拜轨。R本人自食惡果不足惜抽减,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望橄碾。 院中可真熱鬧卵沉,春花似錦、人聲如沸堪嫂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽皆串。三九已至淹办,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間恶复,已是汗流浹背怜森。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工速挑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人副硅。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓姥宝,卻偏偏與公主長得像,于是被迫代替她去往敵國和親恐疲。 傳聞我的和親對象是個殘疾皇子腊满,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 本文會不定期更新,推薦watch下項目培己。如果喜歡請star碳蛋,如果覺得有紕漏請?zhí)峤籭ssue,如果你有更好的點子可以...
    天之界線2010閱讀 18,183評論 19 153
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,498評論 25 707
  • 本文來自尚妝Android團隊青峰發(fā)表于尚妝博客 APK瘦身探索 最近幾周一直在研究如何為APK瘦身省咨,折騰了很久肃弟,...
    尚妝產(chǎn)品技術(shù)刊讀閱讀 1,778評論 1 23
  • 最近幾周一直在研究如何為APK瘦身,折騰了很久零蓉,是時候?qū)懫┛涂偨Y(jié)一下了笤受,雖然已經(jīng)準(zhǔn)備了下周一要在客戶端周會分享用...
    風(fēng)清袖一閱讀 1,040評論 1 10
  • 活著而不作系統(tǒng)思考就好比制作陶器或制鞋而不遵循技術(shù)程序,或者根本不知道有技術(shù)程序敌蜂。 如果你想消除一切擔(dān)心箩兽,那么請設(shè)...
    shuiwu閱讀 403評論 1 1