Android性能優化系列之APK終極瘦身策略

来源:https://www.cnblogs.com/rsq-Celtic/archive/2018/05/30/9109836.html
-Advertisement-
Play Games

第1條:使用一套資源 這是最基本的一條規則,但非常重要。 對於絕大對數APP來說,只需要取一套設計圖就足夠了。鑒於現在解析度的趨勢,建議取720p的資源,放到xhdpi目錄。 相對於多套資源,只使用720P的一套資源,在視覺上差別不大,很多大公司的產品也是如此,但卻能顯著的減少資源占用大小,順便也能 ...


第1條:使用一套資源

這是最基本的一條規則,但非常重要。

對於絕大對數APP來說,只需要取一套設計圖就足夠了。鑒於現在解析度的趨勢,建議取720p的資源,放到xhdpi目錄。

相對於多套資源,只使用720P的一套資源,在視覺上差別不大,很多大公司的產品也是如此,但卻能顯著的減少資源占用大小,順便也能減輕設計師的出圖工作量了。

註意,這裡不是說把不是xhdpi的目錄都刪除,而是強調保留一套設計資源就夠了。

第2條:開啟minifyEnabled混淆代碼

在gradle使用minifyEnabled進行Proguard混淆的配置,可大大減小APP大小:

android {    buildTypes {        release {            minifyEnabled true        }    }}

在proguard中,是否保留符號表對APP的大小是有顯著的影響的,可酌情不保留,但是建議儘量保留用於調試。詳細proguard的相關的配置和原理可自行查閱。

第3條:開啟shrinkResources去除無用資源

在gradle使用shrinkResources去除無用資源,效果非常好。

android {    buildTypes {        release {            shrinkResources true        }    }}

第4條:刪除無用的語言資源

大部分應用其實並不需要支持幾十種語言的國際化支持。還好強大的gradle支持語言的配置,比如國內應用只支持中文:

 

android {    defaultConfig {        resConfigs "zh"    }}

第5條:使用tinypng有損壓縮

android打包本身會對png進行無損壓縮,所以使用像tinypng這樣的有損壓縮是有必要的。 重點是Tinypng使用智能有損壓縮技術,以儘量少的失真換來圖片大小的銳減,效果非常好,強烈推薦。

Tinypng的官方網站:http://tinypng.com/

第6條:使用jpg格式

如果對於非透明的大圖,jpg將會比png的大小有顯著的優勢,雖然不是絕對的,但是通常會減小到一半都不止。在啟動頁,活動頁等之類的大圖展示區採用jpg將是非常明智的選擇。

第7條:使用webp格式

webp支持透明度,壓縮比比jpg更高但顯示效果卻不輸於jpg,官方評測quality參數等於75均衡最佳。

相對於jpg、png,webp作為一種新的圖片格式,限於android的支持情況暫時還沒用在手機端廣泛應用起來。從Android 4.0+開始原生支持,但是不支持包含透明度,直到Android 4.2.1+才支持顯示含透明度的webp,使用的時候要特別註意。

官方介紹:https://developers.google.com/speed/webp/docs/precompiled

第8條:縮小大圖

如果經過上述步驟之後,你的工程裡面還有一些大圖,考慮是否有必要維持這樣的大尺寸,是否能適當的縮小。

事實上,由於設計師出圖的原因,我們拿到的很多圖片完全可以適當的縮小而對視覺影響是極小的。

第9條:覆蓋第三庫里的大圖

有些第三庫里引用了一些大圖但是實際上並不會被我們用到,就可以考慮用1x1的透明圖片覆蓋。

你可能會有點不舒服,因為你的drawable下竟然包含了一些莫名其妙的名稱的1x1圖片…

第10條:刪除armable-v7包下的so

基本上armable的so也是相容armable-v7的,armable-v7a的庫會對圖形渲染方面有很大的改進,如果沒有這方面的要求,可以精簡。 這裡不排除有極少數設備會Crash,可能和不同的so有一定的關係,請大家務必測試周全後再發佈。

第11條:刪除x86包下的so

與第十條不同的是,x86包下的so在x86型號的手機是需要的,如果產品沒用這方面的要求也可以精簡。

建議實際工作的配置是只保留armable、armable-x86下的so文件,算是一個折中的方案。

第12條:使用微信資源壓縮打包工具

微信資源壓縮打包工具通過短資源名稱,採用7zip對APP進行極致壓縮實現減小APP的目標,效果非常的好,強烈推薦。

詳情參考:Android資源混淆工具使用說明

原理介紹:安裝包立減1M–微信Android資源混淆打包工具 建議開啟7zip,註意白名單的配置,否則會導致有些資源找不到,粗略配置如下,

<?xml version="1.0" encoding="UTF-8"?><resproguard>    <!--defaut property to set  -->    <issue id="property" >        <seventzip value= "true" />        <!--  ...  -->    </issue>    <issue id="whitelist" isactive="true">        <path value ="com.xxx.yyy.R.drawable.emoji_*" />        <path value ="com.xxx.yyy.... />    </issue>    <issue id ="compress" isactive="true">        <!--  ...  -->    </issue></resproguard>

第13條:使用provided編譯

對於一些庫是按照需要動態的載入,可能在某些版本並不需要,但是代碼又不方便去除否則會編譯不過。

使用provided可以保證代碼編譯通過,但是實際打包中並不引用此第三方庫,實現了控制APP大小的目標。

但是也同時就需要開發者自己判斷不引用這個第三方庫時就不要執行到相關的代碼,避免APP崩潰。

第14條:使用shape背景

特別是在扁平化盛行的當下,很多純色的漸變的圓角的圖片都可以用shape實現,代碼靈活可控,省去了大量的背景圖片。

第15條:使用著色方案

相信你的工程里也有很多selector文件,也有很多相似的圖片只是顏色不同,通過著色方案我們能大大減輕這樣的工作量,減少這樣的文件。

藉助於android support庫可實現一個全版本相容的著色方案,參考代碼:DrawableLess.java

第16條:線上化素材庫

如果你的APP支持素材庫(比如聊天表情庫)的話,考慮線上載入模式,因為往往素材庫都有不小的體積。

這一步需要開發者實現線上載入,一方面增加代碼的複雜度,一方面提高了APP的流量消耗,建議酌情選擇。

第17條:避免重覆庫

避免重覆庫看上去是理所當然的,但是秘密總是藏的很深,一定要當心你引用的第三方庫又引用了哪個第三方庫,這就很容易出現功能重覆的庫了,比如使用了兩個圖片載入庫:Glide和Picasso。

通過查看exploded-aar目錄和External Libraries或者反編譯生成的APK,儘量避免重覆庫的大小,減小APP大小。

第18條:使用更小的庫

同樣功能的庫在大小上是不同的,甚至會懸殊很大。

如果並無對某個庫特別需求而又對APP大小有嚴格要求的話,比較這些相同功能第三方庫的大小,選擇更小的庫會減小APP大小。

第19條:支持插件化

過去的一年,插件化技術雨後春筍一樣的都冒了出來,這些技術支持動態的載入代碼和動態的載入資源,把APP的一部分分離出來了,對於業務龐大的項目來說非常有用,極大的分解了APP大小。

因為插件化技術需要一定的技術保障和服務端系統支持,有一定的風險,如無必要(比如一些小型項目,也沒什麼擴展業務)就不需要了,建議酌情選擇。

第20條:精簡功能業務

這條完全取決於業務需求。

從統計數據分析砍掉一些沒用的功能是完全有可能的,甚至乾脆去掉一些花哨的功能出個輕聊版、極速版也不是不可以的。

------------------------------------------------------------------------------------------------------------

線上評估

針對很多朋友的反饋,有必要對條例的適用範圍、易用性和風險指數做個粗略的評估,彙總如下,方便大家執行。

指南條例適用範圍易用性風險指數備註
使用一套資源 非極高UI要求的APP  
開啟minifyEnabled 全部  
開啟shrinkResources 全部  
刪除無用的語言資源 非全球國際化應用  
使用tinypng有損壓縮 非極高UI要求的APP  
使用jpg格式 僅限非透明大圖    
使用webp格式 僅限4.0+,4.2+設備  
縮小大圖 限允許縮小的大圖  
覆蓋第三庫里的無用大圖 全部  
刪除armable-v7包下的so 限允許對極少數設備不相容  
刪除x86包下的so 限允許對x86設備不相容  
使用微信資源壓縮打包工具 全部 切記要配置白名單
使使用provided編譯 全部 容錯處理  
使用shape背景 全部  
使用著色方案 全部  
表情線上化 限含表情包的APP  
避免重覆庫 全部  
使用更小的庫 全部  
支持插件化 限擴展性要求高的APP  
精簡功能業務 限允許精簡的APP  

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 首先創建 聚集函數: 接著上一個 樣例: 在訂單明細表按 和`season ticket_code order_id`去除重覆並且拼接起來 最後查詢結果截圖: ...
  • 1、redis兩種存儲機制(持久化) Redis的存儲機制分為:Snapshot和AOF 都先將記憶體存儲在記憶體中。 (1)Snapshot當數據累計到一定的閾值,就會觸發dump將數據一次性寫入到數據文件RDB文件。批量數據存儲,寫入頻率低,效率也高。但是安全性小,redis宕機,沒有寫入的數據會造 ...
  • -- 登錄資料庫 mysql -uroot -pmysql; -- 不顯示密碼 mysql -uroot -p -- 退出資料庫quit/exit/ctrl + d -- sql語句最後需要有分號;結尾 -- 顯示資料庫版本 version select version(); -- 顯示時間 now ...
  • 利用over(),將統計信息計算出來,然後直接篩選結果集 1 declare @t table( 2 ProductID int, 3 ProductName varchar(20), 4 ProductType varchar(20), 5 Price int) 6 7 insert @t 8 s ...
  • 系統環境 伺服器系統:Windows Server2012 R2 MongoDB:v3.4.4 可以通過命令:mongo -version 查看版本信息 場景:備份資料庫smp_maint_2,還原到新建的資料庫smp_maint_2_restore中。 MongoDB資料庫備份 1、語法: mon ...
  • NSMutableAttributedString let testAttributes = [NSAttributedStringKey.foregroundColor: UIColor.blue, NSAttributedStringKey.backgroundColor: UIColor.ye ...
  • Swift代理的使用 協議規定了用來實現某一特定功能所必需的方法和屬性。 任意能夠滿足協議要求的類型被稱為遵循(conform)這個協議。 類,結構體或枚舉類型都可以遵循協議,並提供具體實現來完成協議定義的方法和功能。 1、申明代理 // 協議內容 @objc protocol TLSelectVi ...
  • SharedPreferences是Android平臺上一個輕量級的存儲類,用來保存應用的一些常用配置,比如Activity狀態,Activity暫停時,將此activity的狀態保存到SharedPereferences中;當Activity重載,系統回調方法onSaveInstanceState ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...