---将原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的方法相同。
以上只是个人在项目中的解决方案,仅供参考。