++++++++++++++++++UPDATE++++++++++++++++++UPDATE+++++++++++++++++++++UPDATE+++++++++++++++++++++++++++++++++++++UPDATE
时隔很久了,因为项目中一直认为这个是个瓶颈,导致本来可以放在一个AP里面的东西要写成两个AP,所以我又回来看了这个问题,这次我想到了在android源码中是不是有AP用过jar包,那我学习它不就好了?
所以我在Ubuntu下搜索package/app目录: find -name '*.jar'
- LOCAL_PATH := $(call my-dir)
- include $(CLEAR_VARS)
- LOCAL_STATIC_JAVA_LIBRARIES := libarity
- LOCAL_SRC_FILES := $(call all-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)
- # Use the folloing include to make our test apk.
- include $(call all-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
- package com.ianc.jar;
- public class Lily {
- String name;
- public void setName(String name) {
- this.name = name;
- }
- public Lily() {
- super();
- }
- public Lily(String name) {
- super();
- this.name = name;
- }
- public String getName(){
- return "lily";
- }
- }
用Eclipse-->export-->选中JAVA里面的JAR file这项,然后一路next就可以生成JAR包
测试工程的简单代码(TestJar.java):
- package com.ianc.testjar;
- import android.app.Activity;
- import android.os.Bundle;
- import com.ianc.jar.Lily;
- public class TestJar extends Activity {
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- Lily l = new Lily("lily");
- String result = 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包)
这次我再去我的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=genericTARGET_BUILD_VARIANT=engTARGET_SIMULATOR=TARGET_BUILD_TYPE=releaseTARGET_ARCH=armHOST_ARCH=x86HOST_OS=linuxHOST_BUILD_TYPE=releaseBUILD_ID=============================================target Java: ImportSD (out/target/common/obj/APPS/ImportSD_intermediates/classes)Copying out/target/common/obj/APPS/ImportSD_intermediates/classes-full-debug.jarCopying: out/target/common/obj/APPS/ImportSD_intermediates/classes.jartarget Dex: ImportSDtarget 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啦!好高兴耶!本人才疏学浅,如果你有更好的方法,还请各位不吝赐教!