將定製的java包引入到android系統中

開發環境

主機: ubuntu

android機: android 4.3

CPU: MSM8610


一般行業定製機器或者某些品牌會定製自己的jar包,那麼如何將其引入android系統中,作爲全局包呢?如果只是引入第三方已做好的jar包,來開發應用,請見我的博客另一篇文章 “Android開發小問題集”。

現以開發中引入系統級掃描開發包爲例。要做的其實有4個地方。

1、jar模塊及權限xml

Android.mk中需要處理2個模塊:指定編譯barcode.jar這個模塊,還要指定拷貝一個權限xml到系統的/system/etc/permisson中。

Android.mk完整如下

LOCAL_PATH :=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional

LOCAL_SRC_FILES :=$(call all-subdir-java-files)
LOCAL_MODULE := barcode
include $(BUILD_JAVA_LIBRARY)


#MAKE_XML
include $(CLEAR_VARS)
LOCAL_MODULE :=  barcode.xml
LOCAL_MODULE_CLASS :=ETC
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/permissions
LOCAL_SRC_FILES := $(LOCAL_MODULE)
include $(BUILD_PREBUILT)
barcode.xml完整如下
<?xml version="1.0" encoding="UTF-8"?>
<permissions>
	<library
		name="barcode"
		file="/system/framework/barcode.jar"
	 />
</permissions>
其中xml中的name爲xml的文件名,file爲copy後jar所在系統的完整路徑

2、加入系統集成編譯

因前面2個module指定的tags是optional,所以要在板子mk配置中加入指定的編譯,編譯配置文件在msm8x12\device\qcom\msm8610中的msm8610.mk中加入前面LOCAL_MODULE指定的名字,這樣在lunch編譯msm8610板子的時候,這2個模塊纔會編進Android系統,其他的如msm8974,ti\panda的板子都不會去編譯,達到模塊可配置化的靈活編譯。

msm8610.mk加入編譯的模塊如下,關於模塊編譯相關可參見我的博客“Android.mk常用筆記”和Android開發小問題集”中的“自定義編譯模塊”

//.........
# barcode
PRODUCT_PACKAGES += \
	barcode \
	barcode.xml
//........

當然你也可以偷懶,將tags直接設置爲eng或者user,這樣所有eng或者user版本都會去編譯,缺少不同板子配置的靈活性。

3、init.rc環境變量中加入jar

init.rc如下
#....
# setup the global environment
    export PATH /sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin
    export LD_LIBRARY_PATH /vendor/lib:/system/lib
    export ANDROID_BOOTLOGO 1
    export ANDROID_ROOT /system
    export ANDROID_ASSETS /system/app
    export ANDROID_DATA /data
    export ANDROID_STORAGE /storage
    export ASEC_MOUNTPOINT /mnt/asec
    export LOOP_MOUNTPOINT /mnt/obb
    export BOOTCLASSPATH /system/framework/core.jar:/system/framework/core-junit.jar:/system/framework/bouncycastle.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/telephony-common.jar:/system/framework/voip-common.jar:/system/framework/mms-common.jar:/system/framework/android.policy.jar:/system/framework/services.jar:/system/framework/apache-xml.jar:/system/framework/telephony-msim.jar:<span style="color:#3366ff;">/system/framework/barcode.jar</span>
#....

4、dex_preopt.mk加入jar

dex_preopt.mk如下
####################################

# TODO: replace it with device's BOOTCLASSPATH
DEXPREOPT_BOOT_JARS := core:core-junit:bouncycastle:ext:framework:telephony-common:voip-common:mms-common:android.policy:services:apache-xml:telephony-msim:keypad:touch:misc:ScannerAPI:<span style="color:#3366ff;">barcode</span>
ifneq ($(strip $(TARGET_ADDITIONAL_BOOTCLASSPATH)),)
DEXPREOPT_BOOT_JARS := $(DEXPREOPT_BOOT_JARS):$(TARGET_ADDITIONAL_BOOTCLASSPATH)
endif

根據該處註釋說用init.rc中的BOOTCLASSPATH來覆蓋,他們具體什麼關係我還沒去了解,反正2處都加上肯定不會錯。




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