将自定义的jar包添加到framework层(错误)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yuezhuo_752/article/details/53544137

原java类文件放到framework下面,通过源码编译生成系统jar包:

项目中,客户要求将jar添加到framework里,以便所有的apk都可以调用这个jar。网上查看了一些资料,各有不同,下面是我自己总结各方资料来解决问题,仅供参考:

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:= 你定义的模块名字或者说jar包名字 比如:self.test.support
include $(BUILD_JAVA_LIBRARY)

3.在java文件夹中,添加目录结构及jar包命名空间的结构:如com.test.support.那么就要在java文件夹下添加com文件夹,然后在com文件夹下添加test文件夹,以此类推;添加完目录结构后,就将要添加的jar的java类文件放到最后一个文件夹中,对java命令编译的人一看就知道什么意思了。

在frameworks\base下新建xxx目录,下面的目录结构如下,必须要有一个java的目录:
│  Android.mk
└─java
    └─com
        └─android
            └─frameworkunit
                    FrameworkTest.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 \)

最后 make clean
//这步可以不执行,不然整个系统都要重新编 时间太长

 make update-api //这步要执行 
 make 或者在frameworks\base\xxx下执行mm 生成jar包

参考:

1:http://blog.csdn.net/tkwdmylove/article/details/39289079

2:http://blog.chinaunix.net/uid-22816738-id-4358584.html

--------------------分割线-----------------------------------------

生成jar包后,参考:http://blog.csdn.net/jack_liu_2008/article/details/49764131 将jar添加进framework.jar,使得framework.jar能调用自己jar包里的方法

1.在源码frameworks/opt/中创建文件夹demo, 将第三方的demo.jar拷贝拷贝到该目录下,同时在该目录下创建Android.mk (参考android2.1)

注意:demo.jar说的是打包格式为.dex,不是.class格式的

Andorid.mk写入:

LOCAL_PATH:= $(my-dir)
include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := myjar:demo.jar
include $(BUILD_MULTI_PREBUILT)

-----------分割线---------------------

“myjar” 只是一个标示名,可以用任意命名替换,该名称在下面步骤中会用到

2 将demo.jar编译到源码环境中
执行命令:mmm framework/opt/demo/
编译之后会生成
out/target/product/xxx/obj/JAVA_LIBRARIES/demo_intermediates/javalib.jar

3 在framework加入demo.jar,需要修改framework/base/Android.mk:

# Build ext.jar
# ============================================================

# NOTICE notes for non-obvious sections
# apache-http - covered by the Apache Commons section.


ext_dirs := \
    ../../external/nist-sip/java \
    ../../external/apache-http/src \
    ../../external/tagsoup/src \
    ../../external/libphonenumber/java/src

ext_src_files := $(call all-java-files-under,$(ext_dirs))

ext_res_dirs := \
    ../../external/libphonenumber/java/src

# ==== the library =========================================
include $(CLEAR_VARS)

LOCAL_SRC_FILES := $(ext_src_files)

LOCAL_NO_STANDARD_LIBRARIES := true
LOCAL_JAVA_LIBRARIES := core
LOCAL_JAVA_RESOURCE_DIRS := $(ext_res_dirs)
LOCAL_STATIC_JAVA_LIBRARIES := myjar 增加该行,myjar是步骤1中的标示名
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := ext

LOCAL_DX_FLAGS := --core-library

include $(BUILD_JAVA_LIBRARY)

---------------分割线-----------------------------


4 将demo.jar编译到framework中
执行命令: mmm framework/base/
会更新3个系统jar包
out/target/product/xxx/system/framework/ext.jar
out/target/product/xxx/system/framework/framework.jar
out/target/product/xxx/system/framework/framework2.jar

需要注意:
编译的中间文件会存在下列目录中
out/target/common/obj/JAVA_LIBRARIES/demo_intermediates/
out/target/common/obj/JAVA_LIBRARIES/ext_intermediates/xxx
out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/xxx
out/target/common/obj/JAVA_LIBRARIES/framework2_intermediates/xxx
out/target/product/xxx/obj/JAVA_LIBRARIES/demo_intermediates/javalib.jar
out/target/product/xxx/obj/JAVA_LIBRARIES/ext_intermediates/javalib.jar
out/target/product/xxx/obj/JAVA_LIBRARIES/framework_intermediates/javalib.jar
out/target/product/xxx/obj/JAVA_LIBRARIES/framework2_intermediates/javalib.jar
如果调试中不想打包第三方的Jar包时,需要手动删除上述目录/文件,再重新编译。

经过上述步骤,就可以在framework调用demo.jar包中函数了。

--------------------------

后面发现阻止了其他程序安卓,以及jar包里有AIDL的话,如果源码里有项目也引用了framework.jar,则会因为包名类名相同导致出现混淆错误。

猜你喜欢

转载自blog.csdn.net/yuezhuo_752/article/details/53544137