關於Android混淆文件統一管理

概述

對於學習Android開發的我們都知道,在發佈生產包時需要對項目開啓混淆,這樣可以避免項目代碼暴露在別人面前。而Android Studio在build.gradle文件配置上也非常貼心的提供了開啓代碼混淆的方式,開發者只要按照官方建議進行配置即可。

android {
  buildTypes {
    release {
      minifyEnabled true //開啓混淆
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
  }
  ...
}
...

proguard-android.txt文件提供了基本的混淆規則,存在Android SDK中,無需修改。而proguard-rules.pro文件,就是提供給開發者添加或修改自定義的混淆規則。可以說我們自定義混淆的全部規則都是在這個文件上進行的。這裏我們不會介紹針對具體代碼進行混淆。我們考慮的是從項目管理的角度上,如何讓該配置文件的效益最大化。

提出問題

爲什麼要配置文件的效率最大化?
我們提出一個場景,隨着項目功能迭代越來越多,代碼量越大,引用的第三方庫同樣越來越多。這樣導致的結果就是proguard-rules.pro文件越發臃腫,而且我們修改proguard-rules.pro文件頻繁,一不小心就會出現大量的代碼冗餘。這對於追求極致的工程師來說是不可容忍的。

解決方案(一)

上面問題的根源就是代碼耦合度高,修改了一處其他地方也要修改,我們即知道了問題之所在,那就好辦了。既然我們在引用第三方庫的時候,都需要加上混淆代碼,那麼我們可以將所有的三方庫的混淆代碼集中在一處管理就行了。這樣我們只需要新加上一個混淆文件來管理這些代碼就可以了,該文件專門來管理這些第三方的混淆代碼,其他常規的混淆代碼還是放在原來的配置文件中。如下:

proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro','proguard-third-rules.pro'

如上只要在項目中proguard-rules.pro的同級別目錄下,新建proguard-third-rules.pro文件,然後配置第三方混淆代碼即可。

解決方案(二)

通過增加混淆文件的方法,來將原來proguard-rules.pro文件的混淆代碼進行拆分。這樣的確解決了上面單個混淆文件代碼臃腫的問題。但是並不是最優解,它還是沒有解決代碼耦合度高的問題。當子module中代碼修改了需要同步修改它的混淆代碼時,你還是要去主app的module中尋找混淆文件來修改。所以最好的解決方案是直接在子module中修改自身proguard-rules.pro文件,而不用修改別處代碼,而我們也看到在子module中帶了proguard-rules.pro文件,這似乎表明aar文件(子module編譯後生成的文件)可以自帶混淆配置。當我們滿心歡喜,如法炮製,配置混淆代碼後,如下:

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

    }
}

運行項目,發現竟然報錯了,提示類找不到,這說明混淆沒有生效。這下懵逼了,既然提供了這個文件,卻不讓使用。遇到這樣的問題,我想着是否還有其他的配置屬性可以使用,就從Android Studio的官方網站上BuildType,看到了關於consumerProguardFiles屬性的描述ProGuard rule files to be included in the published AAR. 。點進去一看總共四句話:

List consumerProguardFiles

ProGuard rule files to be included in the published AAR.(混淆規則文件被包含在發佈的AAR中)

These proguard rule files will then be used by any application project that consumes the AAR (if ProGuard is enabled).(這些混淆規則應用在程序調用該AAR中)

This allows AAR to specify shrinking or obfuscation exclude rules.(允許AAR指定壓縮和混淆規則)

This is only valid for Library project. This is ignored in Application project.(只對Library工程有效,在應用程序項目中被忽略。)

這不正是我所期望的結果嗎!看到這裏,馬上開動,修改子module中配置:

    buildTypes {
        release {
            consumerProguardFiles 'proguard-rules.pro'
        }
    }

再次執行,完美運行!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章