Apktool回編譯APK變大原因--關(guān)于apktool.yml的可壓縮文件配置

1.背景

為了實現(xiàn)apk字節(jié)碼加密技術(shù),我在CI上通過插入了腳本重新打包任務(wù)顽冶。然而采驻,這改動導(dǎo)致apktool回編譯apk包變大,文件經(jīng)調(diào)研和分析發(fā)現(xiàn):在apktool 2.0.3之后為了快速解壓和打包视事,加入了反編譯文件回編譯不壓縮機制胆萧。該配置文件位于apktool.yml文件中。

1-1 反編譯產(chǎn)物
1-2 apktool.yml詳情

幾乎所有的二進制和非二進制文件打包時都未采用壓縮俐东,導(dǎo)致生成的apk變大(即使未簽名依然比原apk大)跌穗,最后在回編過程進行分析订晌。

在反編譯文件中查看yml文件,該文件記錄了apk反編譯信息(見apktool源碼brut/androlib/meta/MetaInfo
compressionType:記錄arsc的是否壓縮
doNotCompress:記錄不壓縮的文件類型和路徑

2.解法

由于最新版本的apktool回編采用了不壓縮的策略蚌吸,導(dǎo)致我們的重編譯apk變大锈拨。
可以想到的有兩種方法:
1.通過apktool高版本來釋放1.apk(framworks apk見上次分享),低版本處理反編譯和打包的問題套利。
2.通過腳本將apktool.yml文件進行修改和定制推励,可以使得我們的release包更小。

3.YAML格式

我們需要對yaml格式的文件進行解析肉迫,有一個支持yaml格式的著名開源庫snakeyaml(用java實現(xiàn))验辞。
我采用jar的形式對這一部分代碼(解析YAML和寫入文件)進行實現(xiàn)。通過shell腳本插入該任務(wù)喊衫,從而達到了自動化過程跌造。
snakeyaml的使用參考:
snakeyaml項目地址:https://bitbucket.org/asomov/snakeyaml
snakeyaml java使用:http://www.reibang.com/p/d8136c913e52

4.CI上打包結(jié)果

通過對反編譯腳本的優(yōu)化使得回編譯簽名包和zipalign包顯著減小。

原始apk 反編譯簽名apk 反編譯zipalign-apk
23.90M 22.48M 22.48M
4-1 CI上打包產(chǎn)物

5.腳本實現(xiàn)

#定義out文件的路徑
rebApkFile=$cache_dir/rebuildApp.apk
echo "rebuildTools> 修改yml打包的配置文件"
#定義jar的路徑族购,用來提取和修改apktool.yml文件
yamlFileCovert_jar=./yamlFileCovert.jar
#執(zhí)行yamlFileCovert_jar
java -jar $yamlFileCovert_jar ${apkDecodeDir}/apktool.yml ${apkDecodeDir}/apktool.yml
echo "rebuildTools> 開始回編譯apk并替換目標文件..."

apktool b -o ${rebApkFile} ${apkDecodeDir}
echo "rebuildTools> 開始簽名新apk..."

...

java部分:

public class YamlFileParse {

    public static void main(String[] args) {
        String fileName;
        String outFile;
        if (args != null && args.length >= 2) {
            fileName = args[0];
            outFile = args[1];
        } else {
            System.out.print("請輸入yml路徑!\n" +
                    "java -jar yamlFileCovert.jar [in] [out] ");

            return;
        }
        try {
            MetaInfo metaInfo = loadYml(fileName);
            saveYml(outFile, metaInfo);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static void saveYml(String outFile, MetaInfo ret) throws IOException {
        FileOutputStream fos = new FileOutputStream(new File(outFile));
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fos, StandardCharsets.UTF_8);
        Writer writer = new BufferedWriter(outputStreamWriter);
        save(ret, writer);
        outputStreamWriter.close();
    }

    private static MetaInfo loadYml(String fileName) throws IOException {
        FileInputStream yamlInput = new FileInputStream(new File(fileName));
        MetaInfo ret = new Yaml().loadAs(yamlInput, MetaInfo.class);
        yamlInput.close();
        ret.doNotCompress = null;
        return ret;
    }

    private static void save(MetaInfo info, Writer output) {
        DumperOptions options = new DumperOptions();
        options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
        new Yaml().dump(info, output);
    }
}

java的源碼部分包括:yaml格式文件的讀寫和MetaInfo(用于apktool.yml序列化指定壳贪,原因見apktool.yml首行)類。

5-1 java工程的結(jié)構(gòu)

以下是apktool.yml文件寝杖,由于文件中包含了MetaInfo類违施,所以必須指定yml序列化需要的類(這一部分拷貝了apktool源碼中部分MetaInfo部分)。

!!brut.androlib.meta.MetaInfo
apkFileName: Rong360-release.apk
compressionType: false
doNotCompress: null
isFrameworkApk: false
packageInfo: {forcedPackageId: '127', renameManifestPackage: null}
sdkInfo: {minSdkVersion: '14', targetSdkVersion: '21'}
sharedLibrary: false
sparseResources: false
usesFramework:
  ids: [1]
  tag: null
version: 2.3.3
versionInfo: {versionCode: '316', versionName: 3.1.6}

運行java -jar $yamlFileCovert_jar ${apkDecodeDir}/apktool.yml對yml進行修改后瑟幕,回編apk磕蒲,從而產(chǎn)物的apk大小達到了預(yù)期。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末只盹,一起剝皮案震驚了整個濱河市辣往,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌殖卑,老刑警劉巖站削,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異孵稽,居然都是意外死亡许起,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門肛冶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來街氢,“玉大人,你說我怎么就攤上這事睦袖。” “怎么了荣刑?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵馅笙,是天一觀的道長伦乔。 經(jīng)常有香客問我,道長董习,這世上最難降的妖魔是什么烈和? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮皿淋,結(jié)果婚禮上招刹,老公的妹妹穿的比我還像新娘。我一直安慰自己窝趣,他們只是感情好疯暑,可當(dāng)我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著哑舒,像睡著了一般妇拯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上洗鸵,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天越锈,我揣著相機與錄音,去河邊找鬼膘滨。 笑死甘凭,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的火邓。 我是一名探鬼主播丹弱,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼贡翘!你這毒婦竟也來了蹈矮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤鸣驱,失蹤者是張志新(化名)和其女友劉穎泛鸟,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體踊东,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡北滥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了闸翅。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片再芋。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖坚冀,靈堂內(nèi)的尸體忽然破棺而出济赎,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布司训,位于F島的核電站构捡,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏壳猜。R本人自食惡果不足惜勾徽,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望统扳。 院中可真熱鬧喘帚,春花似錦、人聲如沸咒钟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盯腌。三九已至溉知,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間腕够,已是汗流浹背级乍。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留帚湘,地道東北人玫荣。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像大诸,于是被迫代替她去往敵國和親捅厂。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,941評論 2 355

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理资柔,服務(wù)發(fā)現(xiàn)焙贷,斷路器,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • 學(xué)習(xí)的方式有很多種贿堰,Read the fucking source code 絕對不失為最佳的方式辙芍。除了閱讀 An...
    亦楓閱讀 3,533評論 2 18
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,811評論 6 342
  • 走近了才知道柴窯的魅力,巧奪天工用在這里顯得生硬羹与,這是大自然賜予的禮物故硅,浴火重生的生命之杯。 暮春日歸人 晚來 陶...
    日照漢唐茶文化閱讀 341評論 0 0
  • 最近幾天看了一本書纵搁,書中談到一個案例:一個年輕活潑的姑娘總是把自己弄得病懨懨的吃衅,借此得到關(guān)心。大概是日漸增...
    翶五月閱讀 333評論 0 0