1. 程式人生 > >關於將自定義jar新增到android framework裡面小結

關於將自定義jar新增到android framework裡面小結

---將原java類檔案放到framework下面,通過原始碼編譯生成系統jar包:

由於專案中,客戶要求將jar新增到framework裡,以便所有的apk都可以呼叫這個jar。新手上路,一路茫然,網上查看了一些資料,各有不同,也許是android版本不一樣的原因,裡面有些檔案修改的地方不同,下面是我自己總結各方資料,然後結合4.2.2版本的做法,僅供參考:

1.首先,在framework/base/下面建一個資料夾,名字可以隨便取,但語義最好能夠和jar相關,看了一目瞭然。(這裡我定義一個資料夾:test)

2.在新建的資料夾(這裡用test代替)裡新建一個java資料夾,一個mk檔案;mk、檔案要自己寫這裡給個sample:

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_MODULE:= 你定義的模組名字 比如:self.test.support
include $(BUILD_JAVA_LIBRARY)

3.在java資料夾中,新增目錄結構及jar包名稱空間的結構:如com.test.support.那麼就要在java資料夾下新增com資料夾,然後在com資料夾下新增test資料夾,以此類推;新增完目錄結構後,就將要新增的jar的java類檔案放到最後一個資料夾中,對java命令編譯的人一看就知道什麼意思了。

4.在android/build/target/product目錄下的generic_no_telephony.mk檔案中PRODUCT_PACKAGES := \後面追加你定義的模組名字如“ self.test.support \“,不然android整體編譯時不會自動去編譯你定義的那個模組的。

5. 在android/build/target/product目錄下的base.mk檔案中PRODUCT_PACKAGES += \後面也同樣追加你定義的模組名字如“ self.test.support \“;

在android/build/core目錄下的pathmap.mk中的FRAMEWORKS_BASE_SUBDIRS := \後面追加你在base目錄下新增的那個資料夾名 (見步驟一 如:test \)

6.在你要呼叫的apk的mk檔案裡新增LOCAL_JAVA_LIBRARIES :=   self.test.support ,同時在apk的mainifest.xml檔案中新增 <uses-library android:name=" self.test.support " android:required="false"/>

最後 make clean//這步可以不執行,不然整個系統都要重新編 時間太長
 make update-api //這步要執行 
 make

---如果已編譯好的jar放到framework下面:

1.將jar放到android/frameworks/ex/common 自己定義的一個libs資料夾下,因為原始jar包是java包並且關聯一些so檔案,所以需要重新打包成android 的jar包,所以要修改commom下的android.mk檔案

LOCAL_PATH := $(call my-dir)


# Note: the source code is in java/, not src/, because this code is also part of
# the framework library, and build/core/pathmap.mk expects a java/ subdirectory.

include $(CLEAR_VARS)
LOCAL_MODULE := android-common
LOCAL_SDK_VERSION := 8

LOCAL_STATIC_JAVA_LIBRARIES += 第三方jar包的名字 (不含.jar字尾)\

LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES += 第三方jar包的名字 :libs/XXX.jar

#以下是關聯的so檔案,與jar放置在相同目錄
LOCAL_SHARED_LIBRARIES := liblocSDK4 \
libsmartdialer_oem_module \
libsmartdialernet_oem_module \
libstlport_shared \

#開機載入相關,此檔案需要另行新增,具體見下文
LOCAL_MODULE :=android.common.xml //這裡定義的xml檔案要自己在common下新增內容如下:

//android.commom.xml

<permissions>
<library name="android-common"//android-common:定義的
file="/system/framework/android-common.jar" /> //編譯後生成的
</permissions>


LOCAL_SRC_FILES := \
     $(call all-java-files-under, java) \
     $(call all-logtags-files-under, java)
include $(BUILD_STATIC_JAVA_LIBRARY)


# Include this library in the build server's output directory
$(call dist-for-goals, droidcore, $(LOCAL_BUILT_MODULE):android-common.jar)


# Build the test package
# we can't build the test for apps only build, because android.test.runner is not unbundled yet.
ifeq ($(TARGET_BUILD_APPS),)
include $(call all-makefiles-under, $(LOCAL_PATH))
endif

後面的步驟和第一部分介紹的將類檔案新增到framework下生成jar的方法相同。

以上只是個人在專案中的解決方案,僅供參考。