轉自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文件,在這個文件裏的找道
- ifeq($(LOCAL_MODULE_PATH),)
- LOCAL_MODULE_PATH := $($(my_prefix)OUT$(use_data)_$(LOCAL_MODULE_CLASS))
- ifeq($(strip $(LOCAL_MODULE_PATH)),)
- $(error $(LOCAL_PATH): unhandled LOCAL_MODULE_CLASS
- “$(LOCAL_MODULE_CLASS)”)
- endif
- endif
在這裏添加幾行代碼,添加的代碼如下:
- ifeq($(LOCAL_MODULE_PATH),)
- ifeq($(filter tmp,$(LOCAL_MODULE_TAGS)),tmp)
- LOCAL_INSTALLED_TMP :=$(PRODUCT_OUT/tmp)
- endif
- ifeq($(filter tmp,$(LOCAL_MODULE_TAGS)),)
- LOCAL_INSTALLED_TMP :=
- endif
- ifdef LOCAL_INSTALLED_TMP
- LOCAL_MODULE_PATH := $(LOCAL_INSTALLED_TMP)
- else
- LOCAL_MODULE_PATH := $($(my_prefix)OUT$(use_data)_$(LOCAL_MODULE_CLASS))
- endif
- ifeq($(strip $(LOCAL_MODULE_PATH)),)
- $(error $(LOCAL_PATH): unhandled LOCAL_MODULE_CLASS
- “$(LOCAL_MODULE_CLASS)”)
- endif
- endif
這樣就可以將java編譯生成的apk包安裝到制定的目錄下,這裏的目錄是
$(PRODUCT_OUT)/tmp目錄,但是這種方法需要將java應用的mk文件裏的
LOCAL_PACKAGE_NAME變量定義的包名添加到系統的PRODUCT_PACKAGES這個變量中,如果PRODUCT_PACKAGES這個變量裏沒有你要編譯的java應用的包名,那麼系統還是隻會對代碼進行編譯而不會生成apk包。那麼怎麼樣不用將要編譯的應用的包名不添加到PRODUCT_PACKAGES這個變量中也能生成apk包並安裝到制定的目錄下呢,見方法二。
方法二:
先完成方法一,然後在修改main.mk文件找到
- user_MODULES:= $(sort $(call get-tagged-modules,user))
在這行的代碼後面添加一行代碼,代碼如下:
- tmp_MODULES:= $(sort $(call get-tagged-modules,tmp))
然後將將剛剛定義的tmp_MODULES變量賦給user_MODULES變量,在原有的代碼
- user_MODULES := $(user_MODULES)$(user_PACKAGES)
後邊將即可.
- user_MODULES:= $(user_MODULES) $(user_PACKAGES) $(tmp_MODULES)
這種方法不用將應用的包名添加到PRODUCT_PACKAGES變量裏。
還有一種方法也不用將要編譯的包名添加給PRODUCT_PACKAGES變量,也能將其進行編譯並生成apk包安裝到指定的目錄下
方法三:
還是先完成就方法一,然後修改main.mk文件,找到
- ifeq($(TARGET_BUILD_VARIANT),eng)
- tags_to_install:= user debug eng
- …..
- endif
將自己定義的LOCAL_MODULE_TAGS變量的值tmp賦值給變量tags_to_install即可,賦值後的代碼:
- tags_to_install:= user debug eng tmp
找到
- user_MODULES:= $(sort $(call get-tagged-modules,user))
在這行的代碼後面添加一行代碼,代碼如下:
- tmp_MODULES:= $(sort $(call get-tagged-modules,tmp))
總結:上面的三種方法都可以實現將應用編譯成apk包並安裝到制定的目錄,可以根據自己的愛好自己決定用那種方法