android不將apk包編譯到系統裏的方法

轉自http://blog.csdn.net/ydt_lwj/article/details/7767110

Andriod默認情況下將java代碼編譯成apk包後都會安裝到/system/app目錄下,因爲system目錄最終會打包成system.img文件,即Android的文件系統。在Android裏一個java都是以一個apk的形式存在,在系統編譯時,Androd會根據每個應用的mk文件裏的LOCAL_MODULE_TAGS這個變量的值來決定這個應用是否會編譯到系統裏,通常情況下

LOCAL_MODULE_TAGS變量的值有user optional debug eng tests samples這幾個值,在2.2裏如果LOCAL_MODULE_TAGS變量的值爲user那麼系統直接就會將這個應用的apk安裝到systm/app目錄下,但是在2.3裏將這個變量的值賦值爲user系統會做一個處理,會根據LOCAL_MODULE的值於GRANDFATHERED_USER_MODULES變量的值進行比較,

如果LOCAL_MODULE變量的值在GRANDFATHERED_USER_MODULES變量裏沒有那麼系統就會報錯,默認情況下userdebug eng 都會被編譯到系統裏optional會根據要編譯的模塊是否在PRODUCT_PACKAGES這個變量中,如果在就會編譯到系統裏,如果沒有那麼就不會被編譯到系統裏,tests會根據編譯的版本的vatiant來決定是否編譯到系統裏,而samples只是一個例子一般都不會被編譯到系統裏的。在Android裏只有幾個samples是可以被編譯到系統裏的,但是默認情況是沒有被編譯的。


但是在android系統裏java應用如果生成了apk包就會被安裝到system/app目錄下,然後打包成系統的鏡像文件,如果我們想把java的應用編譯生成apk包,而且不將啓安裝到system/app目錄下,默認的android系統是沒有這個編譯功能的,默認情況下java應用的代碼都會被系統編譯的,但是如果LOCAL_MODULE_TAGS這個變量的值設置的不對,那麼系統只會對代碼進行編譯而不會生成apk包,生成apk包就會被安裝到system/app目錄下準備打包成系統文件,要想將java應用編譯生成apk包而且不被編譯到系統裏那麼我們就等修改該Android系統的Makefile文件系統,詳細思路不在這裏介紹了,這裏只介紹一下怎麼修改Andriod系統的Makefile來實現將java編譯成apk並不會被安裝到系統目錄下而是安裝到制定的目錄下。

方法一:

LOCAL_MODULE_TAGS這個變量設置一個系統已有以爲的其他的值,這裏賦值爲tmp

修改base_rules.mk文件,在這個文件裏的找道

[html] view plaincopy
  1. ifeq($(LOCAL_MODULE_PATH),)  
  2.     LOCAL_MODULE_PATH := $($(my_prefix)OUT$(use_data)_$(LOCAL_MODULE_CLASS))  
  3.     ifeq($(strip $(LOCAL_MODULE_PATH)),)  
  4.         $(error $(LOCAL_PATH): unhandled LOCAL_MODULE_CLASS  
  5.         “$(LOCAL_MODULE_CLASS)”)  
  6.     endif  
  7. endif  

在這裏添加幾行代碼,添加的代碼如下:

[html] view plaincopy
  1. ifeq($(LOCAL_MODULE_PATH),)  
  2.     ifeq($(filter tmp,$(LOCAL_MODULE_TAGS)),tmp)  
  3.     LOCAL_INSTALLED_TMP :=$(PRODUCT_OUT/tmp)  
  4.     endif  
  5.     ifeq($(filter tmp,$(LOCAL_MODULE_TAGS)),)  
  6.     LOCAL_INSTALLED_TMP :=  
  7.     endif  
  8.     ifdef LOCAL_INSTALLED_TMP   
  9.     LOCAL_MODULE_PATH := $(LOCAL_INSTALLED_TMP)  
  10.     else  
  11.     LOCAL_MODULE_PATH := $($(my_prefix)OUT$(use_data)_$(LOCAL_MODULE_CLASS))  
  12.     endif  
  13.     ifeq($(strip $(LOCAL_MODULE_PATH)),)  
  14.         $(error $(LOCAL_PATH): unhandled LOCAL_MODULE_CLASS  
  15.         “$(LOCAL_MODULE_CLASS)”)  
  16.     endif  
  17. endif  

這樣就可以將java編譯生成的apk包安裝到制定的目錄下,這裏的目錄是

$PRODUCT_OUT/tmp目錄,但是這種方法需要將java應用的mk文件裏的

LOCAL_PACKAGE_NAME變量定義的包名添加到系統的PRODUCT_PACKAGES這個變量中,如果PRODUCT_PACKAGES這個變量裏沒有你要編譯的java應用的包名,那麼系統還是隻會對代碼進行編譯而不會生成apk包。那麼怎麼樣不用將要編譯的應用的包名不添加到PRODUCT_PACKAGES這個變量中也能生成apk包並安裝到制定的目錄下呢,見方法二。

方法二:

先完成方法一,然後在修改main.mk文件找到

[html] view plaincopy
  1. user_MODULES:= $(sort $(call get-tagged-modules,user))  


在這行的代碼後面添加一行代碼,代碼如下:

[html] view plaincopy
  1. tmp_MODULES:= $(sort $(call get-tagged-modules,tmp))  

然後將將剛剛定義的tmp_MODULES變量賦給user_MODULES變量,在原有的代碼

[html] view plaincopy
  1. user_MODULES := $(user_MODULES)$(user_PACKAGES)  


後邊將即可.

[html] view plaincopy
  1. user_MODULES:= $(user_MODULES) $(user_PACKAGES) $(tmp_MODULES)  


這種方法不用將應用的包名添加到PRODUCT_PACKAGES變量裏。

還有一種方法也不用將要編譯的包名添加給PRODUCT_PACKAGES變量,也能將其進行編譯並生成apk包安裝到指定的目錄下

方法三:

還是先完成就方法一,然後修改main.mk文件,找到

[html] view plaincopy
  1. ifeq($(TARGET_BUILD_VARIANT),eng)  
  2.   
  3. tags_to_install:user debug eng  
  4.   
  5. …..  
  6.   
  7. endif  

將自己定義的LOCAL_MODULE_TAGS變量的值tmp賦值給變量tags_to_install即可,賦值後的代碼:

[html] view plaincopy
  1. tags_to_install:user debug eng tmp  

找到

[html] view plaincopy
  1. user_MODULES:= $(sort $(call get-tagged-modules,user))  

在這行的代碼後面添加一行代碼,代碼如下:

[html] view plaincopy
  1. tmp_MODULES:= $(sort $(call get-tagged-modules,tmp))  


總結:上面的三種方法都可以實現將應用編譯成apk包並安裝到制定的目錄,可以根據自己的愛好自己決定用那種方法



發佈了0 篇原創文章 · 獲贊 3 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章