日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
APK瘦身記,如何實現(xiàn)高達53%的壓縮效果

1、我是怎么思考這件事情的

創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設、高性價比中江網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式中江網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設找我們,業(yè)務覆蓋中江地區(qū)。費用合理售后完善,十余年實體公司更值得信賴。

APK是Android系統(tǒng)安裝包的文件格式,關于這個話題其實是一個老生常談的題目,不論是公司內(nèi)部,還是外部網(wǎng)絡,前人前輩已經(jīng)總結出很多方法和規(guī)律。不過隨著移動端技術近兩年的飛速發(fā)展,一些新的思維方式和優(yōu)化方法也逐漸涌現(xiàn)和成熟起來。筆者在實踐過程中踩過一些坑,收獲了一些經(jīng)驗,在這里做個思考和總結,所以隨筆給大家,希望對大家從事相關工作的時候有所幫助和參考,同時也是拋磚引玉,希望大家共同探討這個開放性的話題。

關于為什么APK要瘦身,這個不多說,只從三個方面嘮叨一下,對于用戶(或者客戶)來說,APK越大,在下載安裝過程中,他們耗費的流量會越多,安裝等待時間也會越長;對于產(chǎn)品本身,意味著下載轉化率會越低(因為競品中,用戶有更多機會選擇那個體驗***,功能最多,性能***,包最小的);對于研發(fā)來說,是一種優(yōu)化改進技術的機會。

欲瘦身,我們先找找胖的原因和問題。按目標-路徑-資源的思維模式,找原因和問題有如下幾條路徑,一是拍腦袋,按自己的經(jīng)驗和判斷,甚至是主觀想象;二是去搜索引擎找關鍵字,逛各種技術論壇聽技術大牛們怎么說,看各類技術文章抽取提煉;三是用一種可測量的工具或者方法發(fā)現(xiàn)問題。

前兩種不贅述,我這里說說第三種方法。用一種可測量的工具或者方法來分析,所謂工欲善其事,必先利其器。這個器可以可以自己鍛造,也可以用現(xiàn)成的。這里推薦一個在線apk分析工具,因為是外部工具,所以大家請在使用過程中,不要上傳未發(fā)布出去的產(chǎn)品,為了數(shù)據(jù)安全,筆者這里拿一個github上開源的Android項目作為瘦身示例。
2、尋找問題

NimbleDroid 是美國哥倫比亞大學的博士創(chuàng)業(yè)團隊研發(fā)出來的分析Android app性能指標的系統(tǒng),分析的方式有靜態(tài)和動態(tài)兩種方式,其中靜態(tài)分析可以分析出APK安裝包中大文件排行榜,各種知名SDK的大小以及占代碼整體的比例,各種類型文件的大小以及占排行,各種知名SDK的方法數(shù)以及占所有dex中方法數(shù)的比例,廢話不多說,下面上高清無碼大圖看看顏值吧。

如果想使用分析功能分析自己的產(chǎn)品,請登錄并上傳自己產(chǎn)品的apk包,所有功能目前均免費使用,如果是想分析Google Play上已經(jīng)發(fā)布的產(chǎn)品,可以直接點擊"Play Apps"查看,還可以使用搜索功能根據(jù)應用名和包名查看結果。再次強調(diào)下,請不要上傳任何未發(fā)布的產(chǎn)品。

登錄

上傳apk文件

分析結果摘要,可以看到一些概覽的信息,apk文件大小,總的方法數(shù)

文件大小分析詳情頁,大文件列表,這里列出的是apk文件中超過100k的文件排行,這里的文件大小指的是apk文件中的大小

各種知名SDK的大小以及占代碼整體的比例,這里目前能識別出Android Support,Jackson JSON parser, Google Play Services, Paypal, Glide, OkHttp, Facebook SDK, Fabric, Gson等等,Application表示App中自己編寫的代碼部分

各種類型文件的大小以及排行

各種知名SDK占所有dex中方法數(shù)的比例

各種知名SDK的方法數(shù)排行榜

看完這個apk內(nèi)剖圖是不是有一種神清氣爽的感覺!我把這個分析工具比做我們家買的智能體重秤,可以稱體重,脂肪含量,骨重,骨密度,肌肉含量等等,那么,我們是不是發(fā)現(xiàn)了一些問題,進而把這些問題和我們之前靠經(jīng)驗和一拍腦袋的原因可以用邏輯聯(lián)系在一起。

那么,我們接下來可以通過分析數(shù)據(jù)整理出我們的優(yōu)化目標

  • 大文件排行榜里,有11張png文件的大小超過了100k,記住,這可是壓縮之后的?。?/li>
  • 大文件排行榜里,resources.arsc的大小接近2M,這也是一個優(yōu)化點;
  • 大文件排行榜里,classes.dex接近3M,classes.dex是代碼的載體,這塊的優(yōu)化需要細分,再去看看細分SDK的排行榜;
  • 組件占比環(huán)圖里,Android Support, Jackson JSON Parser和Google Play Services是三方庫的前三甲;
  • 文件類型排行榜里,png, dex 和arsc是前三甲;

3、梳理優(yōu)化目標

所以我們的目標是沒有蛀牙,不對,是下面的目標:

1. png圖片優(yōu)化;

2. resources.arsc文件的優(yōu)化;

3. 代碼優(yōu)化
3.1圖片優(yōu)化的嘗試

首先是***個目標,圖片的優(yōu)化,慢點,我們看看這些圖為什么這么大先,準確的說,為什么這些圖在apk(其實就是zip文件)里這么大,好了,上工具分析。

這次用了一些簡單的工具組合,系統(tǒng)自帶的cmd就好。

命令執(zhí)行的結果如下

恩,所有的png文件居然是STORE的方式存儲到apk里的,關于zip里的STORE和DEFLATE,詳見 )

通俗的說,當文件是STORED的方式存儲到zip,表示這個文件并沒有經(jīng)過壓縮,如果是Defl:N的方式,表示通過DEFLATED normal的方式壓縮存儲到zip。

這看起來有點不合理,png原封不動的放入zip,當然***產(chǎn)出的apk會比較大。那么,如何解決呢?筆者首先嘗使用android gradle plugin的方式,發(fā)現(xiàn)aaptOptions和packagingOptions都未能解決問題。在github上發(fā)現(xiàn)一個開源項目AndResGuard,試了集成到項目中,再看結果如下:

優(yōu)化前:

10536027字節(jié)

優(yōu)化后:

普通zip壓縮: 8786265字節(jié) (壓縮了將近17%)

采用7zip壓縮:8567150字節(jié) (壓縮了將近19%)

再看看這個工具做了什么,對比下開啟資源混淆前后

優(yōu)化前

優(yōu)化后

  1. 資源(png, xml, jpg等)名稱混淆,資源路徑名稱混淆以及名稱長度壓縮;
  2. 原來以STORED形式存儲到zip中的png文件被改成了DEFLATED(普通壓縮存儲)方式;
  3. 意外發(fā)現(xiàn)resources.arsc, META-INF/*.SF 以及 META-INF/*.MF變小了,而且是解壓之后的文件大小也變小了。

用apk反編譯神器jadx內(nèi)窺apk尋找真相

原來apk中資源(png, xml,以及properties文件)的相對路徑會存放到META-INF/*.SF 以及META-INF/*.MF中并為每個資源文件計算SHA1值并存儲在這兩個文件中,至于為啥這么做以及這兩個SHA1有啥區(qū)別和作用請參考網(wǎng)絡上關于這方面知識的文章,已超出本文的主題所以這里不再贅述。

對于resources.arsc文件

很容易看出來它是資源文件索引表,所以,看到這里大家應該明白這三個文件為啥會變小了吧。
3.2一次意外的發(fā)現(xiàn)

順著resources.arsc往下看,發(fā)現(xiàn)一個有趣的東西,

這又將成為一個優(yōu)化點,去除那些沒用的翻譯資源,引入一些第三方的SDK,往往這些SDK帶了很多翻譯資源在里面,比如android support庫,去掉后我們來看看效果。

假設我們只保留英文,當然只是個實驗,現(xiàn)實中看具體情況了,

采用7zip壓縮:8220738字節(jié) (壓縮了將近22%,再增加3個點)

當然,真實的項目里不可能這樣,但是蚊子肉也是肉?。?/p>

其實,我想說的是這提供了一種優(yōu)化思路,就是利用gradle的配置干掉無用的資源,同樣的可以用在so本地庫上,分辨率(gradle配置已deprecated)上。

gradle配置示例如下:

記得包在android{}中間哦。那么,有人要問了,abi里腫么沒有x86?據(jù)說intel提供了一個解決方案叫houdini,是一個運行在x86設備上的中間件,可以將arm轉碼為x86的指令,不過效率很低,有些運算型的,比如計算MD5和SHA1,甚至不如java,筆者曾經(jīng)做過測試對比,又是另外一個話題,此處不贅述,感興趣的讀者可以移步。

到此為止,我們已經(jīng)在朝***個目標邁進,不經(jīng)意間發(fā)現(xiàn)了***個目標和第二個目標之間的關系,所以利用資源混淆工具,達成了第二個目標。

利用7zip壓縮,我們對整個包進行了2個點的壓縮,這是一個超出預期的成果。
3.3圖片優(yōu)化的方法

關于***個目標,我們的路徑還沒有結束,拍腦袋想出來的路徑是壓縮png,非alpha圖轉成jpg,還有什么?所以去各種技術論壇逛了一圈,請教了各種技術大牛,梳理的路徑如下:

1. 手動lint檢查,手動刪除代碼中沒有引用到的資源,實際效果不等。

在Android Studio中打開“Analyze” 然后選擇"Inspect Code...",范圍選擇整個項目,然后點擊"OK"

配置如下圖

2. gradle腳本中開啟shrinkResources

腳本參考如下

shrinkResources配合minifyEnabled使用效果更佳,詳見shrinkResources用法以及注意

采用7zip壓縮:8115283字節(jié) (壓縮了將近23%,再增加1個點)

3. 使用圖片壓縮工具,壓縮png圖的大小,將非alpha的圖轉換成jpg形式,關于這點同事以及網(wǎng)絡上的大牛們已經(jīng)整理的很詳細了,我這里做簡單總結,欲知詳情,請見附錄的參考。

使用tinypng,我只想說咱們在公司做產(chǎn)品,此方案慎用,上傳任何未發(fā)布產(chǎn)品的內(nèi)容到外部網(wǎng)絡,都有可能引起數(shù)據(jù)泄漏,所以慎用此方案。下面說替代方案。
WASTED
pngquant
ImageAlpha
ImageOptim
以上工具太散,有沒有集成化的工具,答案是“有”,@心倫 童鞋開發(fā)的imagemin
@姐夫童鞋開發(fā)的MSImageResourcesHelper
png轉成jpg格式 具體效果不等。

4. ***大殺器,png轉成webp,關于webp,更多詳情請參考谷歌官方文檔以及安卓開發(fā)者在線參考

先上效果圖:

采用7zip壓縮:4926912字節(jié) (壓縮了將近53%,再增加30個點)

沒看錯吧,是30個點,目前apk的大小是原始apk大小的一半不到,而我做的,一行代碼木有改動,僅用了一些工具而已!

說人話,我木有吃減肥藥,木有絕食,體重卻輕了一半?。?!

但是,目前卻沒能用到項目中,因為有兩個坑

在三星的部分機型上,部分有alpha背景部分的圖會有一條很明顯的黑線,這里就不上圖了,這個問題目前通過白名單的方式不去做成webp的圖來處理;
在小米2刷成4.xx的手機上,未能正確識別xml文件中描述的webp圖片,導致界面起來后加載xml布局文件,文件加載webp失敗,報錯說resource file not found,導致app發(fā)生崩潰。跟蹤發(fā)現(xiàn)是小米機器代理了類Resource為MIUIResource,但是這個MIUIResource未能正確識別webp,所以導致加載資源文件失敗,初步判定,目前暫時沒有解決方案,所以只能忍痛放棄這個優(yōu)化方案。

關于***個目標,圖片資源的優(yōu)化,就寫到這里了。
3.4代碼優(yōu)化

第二個目標已達成,剩下第三個目標,代碼的優(yōu)化,梳理如下優(yōu)化路徑:

1. 開啟proguard的代碼優(yōu)化

將proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-project.txt'

改為proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'),'proguard-project.txt'

開啟代碼優(yōu)化后的注意點請參見附錄。

2. 去除無用的庫

如果apk支持的***版本是API14,而代碼中沒有用到高于api14的api就可以考慮拿掉整個android support庫。

3. 用更小的庫替代方案

如果只用到了谷歌統(tǒng)計,那么就不要把整個google play services都集成進來,只集成需要的部分。

4.定期清理廢棄的代碼

定期刪除無用的邏輯和過期的業(yè)務功能模塊,以及廢棄的A/B test代碼。

5.業(yè)務模塊采用插件化框架,代碼動態(tài)從云端拉取

插件化,這是另外一個課題了,這里不贅述。

apk瘦身記最終的成果

10536027字節(jié)壓縮到4926912字節(jié), 壓縮了將近53%
總結

  • 腳本中開啟資源混淆和資源壓縮
  • 用7zip代替zip
  • gradle腳本中開啟代碼混淆優(yōu)化和無用資源刪除
  • 用更小的圖,使用壓縮工具壓縮圖片大小
  • 去除無用的資源,語言,本地so庫,二方三方庫和分辨率
  • 用更小的庫
  • 嘗試將android support庫徹底踢出你的項目
  • 定期清理代碼
  • 嘗試用H5編寫界面,圖片云端獲取
  • 嘗試插件化業(yè)務模塊
  • 尋找到zip文件夾中所有用STORE形式存儲的文件(不限于raw目錄下),嘗試壓縮,以及替代方案加載這些資源
  • 嘗試webp的圖片加載方案,尋求突破

***,繼續(xù)學習和嘗試新的優(yōu)化方案

以此文獻給“唯瘦身與產(chǎn)品不可辜負”的技術們?。?!


當前題目:APK瘦身記,如何實現(xiàn)高達53%的壓縮效果
文章路徑:http://m.5511xx.com/article/dhdicod.html