编译过android源码的可能试验过修改编译类型,android的初始化编译配置可参考Android——编译系统初始化设置


一.TARGET_BUILD_VARIANT=user

当选择的编译类型为user的时候,可以在/build/core/main.mk中看到(android 4.2):

  # Turn on Dalvik preoptimization for user builds, but only if not
  # explicitly disabled and the build is running on Linux (since host
  # Dalvik isn't built for non-Linux hosts).
  ifneq (true,$(DISABLE_DEXPREOPT))
    ifeq ($(user_variant),user)
      ifeq ($(HOST_OS),linux)
        WITH_DEXPREOPT := true
      endif
    endif
  endif

从上面的逻辑可以看出来  DISABLE_DEXPREOPT 设置以及:

user_variant := $(filter user userdebug,$(TARGET_BUILD_VARIANT))

HOST_OS  这三个变量决定WITH_DEXPREOPT


当编译的时候,遍历需要编译的MODULE的时候,在/build/core/package.mk,至于为什么会买这个makefile来是因为MODULE中的android.mk 中include $(BUILD_PACKAGE),这个是android的编译体系了。

ifneq (true,$(WITH_DEXPREOPT))
LOCAL_DEX_PREOPT :=
else
ifeq (,$(TARGET_BUILD_APPS))
ifneq (,$(LOCAL_SRC_FILES))
ifndef LOCAL_DEX_PREOPT
LOCAL_DEX_PREOPT := true
endif
endif
endif
endif
ifeq (false,$(LOCAL_DEX_PREOPT))
LOCAL_DEX_PREOPT :=
endif

从package.mk中的这部分逻辑可以看出来, TARGET_BUILD_APPS 置空 是在前面的文章中的lunch命令中设置的,代表全编译!而且 LOCAL_SRC_FILES不能为空,意思就是有源码的

这个时候如果没定义,那么变量LOCAL_DEX_PREOPT = true


接着往下看:

ifdef LOCAL_DEX_PREOPT
# Make sure the boot jars get dexpreopt-ed first
$(LOCAL_BUILT_MODULE): $(DEXPREOPT_BOOT_ODEXS) | $(DEXPREOPT) $(DEXOPT)
endif

ifdef LOCAL_DEX_PREOPT
	$(hide) rm -f $(patsubst %.apk,%.odex,$@)
	$(call dexpreopt-one-file,$@,$(patsubst %.apk,%.odex,$@))
ifneq (nostripping,$(LOCAL_DEX_PREOPT))
	$(call dexpreopt-remove-classes.dex,$@)
endif

这两个逻辑的执行都在/build/core/dex_preopt.mk中

DEXPREOPT_BOOT_ODEXS := $(foreach b,$(DEXPREOPT_BOOT_JARS_MODULES),\
    $(DEXPREOPT_BOOT_JAR_DIR_FULL_PATH)/$(b).odex)


生成那些jar包的.odex!



工具在/build/core/config.mk中定义:

DEXOPT := $(HOST_OUT_EXECUTABLES)/dexopt$(HOST_EXECUTABLE_SUFFIX)
DEXPREOPT := dalvik/tools/dex-preopt


在生成apk和jar的处理:

# $(1): the input .jar or .apk file
# $(2): the output .odex file
define dexpreopt-one-file
$(hide) $(DEXPREOPT) --dexopt=$(DEXPREOPT_DEXOPT) --build-dir=$(DEXPREOPT_BUILD_DIR) \
	--product-dir=$(DEXPREOPT_PRODUCT_DIR) --boot-dir=$(DEXPREOPT_BOOT_JAR_DIR) \
	--boot-jars=$(DEXPREOPT_BOOT_JARS) $(DEXPREOPT_UNIPROCESSOR) \
	$(patsubst $(DEXPREOPT_BUILD_DIR)/%,%,$(1)) \
	$(patsubst $(DEXPREOPT_BUILD_DIR)/%,%,$(2))
endef


再通过:

# $(1): the .jar or .apk to remove classes.dex
define dexpreopt-remove-classes.dex
$(hide) $(AAPT) remove $(1) classes.dex
endef

来移除.dex

大体的编译配置和流程介绍到这里,细节都在这么几个文件里面,不多写了!



二. .odex作用

上面说了生成*.odex,每一个对应的jar和apk都能生成一个对应的.odex,同时去除了.dex,这样单独的jar 和apk 就不完整了,无法正常被android系统使用的! 只有配合.odex使用。

系统制作会把.odex 和 apk 一起放到system/app 下,由系统来调度使用,如果想盗版apk,单独copy出去.apk是不能用的,还必须反编译对应的.odex为.dex,重新打包进apk包,才能使用,而反编译.odex 还需要用到这个这个apk有使用到的相关jar包!

而我们系统制作的framework.jar也是有framework.odex的!这样可以起到一定程度上的保护作用!至于网上各种反编译odex 然后签名的方法有很多,不多做介绍。





撰写不易,转载请注明出处:http://blog.csdn.net/jscese/article/details/32702321






GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐