在源碼中編譯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)