成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

微信Android資源混淆打包工具,如何讓?xiě)?yīng)用安裝包立減1M

Honwhy / 678人閱讀

摘要:騰訊特約作者微信客戶端高級(jí)工程師微信中的資源混淆工具主要為了混淆資源長(zhǎng)度例如將混淆為,同時(shí)利用深度壓縮,大大減少了安裝包體積,同時(shí)也增加了逼格,提升了反破解難度。寫(xiě)在前言資源混淆工具大約是在年月實(shí)現(xiàn),并在微信中使用,減少了大約的空間。

騰訊Bugly特約作者: 微信客戶端高級(jí)工程師 shwen

微信中的資源混淆工具主要為了混淆資源ID長(zhǎng)度(例如將res/drawable/welcome.png混淆為r/s/a.png),同時(shí)利用7z深度壓縮,大大減少了安裝包體積,同時(shí)也增加了逼格,提升了反破解難度。本文主要是對(duì)此做一個(gè)簡(jiǎn)單分析。

寫(xiě)在前言

資源混淆工具大約是在2014年4月實(shí)現(xiàn),并在微信5.4中使用,減少了大約1M的空間。然后在8月在公司內(nèi)部開(kāi)源,現(xiàn)以推廣到QQ郵箱、QQ空間、手機(jī)管家等多個(gè)產(chǎn)品中使用。

具體源碼與使用方法詳細(xì)在github中:

https://github.com/shwenzhang/AndResGuard

方案演進(jìn)

資源混淆簡(jiǎn)單來(lái)說(shuō)希望實(shí)現(xiàn)將res/drawable/icon,png變成res/drawable/a.png,或我們甚至可以將文件路徑也同時(shí)混淆,改成r/s/a.png。

Proguard  -> Resource Proguard
R.string.name -> R.string.a   
res/drawable/icon -> res/drawable/a
 r/s/a

我們可以想到以下幾種方案:

最簡(jiǎn)單的方法,我們按照Proguard的做法,直接在源碼級(jí)別修改,將代碼以及xml的R.string.name中替換到R.string.a,icon.png重命名為a.png 然后再交給Android編譯。

根據(jù)Android的編譯流程,所有資源ID已經(jīng)被編譯成32位int值。這說(shuō)明我們并不需要去修改xml與java,因?yàn)樵诰幾g過(guò)程已經(jīng)被R.java所替換,我們直接修改resources.arsc的二進(jìn)制數(shù)據(jù),不改變打包流程,只要在生成resources.arsc之后修改它,同時(shí)重命名資源文件。

但是方案二看起來(lái)不錯(cuò),但是它依然依賴了編譯流程,不利于使用。其實(shí)我們可以做到直接處理安裝包. 不依賴源碼,不依賴編譯過(guò)程,僅僅輸入一個(gè)安裝包,得到一個(gè)混淆包。

幾種方案的對(duì)比如下:

毫無(wú)疑問(wèn),微信采用的是方案三。現(xiàn)在關(guān)鍵問(wèn)題是我們?nèi)绾沃苯有薷膔esources.arsc文件來(lái)達(dá)到資源混淆的效果?

技術(shù)實(shí)現(xiàn)

在回答上面的問(wèn)題之前,我們首先需要對(duì)resources.arsc的文件格式有一定的了解。resources.arsc一共有五種chunk類型,分別為T(mén)YPETABLE,TYPEPACKAGE,TYPE_STRING ,TYPETYPE,TYPECONFIG。

—table,是整個(gè)reousces table的開(kāi)始,它的chunksize即是整個(gè)文件的大小。

—package,指的是一個(gè)package的開(kāi)始,其實(shí)在resources,arsc是可以有多個(gè)package的。而packageID即是資源resID的最高八位,一般來(lái)說(shuō)系統(tǒng)android的是1(0x01),普通的例如com.tencent.mm會(huì)是127(0x7f),剩下的是從2開(kāi)始起步。當(dāng)然這個(gè)我們?cè)赼apt也是可以指定的(1-127即八位的合法空間,一些混合編譯就是改這個(gè)packageID)。

—string, 代表stringblock,我們一共有三種類型的stringblock。分別是table stringblock,typename stringblock, specsname stringblock。

—type,這里講的是typename stringblock里面我們用到的各種type(用到多少種類型的type,就有多少個(gè)type chunk),例如attr, drawable, layout, id, color, anim等,Type ID是緊跟著Package ID。

—config, 即是Android用來(lái)描述資源維度,例如橫豎屏,屏幕密度,語(yǔ)言等。對(duì)于每一種type,它定義了多少種config,它后面就緊跟著多少個(gè)config chunk,例如我們定義了drawable-mdpi,drawable-hdpi,那后面就會(huì)有兩個(gè)config。

—entry,盡管沒(méi)有entry這個(gè)chunk,但是每個(gè)config里面都會(huì)有很多的entry,例如drawable-mdpi中有icon1.png,icon2.png兩個(gè)drawable,那在mdpi這個(gè)config中就存在兩個(gè)entry。

簡(jiǎn)單來(lái)說(shuō)方案為:

與7z極限壓縮結(jié)合

根據(jù)上文安裝包知識(shí)的文章,7z有著更好的壓縮率,同時(shí)我們也可以強(qiáng)制壓縮類似resources.arsc、png、jpg等Android默認(rèn)不會(huì)打包壓縮的文件。

最后把修改后的resources.arsc重打包即可,微信從解壓,到混淆,到重打包耗費(fèi)時(shí)間,不要799,也不要699,僅需35秒。具體效果如下圖:

最后,整體的處理流程如下:

一些需要注意的問(wèn)題

compress參數(shù)對(duì)混淆效果的影響若指定compess 參數(shù).png、.gif以及*.jpg,resources.arsc會(huì)大大減少安裝包體積。若要支持2.2,resources.arsc需保證壓縮前小于1M。

操作系統(tǒng)對(duì)7z的影響實(shí)驗(yàn)證明,linux與mac的7z效果更好

keepmapping方式對(duì)增量包大小的影響 影響并不大,但使用keepmapping方式有利于保持所有版本混淆的一致性

渠道包的問(wèn)題(建議通過(guò)修改zip摘要的方式生產(chǎn)渠道包) 在出渠道包的時(shí)候,解壓重壓縮會(huì)破壞7zip的效果,通過(guò)repackage命令可用7zip重壓縮。

若想通過(guò)getIdentifier方式獲得資源,需要放置白名單中。 部分手機(jī)桌面快捷圖標(biāo)的實(shí)現(xiàn)有問(wèn)題,務(wù)必將程序桌面icon加入白名單

TODO,除了資源混淆,其實(shí)我們還可以實(shí)現(xiàn)資源加密等其他功能。

騰訊Bugly簡(jiǎn)介

Bugly是騰訊內(nèi)部產(chǎn)品質(zhì)量監(jiān)控平臺(tái)的外發(fā)版本,其主要功能是App發(fā)布以后,對(duì)用戶側(cè)發(fā)生的Crash以及卡頓現(xiàn)象進(jìn)行監(jiān)控并上報(bào),讓開(kāi)發(fā)同學(xué)可以第一時(shí)間了解到App的質(zhì)量情況,及時(shí)機(jī)型修改。目前騰訊內(nèi)部所有的產(chǎn)品,均在使用其進(jìn)行線上產(chǎn)品的崩潰監(jiān)控。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/64734.html

相關(guān)文章

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<