這篇文章主要介紹“APK結構優化的方法有哪些”,在日常操作中,相信很多人在APK結構優化的方法有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”APK結構優化的方法有哪些”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
鄂倫春網站建設公司創新互聯,鄂倫春網站設計制作,有大型網站制作公司豐富經驗。已為鄂倫春1000多家提供企業網站建設服務。企業網站搭建\外貿網站建設要多少錢,請找那個售后服務好的鄂倫春做網站的公司定做!
知己知彼,方能百戰不殆。了解應用程序APK的結構對于我們來說很有幫助。APK文件由一個ZIP存檔組成,其中包含組成應用程序的所有文件。這些文件包括Java類文件,資源文件和包含編譯資源的文件。
APK包含以下目錄:
META-INF/
:包含CERT.SF
和 CERT.RSA
簽名文件以及MANIFEST.MF
清單文件。
assets/
:包含應用可以使用
AssetManager對象檢索的應用資源。
res/
:包含未編譯到的資源 resources.arsc
。
lib/
:包含特定于處理器軟件層的編譯代碼。該目錄包含了每種平臺的子目錄,像armeabi
,armeabi-v7a
, arm64-v8a
,x86
,x86_64
,和mips
。
resources.arsc
:包含已編譯的資源。該文件包含res/values/
文件夾所有配置中的XML內容。打包工具提取此XML內容,將其編譯為二進制格式,并將內容歸檔。此內容包括語言字符串和樣式,以及直接包含在resources.arsc
文件中的內容路徑 ,例如布局文件和圖像。
classes.dex
:包含以Dalvik / ART虛擬機可理解的DEX文件格式編譯的類。
AndroidManifest.xml
:包含核心Android清單文件。該文件列出應用程序的名稱,版本,訪問權限和引用的庫文件。該文件使用Android的二進制XML格式。
一般來講APK結構中比較大的部分一般是classes.dex、lib、res、assets
這些文件或者目錄。所以接下來將會針對這四種情況進行講解。
classes.dex 包含了所有 Java 代碼。當你編譯你的應用時,gradle 會將你的所有模塊里的 .class 文件轉換成 .dex 文件并將這些文件合成一個 classes.dex 文件。
單個的 classes.dex 文件可以容納大約 64K 方法。如果你達到了這個限制,你必須要在你的工程中啟用 multidexing。這將會創建另一個 classes1.dex 文件去存儲剩下的方法。所以 classes.dex 文件數目由你的方法數而定。
隨著業務的頻繁變更以及復雜度的增加,我們往往會使用第三方Libaray,有時候我們可能僅僅用到了很少一部分的功能,這個時候就需要慎重考慮完全引用。從我的開發經驗上來講,寧愿參照自己去實現,也不愿意多引入一個第三方庫。
一個枚舉可以為您的應用程序的classes.dex
文件添加大約1.0到1.4 KB的大小 。這些添加可以快速累積到復雜系統或共享庫。如果可能,請考慮使用@IntDef
注釋,這種類型轉換保留了枚舉的所有類型安全優勢。
下面這段來自 build.gradle 文件的代碼用于為發布構建啟用代碼壓縮:
android { buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } ... }
除了 minifyEnabled 屬性外,還有用于定義 ProGuard 規則的 proguardFiles 屬性:
getDefaultProguardFile('proguard-android.txt') 方法可從 Android SDK tools/proguard/ 文件夾獲取默認的 ProGuard 設置。
提示:要想做進一步的代碼壓縮,請嘗試使用位于同一位置的 proguard-android-optimize.txt 文件。它包括相同的 ProGuard 規則,但還包括其他在字節碼一級(方法內和方法間)執行分析的優化,以進一步減小 APK 大小和幫助提高其運行速度。
proguard-rules.pro 文件用于添加自定義 ProGuard 規則。默認情況下,該文件位于模塊根目錄(build.gradle 文件旁)。
題外話
兩者目錄下的文件在打包后會原封不動的保存在apk包中,不會被編譯成二進制。
res/raw
中的文件會被映射到R.java文件中,訪問的時候直接使用資源ID即R.raw.filename;assets文件夾下的文件不會被映射到R.java中,訪問的時候需要AssetManager類。
res/raw
不可以有目錄結構,而assets則可以有目錄結構,也就是assets目錄下可以再建立文件夾。
針對不同的情況,對于資源文件有不同的優化策略。一般來講,對于res/drawable-hdpi中的png資源可以進行壓縮。
使用TinyPng或者 Guetzli進行壓縮。Guetzli的使用可以參見我之前寫的博文 在Mac上使用Google圖片壓縮工具Guetzli
定位Android 3.2(API級別13)或更高級別時 ,您也可以使用 WebP文件格式來制作圖像,而不是使用PNG或JPEG文件。WebP格式提供有損壓縮(如JPEG)以及透明度(如PNG),但可以提供比JPEG或PNG更好的壓縮。
Android 4.0 (API level 14) 支持有損壓縮的WebP格式,Android 4.3 (API level 18) 開始支持無損透明WebP圖像。
您可以使用矢量圖形來創建與分辨率無關的圖標和其他可伸縮媒體。使用這些圖形可以大大減少您的APK足跡。矢量圖像在Android中表示為 VectorDrawable對象。通過一個 VectorDrawable對象,一個100字節的文件可以生成一個與屏幕尺寸一致的清晰圖像。
但是,系統渲染每個 VectorDrawable對象需要很長時間,而較大的圖像需要更長的時間才能顯示在屏幕上。因此,只有在顯示小圖像時才考慮使用這些矢量圖形。
有時候我們可能對一張圖片進行重復利用,比如一張圖片僅僅是整體顏色的變換可以使用setColorFilter
或者tint
。盡量減少使用幀動畫,那可是一堆圖片呀。
要啟用資源壓縮,請在 build.gradle 文件中將 shrinkResources 屬性設置為 true。
android { ... buildTypes { release { shrinkResources true minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } }
資源壓縮器目前不會移除 values/ 文件夾中定義的資源(例如字符串、尺寸、樣式和顏色)。這是因為 Android 資源打包工具 (AAPT) 不允許 Gradle 插件為資源指定預定義版本。
同時,我們也可以指定哪些資源可以保留下來。
例如,將下邊的代碼保存在 res/raw/keep.xml。構建不會將該文件打包到 APK 之中。
<?xml version="1.0" encoding="utf-8"?> <resources xmlns:tools="http://schemas.android.com/tools" tools:keep="@layout/l_used*_c,@layout/l_used_a,@layout/l_used_b*" tools:discard="@layout/unused2" />
resources
有以下屬性:
tools:keep 指出哪些資源會保留 tools:discard 指定哪些資源需要剔除 tools:shrinkMode 資源壓縮模式,有兩種取值strict和safe,默認為safe
safe
和strict
的優化策略:
safe可以簡單理解為安全模式,它會盡最大努力檢查代碼中可能會使用到的資源進行保留,避免運行時錯誤。
如果你的代碼調用 Resources.getIdentifier(),這就表示你的代碼將根據動態生成的字符串查詢資源名稱。當你執行這一調用時,默認情況下資源壓縮器會采取防御性行為,將所有具有匹配名稱格式的資源標記為可能已使用,無法移除。
String name = String.format("img_%1d", angle + 1); res = getResources().getIdentifier(name, "drawable", getPackageName());
img_ 前綴的資源標記為已使用。
在strict模式下,img_前綴的資源會做未使用的處理,因此你需要使用tools:keep
手動進行已使用標識。
我們知道google給我們的apk提供了國際化支持,如適應不同的屏幕分辨率的drawable資源,還有適應不同語言的字符串資源等等,但是在很多情況下我們只需要一些指定分辨率和語言的資源就可以了,這個時候我們可以使用resConfigs方法來配置。
defaultConfig { // 對于國際化支持只打包中文資源, resConfigs "zh-rCN" }
這里我們主要講一下lib中動態鏈接庫的優化策略,也就是SO文件。如果你有NDK的開發經驗可能會更容易理解一些。
為了支持不同指令集的情況,應用可能會包含armeabi、armeabi-v7a、x86的SO文件等。
目前主流的機型都是支持armeabi-v7a的,并且armeabi-v7a兼容armeabi。所以在一般的開發中我們只需要使用armeabi-v7a 進行ABI支持。
有些SO庫可以采用網絡下載,把負擔放到用戶安裝完應用之后。對于哪些SO文件可以放到網絡中加載,還需要看具體業務情況。
題外話,如果運行時找不到SO的話,會導致應用崩潰。
java.lang.UnsatisfiedLinkError: Couldn't load stlport_shared from loader dalvik.system.PathClassLoader: findLibrary returned null at java.lang.Runtime.loadLibrary(Runtime.java:365) at java.lang.System.loadLibrary(System.java:535) at com.your.app.NativeClass.<clinit>(Native.java:16) ... 63 more Caused by: java.lang.UnsatisfiedLinkError: Library stlport_shared not found at java.lang.Runtime.loadLibrary(Runtime.java:461) at java.lang.System.loadLibrary(System.java:557) at com.your.app.NativeClass.<clinit>(Native.java:16) ... 5 more
到此,關于“APK結構優化的方法有哪些”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注創新互聯網站,小編會繼續努力為大家帶來更多實用的文章!
當前文章:APK結構優化的方法有哪些
網頁地址:http://www.2m8n56k.cn/article42/poochc.html
成都網站建設公司_創新互聯,為您提供用戶體驗、網站營銷、App設計、全網營銷推廣、手機網站建設、Google
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:[email protected]。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯