android 混淆器的使用 proguard.flags

終於知道怎麼在android源碼中混淆編譯了,不用ant也不用eclipse插件。
1.在需要混淆的工程目錄下(package/apps/下的工程)添加proguard.flags文件,該文件即爲網絡傳說中的proguard.cfg,只是命名不一樣而已,然後再Android.mk中添加如下兩句:
LOCAL_PROGUARD_ENABLED := full
LOCAL_PROGUARD_FLAG_FILES := proguard.flags
上面的full 也可以是custom,如果不寫這句,那還得添加如下一句:
TARGET_BUILD_VARIANT := user或者TARGET_BUILD_VARIANT := userdebug


這樣後在工程目錄下執行mm便可以看到在out目錄下生成了形如proguard.classes.jar的東東,這就說明已在編譯中啓動了proguard






但反編譯一看,並未出現網絡雲說的abcd替代符號,其實代碼並未真正混淆:


android在編譯時默認關閉了混淆選項,有去研究build/core目錄的同志會發現這裏也有個proguard.flags文件,其實在proguard的過程中,編譯器會調用包括本地目錄下和系統定義了的多個proguard.flags文件,而在這個文件中混淆的選項被禁止了,故而編譯出來的apk仍未混淆。因此將如下句子註釋掉便可實現真正的混淆編譯:
# Don't obfuscate. We only need dead code striping.
-dontobfuscate(將該句加個#號註釋掉)






好奇的同志還可以繼續看看,爲什麼TARGET_BUILD_VARIANT := user和LOCAL_PROGUARD_ENABLED := full二選一即可,詳見build/core/package.mk:


LOCAL_PROGUARD_ENABLED:=$(strip $(LOCAL_PROGUARD_ENABLED))
ifndef LOCAL_PROGUARD_ENABLED
ifneq ($(filter user userdebug, $(TARGET_BUILD_VARIANT)),)
    # turn on Proguard by default for user & userdebug build
    LOCAL_PROGUARD_ENABLED :=full
endif
endif
ifeq ($(LOCAL_PROGUARD_ENABLED),disabled)
    # the package explicitly request to disable proguard.
    LOCAL_PROGUARD_ENABLED :=
endif
proguard_options_file :=
ifneq ($(LOCAL_PROGUARD_ENABLED),custom)
ifneq ($(all_resources),)
    proguard_options_file := $(package_expected_intermediates_COMMON)/proguard_options
endif # all_resources
endif # !custom
LOCAL_PROGUARD_FLAGS := $(addprefix -include ,$(proguard_options_file)) $(LOCAL_PROGUARD_FLAGS)

具體我就不解釋了,大家自己理解吧哈


原文地址:http://www.eoeandroid.com/thread-151712-1-1.html


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