天天看點

Android源碼混淆編譯app

在源碼中編譯app,除了需要準備好app的源碼之外,當然需要準備好Android.mk,是以線上makefile

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional

LOCAL_SRC_FILES := \

    $(call all-subdir-java-files) \

LOCAL_STATIC_JAVA_LIBRARIES += android-support-v4  jarnickname

LOCAL_PACKAGE_NAME := AAAA

LOCAL_CERTIFICATE := platform

LOCAL_PROGUARD_ENABLED := nosystem

LOCAL_PROGUARD_FLAGS := -include $(LOCAL_PATH)/proguard.cfg

include $(BUILD_PACKAGE)

include $(CLEAR_VARS)

LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := jarnickname:libs/xxx.jar

include $(BUILD_MULTI_PREBUILT)

這裡關于各個變量的含義就不再說明了,網上有很多文章,但是這是一個比較通用的模闆。

下面着重講一下如何保護我們的代碼——混淆

LOCAL_PROGUARD_ENABLED := nosystem

LOCAL_PROGUARD_FLAGS := -include $(LOCAL_PATH)/proguard.cfg

這2行主要就是用來混淆編譯的,LOCAL_PROGUARD_ENABLED 的變量值在android4.4中有些變化:

4.2 版本:

  • 支援full, custom, optonly三種,其中optonly的作用是增加 proguard_flags += -dontobfuscate,即不做混淆(但是其他優化和壓縮都會做)
  • 預設會使用系統的proguard.flags(在build/core目錄下)

4.4版本:

  • 支援full, custom, nosystem, obfuscation, optimization屬性
  • nosystem,是指不使用系統的proguard.flags
  • obfuscation,是指做混淆,如果該值空,則會加上-dontobfuscate的辨別
  • optimization,優化,如果該值為空,則會加上-dontoptimize的辨別

接下來講一下LOCAL_PROGUARD_FLAG_FILES和LOCAL_PROGUARD_FLAGS的差別 在java.mk中有如下2句 proguard_flag_files := $(addprefix $(LOCAL_PATH)/, $(LOCAL_PROGUARD_FLAG_FILES))

LOCAL_PROGUARD_FLAGS += $(addprefix -include , $(proguard_flag_files))

這就說明了無論我們指定哪個,最終都會被指派到LOCAL_PROGUARD_FLAGS中,是以二者皆可。唯一要注意的是LOCAL_PROGUARD_FLAG_FILES會被自動加上$(LOCAL_PATH)/的字首,是以使用時路勁直接寫app根目錄開始。 而LOCAL_PROGUARD_FLAGS 則要向我上面這樣寫。否則會編譯報錯 Unknown option 'proguard.cfg' 。

最終編譯prguard的時候會用到: $(full_classes_proguard_jar): PRIVATE_PROGUARD_FLAGS := $(proguard_flags) $(LOCAL_PROGUARD_FLAGS)