最新公司業(yè)務(wù)線一個(gè)App嘗試切換到androidx后摩窃,與上期版本相比包大小突然從19.9增加了9M的地址,對(duì)照著官方推薦做了一些優(yōu)化芬骄,中間也碰到一些問題偶芍,所幸最終將體積減了下來(lái)
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)不可思議一件不可思議的事琴儿,盡然有些突然比原圖大段化,目前沒看到什么合理解釋
嘗試了線上壓縮,效果還行
McImage
看了下源碼造成,順帶學(xué)習(xí)了下Android Gradle DSL及編譯過程显熏,它的功能是在mergeResource 步驟中遍歷圖片(包括JAR包)壓縮然后與原圖比較,比原圖大就使用原圖晒屎,有了上面的Webp壓縮放大的情況喘蟆,個(gè)人感覺或許會(huì)壓縮不完全,源碼很好讀鼓鲁,建議看看
resConfigs "hdpi", "xhdpi", "xxhdpi", "xxxhdpi" 不能用了
這句話的作用是去除不匹配的圖片資源蕴轨,但是新版本該用splits打包,這個(gè)應(yīng)該只在googleplay生效骇吭,我自己根據(jù)McImage 改了下 不匹配 這幾個(gè)分辨率刪除
關(guān)于SO
這個(gè)是我們這次優(yōu)化的重頭戲橙弱,因?yàn)槲覀儾糠止δ苁褂昧薋lutter 包沒有引入androidx 前我們包大小20MB,通過常規(guī)治理,包括刪除無(wú)效資源棘脐,圖片壓縮斜筐,剔除語(yǔ)言包等減少4M左右,其中flutter生產(chǎn) so 占 6MB左右蛀缝,4+6 =10M 顷链,如果刨除這些大約能優(yōu)化10M~50%
開始前我們將字節(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
訪問的資源都需要加入白名單旗扑。
請(qǐng)使用Umeng_social_sdk的同學(xué)特別留意將資源加入白名單蹦骑,否則會(huì)出現(xiàn)Crash⊥畏溃可以在white_list.md查看更多sdk的白名單配置眠菇,也歡迎大家PR自己的白名單
另外 不支持
androidx.constraintlayout.widget.Group
#353
當(dāng)在使用7zip壓縮的APK時(shí),調(diào)用
AssetManager#list(String path)
返回結(jié)果的首個(gè)元素為空字符串. #162