• Android——编译odex保护


       编译过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






  • 相关阅读:
    CentOS升级Python 2.6到2.7
    ps命令使用 进程查看
    MySQL导入sql脚本 导出数据库
    html php 重定向 跳转 刷新
    Linux查看可执行程序所在路径
    解决phpMyAdmin“登录超时 (1440 秒未活动),请重新登录”的问题
    怎样选购冲锋衣
    常见排序算法及其java实现
    java开发环境搭建
    【转】与BT下载相关的概念
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5318149.html
Copyright © 2020-2023  润新知