您的位置:首页 > 移动开发 > Android开发

android中以项目依赖的方式引用其他项目

2012-11-29 14:37 316 查看
在j2ee中接触到一个项目管理技术:maven,当时很惊叹于maven管理jar包的那种思想,能够将所有的jar包统一集中管理起来,如果需要用到某些jar包,只需在项目的pom.xml中添加对该jar包的依赖即可,这样不会造成每个人都维护一份自己的jar包资源,还需要区别jar包版本的问题,可以说maven确实给项目管理带来了极大的方便。后面做android后,项目中也逐渐累计了一些通用的代码,比如一些工具包、控件等等,虽然把这些通用的代码单独放到了一个包下,新项目来了直接把这个包copy过去,但在项目开发过程中,可能会不断完善这些通用代码,这样的话就造成了一个问题:始终没有一份最全面的通用代码库。于是自己
就仔细研究了下有没有一种方式能够解决这个弊端。下面给出解决方案。

我的想法是将通用代码抽出来单独作为一个project,然后其他项目引用该project,如果需要修改通用代码的话,直接修改那一个project就好了,其他项目依旧可以直接引用,于是我通过build path将通用代码引入自己的项目,项目中确实能够引用通用项目中的代码,运行编译了下,发现console窗口中出现了两次install,一次是自己的项目apk,一次是通用代码项目apk,他们是作为2个应用程序来安装的,这多多少少让人觉得有点郁闷,我想他们作为一个应用程序来安装,通用代码只是作为应用程序的部分来使用而不是一个单独的项目!就继续在网上搜了下,确实有解决方案,该方案必须给予sdk8及以上才行,版本低了不支持。

首先,新建一个一般的android project,将通用代码copy进去,该项目就是一个普通的android project,如果代码中包涵activity、service等等也需要在AndroidManifest.xml中声明,这一切做好后,右击项目,选择properties,



单击左侧的android选项,勾上右侧面板中的Is Library复选框,确认。表示该项目是以lib即jar包的形式导出而不是apk!此时,该项目是不能直接运行的,只能被其他项目所依赖引用,单击项目的ben目录,你会看到下面不再有后缀为apk的文件了,取而代之的是一个jar包。到此,通用代码库已经成功建立了,接下来就是如何在自己的项目中进行引用了。

新建一个android project,建好后右击该project,选择properties,单击左侧的android选项,单击右侧Library面板中的add按钮(参考上图),eclipse会自动列出当前工作空间中以library形式存在的android project,选择要引用的项目(可以选择多个),确认即可。此时在该项目中就可以直接引用刚才添加的项目中的代码了,运行当前项目,这时就不会以2个apk的形式分别安装了。需要注意的是,如果在当前项目中引用Library库项目中的activity、service等等时,虽然在Library库中有声明过,但是在当前项目中依旧要在AndroidManifest.xml中注册,引用方式是:全包名+类名。

这是网上别人对这种用法的一些描述,直接搬过来了

使用库项目开发

库项目示例代码

SDK中包含了一个叫做TicTacToeMain 的样例应用程序,它展示了相关的应用如何使用Android库项目的代码和资源。TicTacToeMain应用使用了TicTacToeLib例子库项目的代码和资源。

要下载样例应用并在您的开发环境作为项目运行它们,使用Android SDK andAVD Manager下载Samples for SDKAPI 8组件到您的SDK中。

更多信息及浏览样例源代码,参阅TicTacToeMain application

Android库项目是一个开发项目,拥有共享的Android源代码和资源。其它的Android应用项目能够引用库项目,而且在构建时能将其源代码编译到.apk文件中。多个应用项目能够引用相同的库项目,并且任何单个应用项目能够引用多个库项目。

如果你有在多个项目中通用的源代码和资源,你可以将它们移到一个库项目中,这样更容易在多个应用和版本中进行维护。下面是一些使用库项目的常见场景:

· 如果您正在开发多个相关的应用,它们使用了一些相同的组件,你应该从各自的应用项目中移除这些冗余的组件,并在库项目中创建单独的、可重复使用的组件集。

· 如果您正在创建的应用程序有免费和付费版本,你应该将这两个版本的通用部分移到一个库项目。使用不同包名的两个相关项目都将引用库项目,并仅提供两个应用版本之间差异的部分。

从结构上来讲,一个库项目和标准的Android应用项目差不多。例如,在项目根目录中包含了清单文件,与src/, res/一样类似的目录。库项目能够包含与标准Android项目相同类型的源代码和资源,并用相同的方式存储。例如,库项目的源代码能够通过它的R类来访问自身的资源。

然而,库项目与标准的Android应用项目的不同点在于您不能将其直接编译为.apk文件或在Android平台运行它们。同样,您不能像真正的库那样将库项目导出为自包含的JAR文件。相反,你必须间接编译相关应用的构建路径中所引用的库,然后构建应用。

当您依赖一个库项目来构建应用时,SDK工具编译这些库,并将其源代码合并到主项目中,然后再生成.apk文件。一个资源ID同时在应用和库中被定义,工具确保在应用中声明的资源获得优先权,不会将库项目中的资源编译到应用的.apk文件。这给了应用程序灵活性,是使用还是重新定义任何库中任何资源的行为或值。

要进一步组织代码,您的应用可以增加多个库项目的引用,然后指定每个库中资源的相对优先级。这让您采用累积的方式,在应用中建立起实际使用的资源。当一个应用引用定义了相同资源ID的两个库,这些工具会从库中选择较高优先级的资源,并放弃另一个。

一旦您加入了引用,这些工具会让您编辑应用项目的构建参数来设置它们的相对优先级。在构建时,这些工具按照优先级从低到高,将库一个一个地与应用合并。

请注意,库项目本身不能引用其它库项目,并且在构建时,在没有和应用合并之前,库项目之间不能彼此合并。不过,请注意,库项目能够使用正常的方式来导入一个外部库(JAR)。

下面的章节将描述如何使用ADT来建立和管理您的项目库。一旦您建立了库项目,并向它们移入了源代码,您就能够使用正常的方式向应用导入库的类和资源。

开发需求

Android库项目是一个构建时结构,因此,您能利用它们构建基于任何API级别的最终应用.apk,并能与Android库的任何版本一起编译。

不过,要使用库项目,您需要将开发环境升级到最新的工具和平台,因为老版本的工具和平台不支持库项目构建。具体来说,就是你需要下载和安装下列版本。

表格1.开发库项目所需基于的SDK工具和平台的最低版本。
组件
最低版本
SDK Tools
r6 (or higher)
Android 2.2 platform
r1 (or higher)
Android 2.1 platform
r2 (or higher)
Android 2.0.1 platform
not supported
Android 2.0 platform
not supported
Android 1.6 platform
r3 (or higher)
Android 1.5 platform
r4 (or higher)
ADT Plugin
0.9.7 (or higher)
您能够使用Android SDK andAVD Manager来下载这些工具和平台,详细说明见Adding SDKComponents

建立一个新的库项目

库项目是一个标准的Android工程,因此,你可以像创建新应用一样创建一个库项目。具体来说,你能够使用android工具来生成新的库项目所必要的文件和目录。

创建库项目

要创建一个新的库项目,定位到SDK下的<sdk>/tools/目录,并运行命令:

android create lib-project --name <your_project_name>\
--target <target_ID> \
--path path/to/your/project \
--package <your_library_package_namespace>

create lib-project命令创建一个标准的项目结构,其中包含了向构建系统指明为库项目的预置属性。这通过在项目文件default.properties中增加此行来实现:

android.library=true

一旦命令完成,就建立了库项目,然后您可以将源代码和资源移到项目中,这在下面的章节中介绍。

如果您想将现有的应用项目转换为库项目,以让其它的应用来使用它,您可以通过向应用文件default.properties中加入android.library=true属性来实现。

创建清单文件

就像标准的Android应用一样,库项目的清单文件必须声明其所包含的所有共享组件。更多信息,请阅读AndroidManifest.xml

例如,库项目例子TicTacToeLib声明了Activity——GameActivity:

<manifest>

...

<application>

...

<activity android:name="GameActivity" />

...

</application>

</manifest>

更新库项目

如果您要更新库项目的构建属性(构建目标、位置),使用下面的命令:

android update lib-project \

--target <target_ID> \

--path path/to/your/project

从应用中引用库项目

如果您正在开发一个应用,想包含库项目中的共享代码或资源,您只要简单地在应用项目的构建属性中加入库项目引用即可。

要加入库项目引用,定位到SDK下的<sdk>/tools/目录,并运行命令:

android update lib-project \

--target <target_ID> \

--path path/to/your/project

--library path/to/library_projectA

这个命名更新应用项目的构建属性,使之包含库项目引用。具体来说,它向项目文件default.properties中,增加了一个android.library.reference.n属性。例如:

android.library.reference.1=path/to/library_projectA

如果你加入了多个库引用,要注意,您能够手工设置他们的相对优先级(和合并顺序),这通过编辑default.properties文件,将每个引用的.n索引调整适当。例如,假设有这些引用:

android.library.reference.1=path/to/library_projectA
android.library.reference.2=path/to/library_projectB
android.library.reference.3=path/to/library_projectC

您能使用下面的方法,将library_projectC设置为最高优先级:

android.library.reference.2=path/to/library_projectA
android.library.reference.3=path/to/library_projectB
android.library.reference.1=path/to/library_projectC

注意,引用的.n索引必须从1开始,而且要连续递增不能“留空”(不能跳过)。留空索引后面的引用将被忽略。

在构建时,应用每次合并一个库,优先级从低到高。注意,库自身不能引用其它的库,并且在构建时,库在与应用合并之前不能互相合并。

在清单文件中声明库组件

在应用项目的清单文件中,你必须加入应用使用、从库项目输出的所有组件的声明。例如,你必须声明全部的<activity>,<service>,<receiver>,<provider>等等,及<permission>,<uses-library>,和类似的元素。

必须通过它们的包全名来声明引用的库组件。

例如,库项目例子TicTacToeLib声明了Activity——GameActivity,像这样:

<manifest>

...

<application>

...

<activity android:name="com.example.android.tictactoe.library.GameActivity" />

...

</application>

</manifest>

关于清单文件的更多信息,请参阅文档AndroidManifest.xml

构建关联应用

要构建依赖一个或多个库项目的应用工程,你可以使用标准的Ant构建命令和编译模式,详见本文的构建应用一节。这个工具编译和合并应用中所引用的全部库,并将其作为编译关联应用工程的一部分。而不需要额外的命令或步骤。

开发建议

当您开发库项目和相关应用时,请要记住以下几点:

资源冲突

既然工具能够合并库项目及其关联应用的资源,那么,指定的资源ID就能在两个项目中被定义。在这种情况下,工具将会从应用,或库中选择最高优先级的资源,而丢弃其它资源。当您开发应用时,要知道,通用的资源ID可能会在多个项目中定义,并且会与来自应用或获取优先权的最高优先级库的资源合并。

使用前缀避免资源冲突

要避免通用资源ID的资源冲突,可以考虑使用一个其它前缀或其它对于一致的命名方案,该命名方案对于项目来说是独一无二的(或在所有项目中独一无二)。

库项目无法输出JAR

库不能发布二进制文件(例如jar文件)。这是因为主项目需要使用正确的资源ID来编译库项目。

库项目包含JAR库

您能开发一个自身包含JAR库的库项目。当您构建关联的应用项目时,工具在应用的.apk中自动定位并包含库。

库项目能够依赖外部JAR库

您能够开发一个依赖外部库(例如,地图外部库)的库项目。在这种情况下,相关的应用必须构建与外部库一致的目标(例如,GOOGLE的API插件)。也要注意,库项目和相关应用都必须在它们的清单文件的<uses-library元素中声明外部库。

库项目不能包含原始asset

工具不支持在库项目中使用原始asset文件。应用所使用的任何asset资源必须保存在应用项目自身的assets/目录下。

库项目和应用项目应用了不同的Adnroid平台版本

库会被编译为关联应用项目的一部分,因此,库项目所使用的API必须与编译应用项目所使用的Android库版本兼容。通常,库项目应该与应用所使用的API 级别相同或低一些。如果库项目使用的API级别比应用高,应用项目将会编译失败。例如,使用Android 1.5
API(API级别为3)的库就能够被完全接受的,它能用于Android 1.6(API级别为4)或Android 2.1(API级别为7)的项目。

库包的名称没有限制

库的包名字与使用该库的应用名字没有一致性的要求。

应用项目的gen/ folder中的多个R类

当您构建关联应用项目时,所有库的代码都被编译,并且合并到应用项目。每个库都有自己的R类,其名称遵循库的包名字。从主项目和库中所生成的R类,被创建在所有包含主项目包和库包的包中。

测试库项目

测试库项目中的代码和资源有两种推荐的方法:

· 您可以建立一个test project,来测试依赖库项目的应用项目。然后,您可以添加针对该库特定功能的测试到该项目中。

· 您可以建立一个依赖于库的标准应用项目,并加入测试工具。这能够让您建立自包含项目,同时包含了用于测试的测试/测试工具和代码。

库项目的存储位置

库项目的存储位置是没有明确的要求,对于关联的应用项目,只要应用项目能够通过相对链接引用到库项目即可。放置库项目最重要的是,主项目能够通过相对链接引用到库项目。

为应用连接调试器

本节描述如何在屏幕上(如CPU利用率)显示调试信息,及如何将您的IDE与模拟器上调试运行的应用连接起来。

使用Eclispse插件会自动连接一个调试器,但是您可以配置其它的IDE监听调试端口来接收调试信息。

1. 启动Dalvik DebugMonitor Server (DDMS)工具, 它充当IDE和模拟器之间的端口转发服务。

2. 在模拟器上设置可选的调试配置,如阻止应用程序的启动活动,直到连接了调试器。请注意,很多调试选项没有DDMS也可使用,如在模拟器上显示的CPU使用率或屏幕刷新率。

3. 配置IDE连接到8700端口来调试。阅读Configuring YourIDE to Attach to the Debugging Port

原文地址:http://blog.csdn.net/srfx465454/article/details/7024407
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: