在源码中编译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 += $(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)