Android APK體積優化(瘦身)

1、基礎知識:

1.1 apk結構

lib :存放so文件,對應不同的cpu架構
res :資源文件,layout、drawable等,經過aapt編譯
assets :資源文件,不經過aapt編譯
classes.dex :dx編譯后的java文件,可執行文件,可以直接在Android系統中運行
resources.arsc :二進制資源文件,經過aapt打包res目錄下的文件后生成的文件
META-INF :簽名信息相關文件
CERT.RSA :簽名文件,存放公鑰和加密算法描述
CERT.SF :摘要加密,存放加密文件,是使用私鑰對摘要明文加密后得到的密文信息,只有使用與私鑰配對的公鑰才能解密該文件
MANIFEST.MF :文件摘要,存放程序清單文件,包含包中所有文件的摘要明文
AndroidManifest.xml :清單文件,包含組件的聲明和配置
kotlin :編譯后的kotlin文件
在這里插入圖片描述

1.2 apk打包流程

精簡:資源文件、Java文件 > dex文件 > APK
在這里插入圖片描述

2、優化方案

2.1 常規操作

2.1.1 圖片體積壓縮

1)tinypng壓縮工具,在線壓縮、AS插件
2)Webp格式,png格式轉Webp格式,AS支持一件轉換

在這里插入圖片描述
3)圖片著色器
針對相同圖片不同顏色的處理,原本使用兩個icon切換,可以使用android:tint=""代替

<ImageViewandroid:layout_width="100dp"android:layout_height="100dp"android:src="@drawable/img_fallback"android:tint="@color/color_000000_FFFFFF"/>

2.1.2 開啟混淆

buildTypes {release {minifyEnabled trueproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}
}

注意:minifyEnabled true 默認啟用R8代碼縮減功能,慎用R8,會忽略視圖修改默認優化行為的所有ProGuard規則,如:-optimizations 和 -optimizationpasses

解決方案:開啟混淆,但不啟用R8

android.enableR8=false
android.enableR8.libraries=false

2.1.3 資源縮減

1)Lint檢測工具

  • 檢測無用的資源文件

AS Analyze -> Run Inspection by Name -> Unused resources

注意:這種方式不一定準確,如:有些圖片,SDK有引用,但是在本地代碼中檢測不出來引用的地方。
在這里插入圖片描述
在這里插入圖片描述
檢測結果:
在這里插入圖片描述

  • 檢測

2)資源文件縮減

假如一些資源文件不確實是否還在使用,或者不確定需求是否變更,不敢刪除,先留著。這情況可以使用shrinkResources來縮減資源。

buildTypes {release {minifyEnabled true // 開啟混淆shrinkResources true // 資源縮減proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}
}

注意:要配合minifyEnabled一起使用,原理:先代碼移除,然后引用的資源變成無用,才可以進一步縮減。

3)so文件縮減
一般集成第三方SDK時,會提供各種架構的so文件,可以做相應的剔除

  • 目前市面上手機cpu架構以arm架構為主,所以只保留arm的一種so文件即可,armeabi、armeabi-v7a的殼直接刪除
  • 如果需要模擬器調試,可以加上x86架構
android {defaultConfig {ndk {abiFilters 'armeabi-v7a'}}
}

4)移除未使用的備用資源

  • 多語言項目,配置支持的語言
defaultConfig {resConfigs("en", "zh", "zh-rCN")
}
  • 資源文件,限制使用的目錄
defaultConfig {resConfigs("xxhdpi", "xxxhdpi")
}

2.2 進階

2.2.1 resources資源混淆

資源混淆就是將原本冗長的資源路徑變短,如:res/drawable/abc 變成 r/d/a。開源工具AndResGuard

2.2.2 ReDex

dex文件是打包中的產物,redex是facebook開源的分包優化方案。

2.2.3 so動態加載

so文件按需加載,利用插件化的思想。
注意:風險大,要考慮周全,如:下載時機、網絡環境、加載失敗后的策略。

2.2.4 插件化

按需加載

2.3 高級

2.3.1 圖片網絡化

將圖片放到服務器,通過動態下載的方式減小apk體積。
弊端:首次加載圖片,依賴網絡環境
注意:如果比較在意流量、加載速度,需要權衡

2.3.2 原生 -> H5

如促銷活動,需要加載大量圖片,且原生不夠動態化,可以使用H5來實現

2.3.3 修改第三方庫,剔除不需要的代碼

對于引用的第三方庫,往往只是用到了其中某一兩項功能,對于多余的功能,可以考慮剔除。

注意:版本升級的時候,要注意

2.3.4 DebugItem

DebugItem里主要包含兩種信息:

  • 調試信息,函數的參數變量和所以的局部變量
  • 排查問題信息,所有的指令集行號和源文件行號的對應關系

注意:去除debug信息和行號信息,不是極致,不推薦

2.3.5 R Field內聯

可以解決R文件過多導致MultiDex 65535的問題,進一步對代碼瘦身,

參考:字節的shrink-r-plugin,滴滴的booster

2.3.6 減少ENUM使用

沒減少一個ENUM,大約可以減少1-1.4kb的大小

3、總結

任重道遠 …

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

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

相關文章

爬蟲:使用Selenium模擬人工操作及獲取網頁內容

專欄介紹 結合自身經驗和內部資料總結的Python教程,每天3-5章,最短1個月就能全方位的完成Python的學習并進行實戰開發,學完了定能成為大佬!加油吧!卷起來! 全部文章請訪問專欄:《Python全棧教程(0基礎)》 再推薦一下最近熱更的:《大廠測試高頻面試題詳解》 該專欄對…

graphab 教程 ——生成廊道

Graphab軟件包括圖譜創建、基于圖譜的連通性計算、分析與推廣、制圖四個模塊。Graphab軟件的圖譜創建基于柵格數據進行,包括斑塊識別和連接建立兩個步驟。Graphab 軟件可識別的柵格數據格式包括TIFF、ASCI和RST,柵格像元記錄數值用于識別斑塊類型,識別規則可以選擇四鄰域或八鄰…

2-redis單節點搭建安裝

1.系統要求 本次redis四種模式(單機(standalone)模式、主從(master-slave)模式、哨兵(sentinel)模式、集群(cluster)模式)的搭建,以CentOS服務器進行。 類型版本CentOS7.9Redis7.0.121.1.OS基礎配置 CentOS為了能夠正常安裝redis,需要對CentOS進行常規的一些基礎配置,主要…

【Zabbix安裝-5.5版本】

Zabbix安裝&#xff08;rpm包安裝&#xff09; Index of /zabbix/zabbix/5.5/rhel/8/x86_64/ | 清華大學開源軟件鏡像站 | Tsinghua Open Source Mirror rpm包鏈接&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/5.5/rhel/8/x86_64/zabbix-release-5.5-1.e…

Unity3d C#利用本地網頁快速打開螢石云監控視頻流(ezopen)實現云臺,聲音等控制,支持WebGL平臺,替代UMP播放(含源碼)

前言 之前我介紹了替代Universal?Media?PlayerUMP播放石云監控視頻流(ezopen)的功能&#xff0c;效果還是很明顯的&#xff0c;筆者的測試是差不多3-5秒就能打開監控畫面&#xff0c;不過稍微遺憾的是&#xff0c;之前的功能是iframe打開石云提供的播放網頁的形式&#xff0…

詳解攔截器和過濾器

目錄 代碼演示過濾器Demo攔截器Demo 過濾器自定義攔截器配置攔截器過濾器執行原理多個過濾器的執行順序 攔截器自定義攔截器注冊攔截器1&#xff09;注冊攔截器2&#xff09;配置攔截的路徑3&#xff09;配置不攔截的路徑 多個攔截器的執行順序 過濾器和攔截器的區別 代碼演示 …

HarmonyOS教育類APP項目實戰系列課結課考試答案(1-10講)80分就合格

王丹輝&#xff08;第一講&#xff09;&#xff1a;HarmonyOS教育類APP項目實戰開課及低代碼初體驗 結課考試 及格分80/ 滿分100 評價 判斷題 1. DevEco Studio不能同時支持HarmonyOS和OpenHarmony應用/服務開發 正確(True)錯誤(False) 回答正確 2. DevEco Studio…

C#基礎知識(一)

一、C#程序結構 《1》命名空間的聲明&#xff08;namespace declaration&#xff09; 《2》一個class 《3》class方法 《4》class屬性 《5》一個main方法 《6》語句&#xff08;statements&#xff09;&表達式&#xff08;Expressions&#xff09; 《7》注釋 注&#xff1a…

【設計模式】橋接模式

橋接&#xff08;Bridge&#xff09;是用于把抽象化與實現化解耦&#xff0c;使得二者可以獨立變化。這種類型的設計模式屬于結構型模式&#xff0c;它通過提供抽象化和實現化之間的橋接結構&#xff0c;來實現二者的解耦。 這種模式涉及到一個作為橋接的接口&#xff0c;使得…

C++ 網絡編程項目fastDFS分布式文件系統(二)-redis部分

目錄 1. 數據庫類型 1.1 基本概念 1.2 關系/非關系型數據庫搭配使用 2. Redis 2.1 基本知識點 2.2 redis常用命令 - String類型 - List類型 - Set類型 - SortedSet 類型 - Hash類型 Key 相關的命令 2.3 redis配置文件 2.4 redis數據持久化 3 hiredis的使用 1. 數據…

手搓vue3組件_0,打包配置

打包后引入項目是發現報錯: Cannot read properties of null (reading isCE) TypeError: Cannot read properties of null (reading isCE)這個是由于vue版本沖突問題, 這里我引入了自己打包的ui組件庫,但是ui組件庫中打包進入了自己的vue,那么在此時使用時,如果你引入的自己的組…

原生js發送ajax請求---ajax請求篇(一)

在原生js中我們使用的是XMLHttpRequest對象來發送ajax請求 主要步驟就是&#xff1a; 1.創建XMLHTTPRequest對象 2.使用open方法設置和服務器的交互信息 3.設置發送的數據&#xff0c;開始和服務器端交互 4.注冊事件 5.更新界面 &#xff08;1&#xff09; get方式 //步驟一…

使用python對圖像加噪聲

加上雨點噪聲 import cv2 import numpy as npdef get_noise(img, value10):#生成噪聲圖像>>> 輸入&#xff1a; img圖像value 大小控制雨滴的多少 >>> 返回圖像大小的模糊噪聲圖像noise np.random.uniform(0, 256, img.shape[0:2])# 控制噪聲水平&#xff…

誰能講清楚Spark之與MapReduce的對比

我們已經知道Spark是如何設計和實現數據處理流程的,這里我們 再深入思考一下,為什么Spark能夠替代MapReduce成為主流的大數據處理框架呢?對比MapReduce,Spark究竟有哪些優勢? 一 優勢 1 通用性: 基于函數式編程思想,MapReduce將數據類型抽象為,k,v格式,并將數據處理…

Spring Boot單元測試使用MockBean注解向Service注入Mock對象

1. 背景介紹 我們在測試時有一個Service&#xff0c;我們需要測試Service&#xff0c;但Service內部依賴ServiceA、ServiceB&#xff0c;此時我們希望Mock ServiceA&#xff0c;ServiceB 注入真實對象。 class Service {private ServiceA A;private ServiceB B;public int me…

OPENCV C++(十二)模板匹配

正常模板匹配函數 matchTemplate(img, templatee, resultMat, 0);//模板匹配 這里0代表的是方法&#xff0c;一般默認為0就ok img是輸入圖像 templatee是模板 resultmat是輸出 1、cv::TM_SQDIFF&#xff1a;該方法使用平方差進行匹配&#xff0c;因此最佳的匹配結果在結果為…

Excel(1):表頭或列頭凍結

1.需求 對于較大的excel&#xff0c;通常需要固定一部分內容&#xff0c;另一份內容為可翻動。 2.解決方式 在視圖中選擇凍結窗格&#xff0c;需要注意的是&#xff0c;選擇凍結窗格時&#xff0c;窗格的左上方的表格區域是固定不動的&#xff0c;只可以向下或者向右活動。

8.10論文閱讀

文章目錄 The multimodal MRI brain tumor segmentation based on AD-Net摘要本文方法損失函數 實驗結果 max-vit - unet:多軸注意力醫學圖像分割摘要本文方法實驗結果 The multimodal MRI brain tumor segmentation based on AD-Net 摘要 基于磁共振成像(MRI)的多模態膠質瘤…

Redis分布式鎖問題

1、業務單機情況下 問題&#xff1a;并發沒有加鎖導致線程安全問題。 解決方法&#xff1a;加鎖處理&#xff0c;如lock、synchronized 仍有問題&#xff1a;業務分布式情況下&#xff0c;代碼級別加鎖已經無效。需要借助第三方組件&#xff0c;如redis、zookeeper。 2、業務分…

云計算|OpenStack|使用VMware安裝華為云的R006版CNA和VRM---初步使用(二)

前言&#xff1a; 在前面一篇文章云計算|OpenStack|使用VMware安裝華為云的R006版CNA和VRM---初始安裝&#xff08;一&#xff09;_華為cna_晚風_END的博客-CSDN博客 介紹了基于VMware虛擬機里嵌套部署華為云的云計算&#xff0c;不過僅僅是做到了在VRM的web界面添加計算節點…