++++++++++++++++++UPDATE++++++++++++++++++UPDATE+++++++++++++++++++++UPDATE+++++++++++++++++++++++++++++++++++++UPDATE
时隔很久了,因为项目中一直认为这个是个瓶颈,导致本来可以放在一个AP里面的东西要写成两个AP,所以我又回来看了这个问题,这次我想到了在android源码中是不是有AP用过jar包,那我学习它不就好了?
所以我在Ubuntu下搜索package/app目录: find -name '*.jar'
关键在于LOCAL_STATIC_JAVA_LIBRARIES := libarity和LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := libarity:lily.jar
其实libarity是个名字可以随便取,但是两个属性的值要一样就好了,但是后面那个冒号里面就一定要写你的jar包名,你的jar包一定放在工程的根目录就好了,目录结构如下:
-res
-src
-com
-ianc
-testjar
TestJar.java
android.mk
AndroidManifest.xml
default.properties
lily.jar
我贴不了图,这样应该能明白吧
最后再贴上代码吧
JAR包的代码:
Lily.java
用Eclipse-->export-->选中JAVA里面的JAR file这项,然后一路next就可以生成JAR包
测试工程的简单代码(TestJar.java):
整个工程我已经upload:http://d.download.csdn.net/down/2579599/xijiaohuangcao(不要资源分,随便下)
++++++++++++++++++UPDATE++++++++++++++++++UPDATE+++++++++++++++++++++UPDATE+++++++++++++++++++++++++++++++++++++UPDATE
以下内容是旧的,请无视
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
我们的ap是拿android自带的ap改的,由于引用了sdk中找不到的一些类,所以要生成apk,必须下mmm命令,而无法通过Eclipse自动生成。
可是我们却需要为这个ap添加一个自己写的jar包,我查阅很多资料都只有介绍如何用Eclipse实现这样的功能,可是却不适合我们的ap,于是我开始实验。
我想到了模仿系统ap,因为系统ap肯定也是有需要jar包,所以我用Google代码搜索,看到在mk文件中有这样的语句:
LOCAL_JAVA_LIBRARIES := core ext
很显然,core和ext是在system/framework下的两个jar包,很多ap都有用到,于是我就试着将我的mk文件修改后,添加了类似上面的这条
语句,我以为我就大功告成了,可是下mmm命令后却得到一个报错的信息:
No
rule to make target
'out/target/common/obj/JAVA_LIBRARIES/home/helen/myandroid/package/apps/Settings_UI/libs/BookStore.jar_intermediates/javalib.jar',needed
by 'out/target/common/obj/APPS/Setting_intermediates/classes-full-debug.jar'.
Stop
任凭我怎么都没办法,后来我就去out/target/common/obj/JAVA_LIBRARIES/这个目录参观了一下,我发现这里面有许多和system/framework
下的jar包对应的文件夹,于是我打开看,每个文件夹里面包含的文件名字都是一样的,从左到右的文件依次是:
emma_out classes.dex classes.jar classes-full-debug.jar javalib.jar,这些正好和我报错的内容不谋而合,于是我去追溯这个文件夹是
如何生成的,拿test-runner打比方,我发现这个其实是由frameworks/base/test-runner下的东西生成的,而这个其实就是jar包的源代码,
我恍然大悟,仅仅拿jar文件其实是没法编成功的,必须拿到jar的源代码,然后仿造test-runner下的mk文件,将里面的
LOCAL_MODULE:= android.test.runner
改换成自己想要的jar包名字就可以了,所以需要先将jar包的源码,放在frameworks/base/lily,再用mmm编译一次,执行如下:
root@lily-laptop:~/android1.5# . build/envsetup.sh
root@lily-laptop:~/android1.5# mmm frameworks/base/lily/
make: Entering directory `/home/lily/android1.5'
build/core/product_config.mk:261: WARNING: adding test OTA key
============================================
TARGET_PRODUCT=generic
TARGET_BUILD_VARIANT=eng
TARGET_SIMULATOR=
TARGET_BUILD_TYPE=release
TARGET_ARCH=arm
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=
============================================
target Java: android.test.lily (out/target/common/obj/JAVA_LIBRARIES/android.test.lily_intermediates/classes)
Copying out/target/common/obj/JAVA_LIBRARIES/android.test.lily_intermediates/classes-full-debug.jar
Copying: out/target/common/obj/JAVA_LIBRARIES/android.test.lily_intermediates/classes.jar
target Dex: android.test.lily
target Jar: android.test.lily (out/target/common/obj/JAVA_LIBRARIES/android.test.lily_intermediates/javalib.jar)
Install: out/target/product/generic/system/framework/android.test.lily.jar
可以看到,他有生成我们所期待的classes-full-debug.jar,classes.jar,javalib.jar,android.test.lily.jar统统都出来啦,哈哈!(这里android.test.lily.jar是我要引用的jar包)
这次我再去我的ap下将mk文件添加:
LOCAL_JAVA_LIBRARIES := android.test.runner android.test.lily(android.test.runner是原本的,我就没删掉了)
于是再一次鼓起勇气执行“mmm 我的ap路径",我滴神呐,终于过了,哈哈!
执行结果如下:
root@lily-laptop:~/android1.5# . build/envsetup.sh
root@lily-laptop:~/android1.5# mmm packages/apps/ImportSD/
make: Entering directory `/home/lily/android1.5'
build/core/product_config.mk:261: WARNING: adding test OTA key
============================================
TARGET_PRODUCT=generic
TARGET_BUILD_VARIANT=eng
TARGET_SIMULATOR=
TARGET_BUILD_TYPE=release
TARGET_ARCH=arm
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=
============================================
target Java: ImportSD (out/target/common/obj/APPS/ImportSD_intermediates/classes)
Copying out/target/common/obj/APPS/ImportSD_intermediates/classes-full-debug.jar
Copying: out/target/common/obj/APPS/ImportSD_intermediates/classes.jar
target Dex: ImportSD
target Package: ImportSD (out/target/product/generic/obj/APPS/ImportSD_intermediates/package.apk)
Install: out/target/product/generic/system/app/ImportSD.apk
所以必须是先将jar的源码make一次,再按照正常的方式修改ap的mk文件就ok了。可是你要问我你要不是自己写的jar,那这个就。。。不知道了,
除非你能拿到以上的out/target/common/obj/JAVA_LIBRARIES/android.test.lily_intermediate这个文件夹下的所有东西,
以及out/target/product/generic/system/framework/android.test.lily.jar并且按照相同的路径建立起来,也就是人为的制造出
按照make jar源码会生成出来的所有东西,如果能拿到,这样我想应该也是可以的。
我之前一直认为我将编译好的jar放入system/framework,再在mk中引用就完全可以的,并且苦苦在网上找寻都无果啊,结果看到一个老外问他
的jar包make为什么过不了,才悟过来原来android是有另外的机制的,整个的jar拿来没法直接用,必须重新make一次,虽然我还没明白为啥一定要这么做,不过总算探明白了如何添加第三方jar
包并能通过mmm啦!好高兴耶!
本人才疏学浅,如果你有更好的方法,还请各位不吝赐教!