騰訊Bugly特約做者: 微信客戶端高級工程師 shwenjava
微信中的資源混淆工具主要爲了混淆資源ID長度(例如將res/drawable/welcome.png混淆爲r/s/a.png),同時利用7z深度壓縮,大大減小了安裝包體積,同時也增長了逼格,提高了反破解難度。本文主要是對此作一個簡單分析。linux
資源混淆工具大約是在2014年4月實現,並在微信5.4中使用,減小了大約1M的空間。而後在8月在公司內部開源,現以推廣到QQ郵箱、QQ空間、手機管家等多個產品中使用。android
具體源碼與使用方法詳細在github中:git
https://github.com/shwenzhang/AndResGuardgithub
資源混淆簡單來講但願實現將res/drawable/icon,png變成res/drawable/a.png,或咱們甚至能夠將文件路徑也同時混淆,改爲r/s/a.png。微信
Proguard -> Resource Proguard R.string.name -> R.string.a res/drawable/icon -> res/drawable/a r/s/a
咱們能夠想到如下幾種方案:app
最簡單的方法,咱們按照Proguard的作法,直接在源碼級別修改,將代碼以及xml的R.string.name中替換到R.string.a,icon.png重命名爲a.png 而後再交給Android編譯。工具
根據Android的編譯流程,全部資源ID已經被編譯成32位int值。這說明咱們並不須要去修改xml與java,由於在編譯過程已經被R.java所替換,咱們直接修改resources.arsc的二進制數據,不改變打包流程,只要在生成resources.arsc以後修改它,同時重命名資源文件。加密
可是方案二看起來不錯,可是它依然依賴了編譯流程,不利於使用。其實咱們能夠作到直接處理安裝包. 不依賴源碼,不依賴編譯過程,僅僅輸入一個安裝包,獲得一個混淆包。spa
幾種方案的對好比下:
毫無疑問,微信採用的是方案三。如今關鍵問題是咱們如何直接修改resources.arsc文件來達到資源混淆的效果?
在回答上面的問題以前,咱們首先須要對resources.arsc的文件格式有必定的瞭解。resources.arsc一共有五種chunk類型,分別爲TYPETABLE,TYPEPACKAGE,TYPE_STRING ,TYPETYPE,TYPECONFIG。
—table,是整個reousces table的開始,它的chunksize便是整個文件的大小。
—package,指的是一個package的開始,其實在resources,arsc是能夠有多個package的。而packageID便是資源resID的最高八位,通常來講系統android的是1(0x01),普通的例如com.tencent.mm會是127(0x7f),剩下的是從2開始起步。固然這個咱們在aapt也是能夠指定的(1-127即八位的合法空間,一些混合編譯就是改這個packageID)。
—string, 表明stringblock,咱們一共有三種類型的stringblock。分別是table stringblock,typename stringblock, specsname stringblock。
—type,這裏講的是typename stringblock裏面咱們用到的各類type(用到多少種類型的type,就有多少個type chunk),例如attr, drawable, layout, id, color, anim等,Type ID是緊跟着Package ID。
—config, 便是Android用來描述資源維度,例如橫豎屏,屏幕密度,語言等。對於每一種type,它定義了多少種config,它後面就緊跟着多少個config chunk,例如咱們定義了drawable-mdpi,drawable-hdpi,那後面就會有兩個config。
—entry,儘管沒有entry這個chunk,可是每一個config裏面都會有不少的entry,例如drawable-mdpi中有icon1.png,icon2.png兩個drawable,那在mdpi這個config中就存在兩個entry。
簡單來講方案爲:
根據上文安裝包知識的文章,7z有着更好的壓縮率,同時咱們也能夠強制壓縮相似resources.arsc、png、jpg等Android默認不會打包壓縮的文件。
最後把修改後的resources.arsc重打包便可,微信從解壓,到混淆,到重打包耗費時間,不要799,也不要699,僅需35秒。具體效果以下圖:
最後,總體的處理流程以下:
compress參數對混淆效果的影響若指定compess 參數.png、.gif以及*.jpg,resources.arsc會大大減小安裝包體積。若要支持2.2,resources.arsc需保證壓縮前小於1M。
操做系統對7z的影響實驗證實,linux與mac的7z效果更好
keepmapping方式對增量包大小的影響 影響並不大,但使用keepmapping方式有利於保持全部版本混淆的一致性
渠道包的問題(建議經過修改zip摘要的方式生產渠道包) 在出渠道包的時候,解壓重壓縮會破壞7zip的效果,經過repackage命令可用7zip重壓縮。
若想經過getIdentifier方式得到資源,須要放置白名單中。 部分手機桌面快捷圖標的實現有問題,務必將程序桌面icon加入白名單
TODO,除了資源混淆,其實咱們還能夠實現資源加密等其餘功能。
Bugly是騰訊內部產品質量監控平臺的外發版本,其主要功能是App發佈之後,對用戶側發生的Crash以及卡頓現象進行監控並上報,讓開發同窗能夠第一時間瞭解到App的質量狀況,及時機型修改。目前騰訊內部全部的產品,均在使用其進行線上產品的崩潰監控。