包體積優(yōu)化-實(shí)踐

最新公司業(yè)務(wù)線(xiàn)一個(gè)App嘗試切換到androidx后,與上期版本相比包大小突然從19.9增加了9M的地址,對(duì)照著官方推薦做了一些優(yōu)化,中間也碰到一些問(wèn)題,所幸最終將體積減了下來(lái)


image.png

webp 不穩(wěn)定?

注意:由于支持無(wú)損和透明的WebP圖像只能在Android 4.3和更高版本中使用,所以您的項(xiàng)目必須聲明一個(gè)minSdkVersion 18或更高版本,以使用Android Studio創(chuàng)建無(wú)損或透明的WebP圖像。

幸好我們這個(gè)app支持的比較新,低版本按例子可以用Xposed Hook,平均能減少76%左右,但發(fā)現(xiàn)不可思議一件不可思議的事,盡然有些突然比原圖大,目前沒(méi)看到什么合理解釋


image.png

嘗試了線(xiàn)上壓縮,效果還行


image.png

McImage

看了下源碼,順帶學(xué)習(xí)了下Android Gradle DSL及編譯過(guò)程,它的功能是在mergeResource 步驟中遍歷圖片(包括JAR包)壓縮然后與原圖比較,比原圖大就使用原圖,有了上面的Webp壓縮放大的情況,個(gè)人感覺(jué)或許會(huì)壓縮不完全,源碼很好讀,建議看看

resConfigs "hdpi", "xhdpi", "xxhdpi", "xxxhdpi" 不能用了

這句話(huà)的作用是去除不匹配的圖片資源,但是新版本該用splits打包,這個(gè)應(yīng)該只在googleplay生效,我自己根據(jù)McImage 改了下 不匹配 這幾個(gè)分辨率刪除

關(guān)于SO

這個(gè)是我們這次優(yōu)化的重頭戲,因?yàn)槲覀儾糠止δ苁褂昧薋lutter 包沒(méi)有引入androidx 前我們包大小20MB,通過(guò)常規(guī)治理,包括刪除無(wú)效資源,圖片壓縮,剔除語(yǔ)言包等減少4M左右,其中flutter生產(chǎn) so 占 6MB左右,4+6 =10M ,如果刨除這些大約能優(yōu)化10M~50%

開(kāi)始前我們將字節(jié) flutter 包體積優(yōu)化反復(fù)讀了好幾遍,最終實(shí)施的時(shí)候,和組員一討論,如果完全將flutter so 動(dòng)態(tài)下載會(huì)帶來(lái)一個(gè)風(fēng)險(xiǎn),一旦so下載失敗意味著所有Flutter 模塊無(wú)法使用,最終只是將flutter做成動(dòng)態(tài)更新 有時(shí)間補(bǔ)上

andResGuard ReDex

這里我嘗試了下andResGuad,如果僅僅混淆資源大約節(jié)省1M左右,使用sevenZip壓縮后,能恐怖的達(dá)到3.2MB

andResGuad 怎么直接與相關(guān)編譯task綁定

之前我也是對(duì)Gradle 不是怎么了解,直到看相關(guān)源碼,結(jié)合之前的一些練習(xí),是可以實(shí)現(xiàn)的,看了下Issue 發(fā)現(xiàn)已經(jīng)有人實(shí)現(xiàn)了,我改了下,把下面代碼貼到 app下的build.gradle

project.afterEvaluate {
    tasks.matching {
        (it.name.startsWith("assemble"))
    }.each { task ->
        def variant = task.name.replaceAll("assemble","")
        task.finalizedBy("resguard"+variant)
    }
}

白名單 所有使用getIdentifier訪(fǎng)問(wèn)的資源都需要加入白名單。
請(qǐng)使用Umeng_social_sdk的同學(xué)特別留意將資源加入白名單,否則會(huì)出現(xiàn)Crash??梢栽?a target="_blank">white_list.md查看更多sdk的白名單配置,也歡迎大家PR自己的白名單

另外 不支持androidx.constraintlayout.widget.Group #353

當(dāng)在使用7zip壓縮的APK時(shí),調(diào)用AssetManager#list(String path)返回結(jié)果的首個(gè)元素為空字符串. #162

IconFont

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容