Android——编译odex保护

编译过android源码的可能试验过修改编译类型,android的初始化编译配置可参考http://blog.csdn.net/jscese/article/details/23931159

一.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,[email protected])
	$(call dexpreopt-one-file,[email protected],$(patsubst %.apk,%.odex,[email protected]))
ifneq (nostripping,$(LOCAL_DEX_PREOPT))
	$(call dexpreopt-remove-classes.dex,[email protected])
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

Android——编译odex保护,布布扣,bubuko.com

时间: 2024-12-29 11:17:32

Android——编译odex保护的相关文章

Android——编译安装Module的控制因素

在前文Android--编译系统初始化设置中有解析编译的TARGET_BUILD_VARIANT 的配置与基本区别, 其中的一些编译控制是对的但是Module的Android.mk中的LOCAL_MODULE_TAGS 控制并不全适用目前的android4.2,这里记录一下我对Module的控制过程. 撰写不易,转载请注明出处:http://blog.csdn.net/jscese/article/details/39209341 一.LOCAL_MODULE_TAGS: 首先还是这个放在And

android反编译odex文件

关于android的反编译工具,相信大家并不陌生 如APK-TOOL,dex2jar APK-TOOL 用于反编译出布局文件 下载地址http://code.google.com/p/android-apktool/downloads/list dex2jar 用于将dex反编译成.jar包 下载地址:http://code.google.com/p/dex2jar/downloads/list 生成的jar包可用jd-gui来查看(前提是代码未被混淆) 但是如果我们从rom里面提取出的apk是

android编译framework架包运行报错 (转)

android编译framework架包运行报错 http://blog.csdn.net/cqupt_chen/article/details/8163632 最近在看frameworks里的源码,手痒了,便想改改看看效果,没想到改完后,模拟器却运行不起来了.        首先声明,我是用的android 4.0.3 ICS的源码,编译好后,利用编译好的镜像启动的模拟器,以前修改过里面的Launcher,将生成的Launcher.apk和Launcher.odex  push后是成功的.现在

Cocos2d-x3.3RC0的Android编译Activity启动流程分析

本文将从引擎源代码Jni分析Cocos2d-x3.3RC0的Android Activity的启动流程,以下是具体分析. 1.引擎源代码Jni.部分Java层和C++层代码分析 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXV4aWt1b18x/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" > watermark/2/text/aHR0cDov

[Android 编译(一)] Ubuntu 16.04 LTS 成功编译 Android 6.0 源码教程

本文转载自:[Android 编译(一)] Ubuntu 16.04 LTS 成功编译 Android 6.0 源码教程 1 前言 经过3天奋战,终于在Ubuntu 16.04上把Android 6.0的源码编译出来了,各种配置,各种error,各种爬坑,特写此博客记录爬坑经历.先上图,Ubuntu上编译完后成功运行模拟器,如图: 2 编译环境 UbuntuKylin 16.04 LTS Android 6.0_r1 Open JDK 7 3 准备工作 (1) 下载android 6.0源码.

Android 编译错误/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.4.5/../

编译时出现/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../libz.so when searching for -lz错误 ============================================ PLATFORM_VERSION_CODENAME=AOSP PLATFORM_VERSION=AOSP TARGET_PRODUCT=generic TARGET_BUIL

转: 加快Android编译速度

转: http://timeszoro.xyz/2015/11/25/%E5%8A%A0%E5%BF%ABandroid%E7%BC%96%E8%AF%91%E9%80%9F%E5%BA%A6/ 加快Android编译速度 发表于 2015-11-25   | 对于Android开发者而言,随着工程不断的壮大,Android项目的编译时间也逐渐变长,即便是有时候添加一行代码也需要等待好久才能看见期待的效果.之前加快Android编译的工具相对较少,其中最具有代表性的开源项目当属FaceBook的

Android编译详解之lunch命令 【转】

本文转载自: Android编译详解之lunch命令 (2012-10-08 10:27:55) 转载▼ 标签: it 分类: android内核剖析 Android的优势就在于其开源,手机和平板生产商可以根据自己的硬件进行个性定制自己的手机产品,如小米,LePhone,M9等,因此,在我们在对Android的源码进行定制的时候,很有必要了解下,Android的编译过程. 如果你从来没有做过Android代码的编译,那么最官方的编译过程就是查看Android的官方网站:http://source

Android 编译时注解-提升

Android 编译时注解-提升 背景 在前面的文章中,讲解了注解和编译时注解等一些列相关的内容,为了更加全面和真是的了解Android 编译时注解在实战项目中的使用,本文采取实现主流框架butterknife注入view去全面认识编译时注解. 注解专栏-博客 效果 先来张图压压惊,实现效果butterknife的view绑定 使用 仿照butterknife实现了@BindView注解,通过WzgJector.bind方法绑定当前MainActivity,整体和butterknife使用完全一