天天看点

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)