++++++++++++++++++UPDATE++++++++++++++++++UPDATE+++++++++++++++++++++UPDATE+++++++++++++++++++++++++++++++++++++UPDATE
时隔很久了,因为项目中一直认为这个是个瓶颈,导致本来可以放在一个AP里面的东西要写成两个AP,所以我又回来看了这个问题,这次我想到了在android源码中是不是有AP用过jar包,那我学习它不就好了?
所以我在Ubuntu下搜索package/app目录:find -name '*.jar'
- LOCAL_PATH:=$(callmy-dir)
- include$(CLEAR_VARS)
- LOCAL_STATIC_JAVA_LIBRARIES:=libarity
- LOCAL_SRC_FILES:=$(callall-java-files-under,src)
- LOCAL_PACKAGE_NAME:=TestJar
- include$(BUILD_PACKAGE)
- ##################################################
- include$(CLEAR_VARS)
- LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES:=libarity:lily.jar
- include$(BUILD_MULTI_PREBUILT)
- #Usethefolloingincludetomakeourtestapk.
- include$(callall-makefiles-under,$(LOCAL_PATH))
关键在于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
- packagecom.ianc.jar;
- publicclassLily{
- Stringname;
- publicvoidsetName(Stringname){
- this.name=name;
- }
- publicLily(){
- super();
- }
- publicLily(Stringname){
- super();
- this.name=name;
- }
- publicStringgetName(){
- return"lily";
- }
- }
用Eclipse-->export-->选中JAVA里面的JAR file这项,然后一路next就可以生成JAR包
测试工程的简单代码(TestJar.java):
- packagecom.ianc.testjar;
- importandroid.app.Activity;
- importandroid.os.Bundle;
- importcom.ianc.jar.Lily;
- publicclassTestJarextendsActivity{
- /**Calledwhentheactivityisfirstcreated.*/
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- Lilyl=newLily("lily");
- Stringresult=l.getName();
- this.setTitle(result);
- }
- }
整个工程我已经upload:http://d.download.youkuaiyun.com/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命令后却得到一个报错的信息:
Norule to make target'out/target/common/obj/JAVA_LIBRARIES/home/helen/myandroid/package/apps/Settings_UI/libs/BookStore.jar_intermediates/javalib.jar',neededby '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=genericTARGET_BUILD_VARIANT=engTARGET_SIMULATOR=TARGET_BUILD_TYPE=releaseTARGET_ARCH=armHOST_ARCH=x86HOST_OS=linuxHOST_BUILD_TYPE=releaseBUILD_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.jarCopying: out/target/common/obj/JAVA_LIBRARIES/android.test.lily_intermediates/classes.jartarget Dex: android.test.lilytarget 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包)