1.App瘦身經驗總結

為什么apk越來越大?

1.項目不斷發展,功能越多,代碼量增加的同時,資源文件也在不斷的增多
2.app支持的主流dpi越來越多,如ldpi、mdpi、hdpi、xh xxh xxxh等等,間接導致資源增多
3.引入的第三方sdk或開源庫越來越多,增加了很多重復的資源或方法以及無效代碼
4.用于體驗要求高,圖片資源為保證清晰度會使用分辨率更高的圖片

apk瘦身的切入點

解壓一個沒有加固過的apk文件我們會看到下邊的內容,相信你對這些文件或目錄的含義都已經清楚,接下來我們將會從三個方面進行apk的瘦身操作:
1.Java代碼,對應classes.dex文件,我們要剔除無效代碼,減小dex文件大小
2.資源文件,對應res文件夾,assets目錄
3.減小lib中引入的so大小
解壓后的apk.png

開始瘦身

接下來我們將分別針對上邊的三個切入點進行apk瘦身

1.減小Java代碼的體積

有人認為這個方面的處理很雞肋,因為每一行代碼都對應相應的功能,這里能有多大的精簡空間,其實并非完全如此,隨著項目的不斷推進,編碼過程中會產生很多的冗余代碼,比如該刪掉的沒有刪掉,過多的重復性功能的工具類,無效的引用等,這還是其次,比較大的一個問題是,隨著你引入的開源庫不斷增多,無效代碼的出現幾乎是必然事件,過多的重復方法還會導致64k方法數的問題。接下來進入正題。

1.開啟minifyEnable

它的作用不僅僅是混淆代碼,還有壓縮優化的功能,他會遍歷所有代碼并找出沒有引用到的代碼,這些代碼不會生成在apk中;另外混淆的效果是使用簡短的字母替代原來的類名屬性名等,一定程度上也可以減小代碼體積

2.定期review重構代碼

對代碼的不斷優化是提升個人能力的有效手段,同時優化的結果也會間接的對apk進行精簡

3.慎重選擇你使用的開源庫

很多開源庫針對不同平臺提供了精簡版,目的就是移除在本平臺上不需要的代碼,例如fastJson,我們選擇精簡版就可以使開源代碼縮小一倍左右,另外針對沒有精簡版的開源庫,需要根據場景考慮是否使用源碼依賴,手動移除不必要的文件資源。

2.資源文件瘦身

1.優先采用WebP圖片

資源文件是apk中體積占用較大的一部分,尤其是圖片資源,所以我們首要以圖片的瘦身為主。首先要對圖片編碼格式有簡單了解。Android平臺支持的格式有:JPEG,PNG,GIF,BNP,WebP(4.0開始支持WebP),但是Android應用開發中,Bitmap所支持的只有三種JPEG,PNG,WebP,從Bitmap類的CompressFormat枚舉可以看出(詳見源碼)。

JPEG:有損壓縮,不支持透明通道和多幀動畫(RGB)
PNG:無損壓縮,支持透明通道(ARGB),PNG大小大于JPEG
WebP:支持有損和無損壓縮,支持透明通道和多幀動畫,4.0以上是開發首選,Google官方測試,WebP比PNG能減少45%大小,即便PNG經過壓縮,也能相比PNG減小28%

2.PNG格式圖片盡量使用NinePatch格式

.9圖具有體積小,拉伸不變形的特點,并且Android studio可以一鍵轉換,使用起來相當方便。

3.Lint查找無效資源

Lint可以檢查res目錄下的無效資源(無法檢查assets),然后將其刪除,但是有一點要注意,如果資源文件是通過反射機制調用的,Lint是無法知道的,所以使用lint檢查出的每一個資源都需要人工進行確認,防止發生異常刪除。

4.開啟shrinkResources功能

shrinkResources標識是否去除無用的resource文件,它需要配合minifyEnable使用,同樣存在反射機制引用的問題,這種情況會被誤刪

android {buildTypes {release {minifyEnable trueshrinkResources true}}
}
5.resConfigs剔除第三方庫或者SDK中的資源

第三方庫中包含的無效資源通常包含以下兩點:
1.dpi目錄,第三方庫通常會提供所有的dpi目錄以及對應的資源文件,因為它是針對大眾使用的,而我們未必都需要,這時候需要選擇性的移除。
2.很多第三方sdk是做了國際化,而我們可能用不到,此時也需要刪除國際化資源

defaultConfig {。。。resConfigs "zh"  //表示只使用中文resConfigs "xxhdpi" // 表示只是用xxhdpi目錄下的資源文件
}

libs目錄瘦身

so文件最終會被打包到libs目錄中,我們針對libs目錄的瘦身主要是去除不必要的平臺ABI的so文件,例如我們只保留v7a和x86平臺的so

defaultConfig {ndk {abiFilters "armeabi-v7a","x86"}
}

其他的一些優化

1.不涉及透明圖層的圖片可以轉換為jpg格式,比如歡迎頁的圖片
2.使用shape(Vector)替換圖片
3.刪除或者替換兼容包中無用的一些圖(v4.v7.v13)
4.刪除第三方aar庫中使用的大圖
5.把so文件放置在網上或者sd卡內

總結

目前我所了解的瘦身方法只有這些

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/252457.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/252457.shtml
英文地址,請注明出處:http://en.pswp.cn/news/252457.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

研究相機和IMU坐標系變換

剛開始錄制的數據時沒有考慮相機和IMU之間的坐標變換,但是后來發現跟蹤效果不好,去查驗imu數據時,發現,我采集保存的imu數據格式沒有和euroc數據集中的imu數據保存格式統一,所以需要研究的是在euroc用于數據采集的設備…

第五天:Swift拖動 item 重排 CollectionView

參考鏈接:https://www.jianshu.com/p/96f956f1479e 1 import UIKit2 3 enum VC: String {4 case ViewController5 case CollectionViewController6 7 func segueIdentifier() -> String {8 switch self {9 case .ViewController:10 …

MIT Kimera閱讀筆記

這兩天在調研SLAM的最新算法,找到了2019CVPR上的一篇文章,出自于MIT,因為要給其他同事講解,所以就把文章的重點內容在我個人理解的情況下翻譯了出來,有理解不到位的還請各位大佬多多批評指正。 最后附上了Delaunay Tri…

C#中的ForEach

public void ForEach(Action<T> action) 針對List<T>集合中的每個元素執行操作Action<T> action,Action<T>是只接受一個類型為T的傳入參數返回值為void的委托,對于泛型List<T>來說,Action<T>中的類型與List<T>中的類型是相同的.acti…

哈希映射

哈希來源問題&#xff1a;關于統計一個字符串集合中&#xff0c;求出現次數最多的字符串思路&#xff1a;建立一個哈希映射&#xff08;HashMap&#xff09;&#xff0c;其鍵為"字符串"&#xff0c;值為"字符串出現次數"&#xff0c;然后遍歷字符串集合&am…

1月28日云棲精選夜讀 | 終于等到你!阿里正式向 Apache Flink 貢獻 Blink 源碼

如同我們去年12月在 Flink Forward China 峰會所約&#xff0c;阿里巴巴內部 Flink 版本 Blink 將于 2019 年 1 月底正式開源。今天&#xff0c;我們終于等到了這一刻。 熱點熱議 終于等到你&#xff01;阿里正式向 Apache Flink 貢獻 Blink 源碼 作者&#xff1a;技術小能手 發…

ZOJ-3537

題目大意&#xff1a;給你一個n (n<300) 邊形&#xff0c;給出它所有的頂點坐標&#xff0c;讓你把它劃分成n-2個三角形的花費最小值&#xff0c;頂點 a 和 b 相連的花費為 abs(a.xb.x)*abs(a.yb.y)。 如果是凹多邊形輸出無解。 思路&#xff1a;先跑個凸包判斷是不是凸多邊…

你會等待還是離開(大理)---寫的一個推文

你會等待還是離開 -----出發和遇見大理 上關花鬧 下關風薰 蒼山雪寂 洱海月遲 但聞肆季弦雀起 才吹小雨又需晴 現實很調皮&#xff0c;很容易就讓人沒有力氣&#xff0c;就像變與不變&#xff0c;并不復雜&#xff0c;也不遙遠&#xff0c;一個寒假的距離&#xff0c;一句話的力…

sudo rosdep init ERROR: cannot download default sources list from: https://raw.githubusercontent.com

安裝上ros無法進行rosdep init.解決方法如下&#xff1a;https://zhuanlan.zhihu.com/p/77483614 因此&#xff0c;在/usr/lib/python2.7/dist-packages/rosdep2/sources_list.py中頂部直接插入兩行代碼取消SSL驗證 import ssl ssl._create_default_https_context ssl._crea…

YodaOS: 一個屬于 Node.js 社區的操作系統

開發四年只會寫業務代碼&#xff0c;分布式高并發都不會還做程序員&#xff1f; >>> 大家好&#xff0c;很開心在這里宣布 YodaOS開源了。他將承載 Rokid 4年以來對于人工智能和語音交互領域的沉淀&#xff0c;并選擇 Node.js 作為操作系統的一等開發公民&#xff0…

Android頂部粘至視圖具體解釋

不知從某某時間開始&#xff0c;這樣的效果開始在UI設計中流行起來了。讓我們先來看看效果&#xff1a;大家在支付寶、美團等非常多App中都有使用。要實現這個效果&#xff0c;我們能夠來分析下思路&#xff1a;我們肯定要用2個一樣的布局來顯示我們的粘至布局。一個是正常的、…

在實際項目開發中keil的調試方法

轉載2015-06-14 20:23:04 一.在keilc的調試狀態下&#xff0c;如何觀察各個片內外設的運行狀態&#xff1f;如何修改它們的設置&#xff1f;? 在調試狀態下&#xff0c;點擊Peripherals菜單下的不同外設選項命令&#xff0c;就會顯示或隱藏對應外設的觀察窗口。 在程序運行時&…

slam 常用數據集的幀率

1. kitti數據集的幀率約約為10fps,圖像分辨率為1241x376 2. Euroc數據集的幀率約為20fps,圖像分辨率為752x480 3.TUM數據集的幀率約為30fps, 圖像分辨率為640x360 zed相機獲取的HD圖像的分辨率為1280x720p,獲取的VGA圖像分辨率為672x376,mynt相機獲取的VGA圖像的分辨率為640x…

小李飛刀:用python刷題ing....

叨逼叨 默認每天都要刷兩道題。今天目標已完成。 第一題 26. 刪除排序數組中的重復項難度&#xff1a;簡單類型&#xff1a;數組 給定一個排序數組&#xff0c;你需要在原地刪除重復出現的元素&#xff0c;使得每個元素只出現一次&#xff0c;返回移除后數組的新長度。不要使用…

【Log4J】

學習mybatis中用到了Log4J 在此記錄下 引入 引入Maven配置 <!-- https://mvnrepository.com/artifact/log4j/log4j --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></de…

VI-ORB環境配置

參考博客:https://blog.csdn.net/qq_38589460/article/details/82559816 https://blog.csdn.net/Robot_Starscream/article/details/90245456 本機安裝的是opencv3.0 在Examples/ROS/ORB-VIO以及/VI-ORB/src/LearnVIORB-RT下的CMakeLists.txt都要進行修改 將find_package(O…

.NET Core 3.0中的數據庫驅動框架System.Data

雖然沒有得到很多關注&#xff0c;但System.Data對于.NET中任何關系型數據庫的訪問都至關重要。因為其前身是ActiveX Data Objects&#xff0c;所以它也被稱為ADO.NET。System.Data提供了一個通用框架&#xff0c;是構建.NET數據庫驅動程序的基礎。該框架提供了數據庫驅動可以遵…

linux vg lv pv

pv由物理卷或者分區組成 pv可以組成一個或者多個vg vg可以分成多個lv 方便擴展 pvs vgs lvs 可以查看當前存在的pv vg lv 我的centos硬盤20g 使用了一段時間 加了100g 這時候 我們可以使用擴展來擴展我們的分區大小 查看自己擁有多少個硬盤 ls /dev/sd* | grep -v [0-9] …

mynt product model: D1000-IR-120標定相機和IMU外參

1. 首先是安裝相應的mynt SDK. http://www.myntai.com/mynteye/depth小覓官網,在sdk下拉菜單中點擊MYNT EYE Depth SDK,然后選擇Linux Installation安裝安裝步驟說明一步步的安裝,安裝sample后,測試一下安裝是否成功.我的電腦上安裝了ROS,所以可以點擊上面第一幅圖中的ROS Ins…

吉林省第二條國際鐵路聯運大通道“長琿歐”啟動測試

29日&#xff0c;吉林省第二條國際鐵路聯運大通道“長琿歐”在俄羅斯啟動測試。吉林省商務廳供圖 29日&#xff0c;吉林省第二條國際鐵路聯運大通道“長琿歐”在俄羅斯啟動測試。吉林省商務廳供圖 中新網長春1月29日電 (郭佳)記者29日從吉林省商務廳獲悉&#xff0c;該省第二條…