Android——編譯odex保護

來源:互聯網
上載者:User

標籤:apk   .odex   反編譯   保護   makefile   

   編譯過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 :=elseifeq (,$(TARGET_BUILD_APPS))ifneq (,$(LOCAL_SRC_FILES))ifndef LOCAL_DEX_PREOPTLOCAL_DEX_PREOPT := trueendifendifendifendififeq (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 filedefine 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.dexdefine dexpreopt-remove-classes.dex$(hide) $(AAPT) remove $(1) classes.dexendef

來移除.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






聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.