58同城廠商內(nèi)置包大小減少實戰(zhàn)

本文介紹了幾種減少包大小的技術(shù)方案响迂,希望能夠幫到你考抄。

《虞美人·春花秋月何時了》
春花秋月何時了?往事知多少蔗彤。
小樓昨夜又東風(fēng)川梅,故國不堪回首月明中。
雕欄玉砌應(yīng)猶在然遏,只是朱顏改贫途。
問君能有幾多愁?恰似一江春水向東流待侵。
-五代潮饱,李煜

前言

何為廠商內(nèi)置包?廠商內(nèi)置包是公司和廠商之間的一種商務(wù)合作诫给,可以將應(yīng)用內(nèi)置到出廠的手機上香拉,可以帶來新增用戶和提升日活啦扬。

58同城每年都會基于線上最新版本按照廠商的要求做出廠商內(nèi)置包,畢竟會占用用戶的存儲空間凫碌,所以廠商對于包大小有著嚴(yán)格的要求扑毡,隨著時間的推進和應(yīng)用版本不斷的迭代更新,應(yīng)用大小變得越來越大盛险,滿足廠商包大小的要求也越來越困難瞄摊。

備注:應(yīng)用通常會預(yù)裝到較高系統(tǒng)版本的手機上,例如android 9.0及以上版本苦掘,所以我們只需要考慮android 9.0及以上版本的兼容性即可换帜。

Apk文件結(jié)構(gòu)及大小占比

簡單介紹下Apk文件結(jié)構(gòu):

  • AndroidManifest.xml :用于聲明應(yīng)用包名信息、相關(guān)的使用權(quán)限鹤啡、四大組件惯驼、android sdk版本等
  • res目錄:包含程序主要資源文件,包括res/layout递瑰、res/drawable等祟牲,主要是布局文件和圖片等資源。
  • resources.arsc:資源映射表抖部,包含一部分編譯資源(res/value)和資源路徑, 可以通過資源R.java中的ID映射到對應(yīng)的資源文件或者值
  • assets目錄:包含不被壓縮的原始文件说贝,主要是一些多媒體文件,或者附加文件
  • lib目錄:使用到的各種.so鏈接庫
  • classes.dex:打包好的程序代碼慎颗,如果是復(fù)雜的應(yīng)用會進行分包乡恕,包含多個dex文件
  • META-INF目錄:主要包含APK的簽名信息
  • MANIFEST.MF:清單文件,當(dāng)前APK中所有文件清單及其對應(yīng)hash值
  • CERT.SF:上述清單文件中的每條信息的hash值
  • CERT.RSA:對CERT.SF文件的數(shù)字簽名以及簽名時所用的數(shù)字證書

從上圖可以清晰地看到Apk內(nèi)容大小占比俯萎,主要是圖片資源和lib庫so文件比較大傲宜,其次是resources.arsc文件,該文件中存放了R.java文件中的id值和資源文件名及資源文件路徑之間的映射讯屈,其中string和dimen及color等存放的是相應(yīng)值。

保留指定資源

先來看一下如何配置县习,在gradle文件中配置我們需要保留的資源涮母。

android {
    defaultConfig {
        ...
        resConfigs "zh-rCN", "xxhdpi", "ldltr", "desk"
    }
}

接下來對上述配置進行一一說明,使用Android Studio可以查看resources.arsc文件中的內(nèi)容躁愿,從下圖可以看到應(yīng)用依賴的support庫中資源竟然包含88種語言配置叛本,顯然我們只需要中文資源即可。

通過添加zh-rCN配置用于只保留中文資源彤钟,添加上這個配置后竟然減少了1M的大小来候。下圖是應(yīng)用配置后的結(jié)果:

添加xxhdpi配置用于只保留一套圖片資源,例如如果有xhdpi和xxhdpi的兩套圖片逸雹,會只保留xxhdpi的圖片营搅,如果有hdpi和xhdpi兩套圖片云挟,會只保留xhdpi的圖片。

如果應(yīng)用沒有適配RTL(從右到左)布局转质,可以在清單文件添加以下屬性禁止RTL布局方式:

<application
  ...
  android:supportsRtl="false" />

如果應(yīng)用使用了react native园欣,可以添加下面的代碼禁用RTL布局:

//禁止RN頁面RTL
I18nUtil sharedI18nUtilInstance = I18nUtil.getInstance();
sharedI18nUtilInstance.allowRTL(mApplication, false);

相應(yīng)的RTL的資源也可以通過添加ldltr配置移除。

如果應(yīng)用沒有適配watch手表休蟹,可以通過添加desk配置將watch相關(guān)資源移除沸枯。

圖片轉(zhuǎn)為WebP

Android從4.3開始對于WebP的decode、encode是完全支持的赂弓,包括半透明的WebP圖片绑榴。所以可以使用Android Studio自帶的工具將工程內(nèi)的圖片轉(zhuǎn)換為WebP,壓縮比可以采用75%盈魁。

工程內(nèi)的圖片可以手動轉(zhuǎn)換翔怎,對于依賴的第三庫中圖片怎么辦?

可以使用開源庫https://github.com/smallSohoSolo/McImage备埃,McImage可以在打包過程中對圖片進行壓縮姓惑,也可以將圖片轉(zhuǎn)換為WebP格式。

自動化清理無用資源

通過lint可以檢測出工程無用資源的結(jié)果按脚,使用python腳本可以自動化清理無用資源于毙。傳送門:https://github.com/yuweiguocn/android-resource-remover

使用lint檢查無用資源

通常我們可以使用lint檢查工程內(nèi)無用資源,但執(zhí)行l(wèi)int命令發(fā)現(xiàn)只檢查了主Module的無用資源辅搬,并沒有檢查子Module的無用資源唯沮。

針對這個問題可以使用下面的配置,對應(yīng)用的依賴也執(zhí)行檢查:

lintOptions {
    checkReleaseBuilds false
    abortOnError false
    checkDependencies true //對依賴的資源也執(zhí)行檢查堪遂,注意也會對引用aar檢查介蛉,如果是子module打開源碼依賴即可
    check "UnusedResources" //只檢查無用資源,提升執(zhí)行速度
}

然后執(zhí)行l(wèi)int命令進行檢查無用資源:

./gradlew lint

然后我們可以在build下的reports目錄下找到lint的結(jié)果溶褪。

配置

首先將本工程clone到你的項目工程的根目錄中币旧,然后根據(jù)你項目使用反射獲取的資源在resouceCleanConfig.json文件中進行配置:

{
    "projects": [
        "/app/",
        "/push/"
    ],
    "pathIncludes": [
        ".jpg",
        ".png",
        ".xml"
    ],
    "pathExcludes": [
        "------common-config-start--------",
        "/layout/"
    ]
}
  • projects:表示要清理無用資源的路徑需要包含的子Module工程名稱,因為依賴檢查也會對引用的所有aar進行檢查猿妈,所以我們需要指定打開源碼的子Module的名稱吹菱。
  • pathIncludes:表示要清理的無用資源的路徑需要匹配的規(guī)則。
  • pathExcludes:表示要清理的無用資源的路徑不能包含的字符串彭则,也就是白名單鳍刷。

以上三個條件為并列條件,只有同時滿足才會被清理俯抖。上述json配置的文件表示清理app和push Module下文件后綴為.jpg或.png或xml的資源输瓜,但不刪除布局文件。

白名單

目前發(fā)現(xiàn)工程使用代碼獲取資源的方法有以下兩種,代碼中使用下列方法獲取的圖片名稱需要添加配置文件白名單中尤揣。

//第一種
item.resId = mContext.getResources().getIdentifier(name, "drawable", mContext.getPackageName());
//第二種
public static Integer getResourceDrawableId(String resource) {
    if(TextUtils.isEmpty(resource)){
        return -1;
    }
    try {
        String name = resource.trim();
        Field field = R.drawable.class.getField(name);
        return field.getInt(null);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return -1;
}

建議對新增的資源在使用代碼獲取時對名稱添加統(tǒng)一前綴reflect_搔啊。

自動化

此步驟請謹(jǐn)慎操作,刪除的資源無法恢復(fù)芹缔,使用前請?zhí)砑影姹究刂啤?/p>

配置好后執(zhí)行如下命令自動清理無用資源:

python android_clean_app.py --xml ../app/build/reports/lint-results.xml

參數(shù)--xml指定為你的lint結(jié)果文件的路徑坯癣。

解決打包失敗問題

lint的檢測結(jié)果包含無用代碼對資源的引用,如果只是將無用資源刪除后可能會引起打包失敗最欠。
針對這個問題我們會自動添加一個unused_ids.xml文件保存刪除的資源id示罗,這不僅可以保證不會由于刪除無用資源引起的打包失敗,也對自動清理的無用資源進行了記錄芝硬。


運行結(jié)果

資源混淆

除上述方案你也可以使用騰訊開源的資源混淆蚜点,資源混淆會對資源路徑及名稱進行混淆,可以減少resources.arsc文件大小拌阴,通過7zip壓縮及移除重復(fù)資源減少APK大小绍绘。

采用資源混淆需要對工程內(nèi)使用反射獲取的資源添加白名單,如果是較小的工程修改和測試成本相對較低迟赃,如果是多業(yè)務(wù)線多Module的工程修改和測試成本相對較高陪拘,這時可以通過修改資源混淆的源碼,保留資源名稱纤壁,只對資源路徑進行混淆左刽,確保在減少包大小的同時不會對業(yè)務(wù)功能產(chǎn)生影響。

總結(jié)

58同城廠商內(nèi)置包使用了上述的減少包大小的方案酌媒,配合移除so文件較大的依賴庫功能欠痴,最終滿足了廠商對包大小的要求。

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末秒咨,一起剝皮案震驚了整個濱河市喇辽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌雨席,老刑警劉巖菩咨,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異陡厘,居然都是意外死亡抽米,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門雏亚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缨硝,“玉大人摩钙,你說我怎么就攤上這事罢低。” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵网持,是天一觀的道長宜岛。 經(jīng)常有香客問我,道長功舀,這世上最難降的妖魔是什么萍倡? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮辟汰,結(jié)果婚禮上列敲,老公的妹妹穿的比我還像新娘。我一直安慰自己帖汞,他們只是感情好戴而,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著翩蘸,像睡著了一般所意。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上催首,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天扶踊,我揣著相機與錄音,去河邊找鬼郎任。 笑死秧耗,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的涝滴。 我是一名探鬼主播绣版,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼歼疮!你這毒婦竟也來了杂抽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤韩脏,失蹤者是張志新(化名)和其女友劉穎缩麸,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赡矢,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡杭朱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了吹散。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弧械。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖空民,靈堂內(nèi)的尸體忽然破棺而出刃唐,到底是詐尸還是另有隱情羞迷,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布画饥,位于F島的核電站衔瓮,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏抖甘。R本人自食惡果不足惜热鞍,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望衔彻。 院中可真熱鬧薇宠,春花似錦、人聲如沸艰额。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽悴晰。三九已至慢睡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間铡溪,已是汗流浹背漂辐。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留棕硫,地道東北人髓涯。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像哈扮,于是被迫代替她去往敵國和親纬纪。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容