Android——编译odex保护
2016-03-25 08:48
686 查看
编译过android源代码的可能试验过改动编译类型。android的初始化编译配置可參考Android——编译系统初始化设置
从上面的逻辑能够看出来 DISABLE_DEXPREOPT 设置以及:
和HOST_OS 这三个变量决定WITH_DEXPREOPT
当编译的时候,遍历须要编译的MODULE的时候,在/build/core/package.mk。至于为什么会买这个makefile来是由于MODULE中的android.mk 中include $(BUILD_PACKAGE)。这个是android的编译体系了。
从package.mk中的这部分逻辑能够看出来。TARGET_BUILD_APPS 置空 是在前面的文章中的lunch命令中设置的。代表全编译!
并且LOCAL_SRC_FILES不能为空,意思就是有源代码的
这个时候假设没定义。那么变量LOCAL_DEX_PREOPT = true。
接着往下看:
这两个逻辑的运行都在/build/core/dex_preopt.mk中
生成那些jar包的.odex。
工具在/build/core/config.mk中定义:
在生成apk和jar的处理:
再通过:
来移除.dex
大体的编译配置和流程介绍到这里,细节都在这么几个文件中面,不多写了!
系统制作会把.odex 和 apk 一起放到system/app 下,由系统来调度使用,假设想盗版apk,单独copy出去.apk是不能用的。还必须反编译相应的.odex为.dex,又一次打包进apk包。才干使用,而反编译.odex 还须要用到这个这个apk有使用到的相关jar包。
而我们系统制作的framework.jar也是有framework.odex的。这样能够起到一定程度上的保护作用!至于网上各种反编译odex 然后签名的方法有非常多,不多做介绍。
撰写不易,转载请注明出处:/article/1531704.html
一.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 然后签名的方法有非常多,不多做介绍。
撰写不易,转载请注明出处:/article/1531704.html
相关文章推荐
- android:layout_gravity和android:gravity的区别
- 使用Frodo,在Android中调试RxJava
- Android中Bitmap,byte[],Drawable相互转化
- Socket编程之android service
- android 6.0权限动态管理
- android之adb
- Android gradle学习(二)
- android 通过WiFi进行adb调试
- Android自定义控件系列案例【三】
- Retrofit2.0使用
- Android中对话框(Dialog)的创建方法
- Android监听——变量的变化
- Android 图片相关注意事项
- 【Android】【绘图】MeasureSpec
- Android中Fragment和Activity之间的通信(含接口回调)
- android中touch事件分发机制
- android Graphics(二):路径及文字
- android开发之splash闪屏页判断是否第一次进入app代码
- Android开发之 。。各种Adapter的用法
- android开发之 listview中的item去掉分割线 隐藏分割线