使用库项目开发

库项目示例代码

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>
    ...
    <activityandroid: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

posted @ 2014-10-10 09:32  kobe8  Views(276)  Comments(0Edit  收藏  举报