Android Studio官方文档之如何创建一个Android第三方库
1、前言
一个Android库和一个Android应用程序模块的结构是一样的。它包含了需要构建一个应用程序的所有东西,包括源代码、资源文件和一个清单文件。然而,Android库编译成Android库(AAR)文件,并且你可以使用作为一个Android应用程序的模块依赖,而不是编译运行到设备上的APK文件。
在以下几种情况下,库文件是有用的:
- 当你构建多个应用程序时,含有一些相同的组件,例如Activities,Services,或者是UI布局。
- 当你构建一个app时存在多个APK的版本,例如有一个免费版和付费版本,那么你就需要将两者之间相同的部分分离成一个模块库。
在任何一种情况下,只需将要重用的文件移动到库模块中,然后将该库添加到每个应用程序模块的依赖项中。这里将教你如何提炼库文件。
2、创建一个第三方库模块(Create a Library Module)
在您的项目中创建一个新的库模块,进行如下:
(1)点击 File > New > New Module。
(2)在 Create New Module窗口出现后,点击Android Library,之后点击Next。
还有一个选项来创建一个java库,这个文件是一个传统的jar文件。虽然一个jar文件对许多项目是有用的——特别是当你想与其他平台共享代码——它不允许您包括Android资源或清单文件,这在Android项目中复用是非常有用的。因此这里主要指导如何创建Android库。
(3)给你的库命名并且为这个库选择一个最小的SDK,点击Finish。
一旦Gradle项目同步完成,在左侧的Project面板中会出现一个新的模块。如果你没有看到模块文件夹,确保正在展示的是Android视图(Android view)。
3、将一个app模块转换成一个第三方库模块(Convert an app module to a library module)
如果您有一个现有的应用程序模块,所有的代码都要重用,你可以把它变成如下一个库模块:
(1)打开已有的App模块中的build.gradle文件。在文件的顶部,你可以看到一下内容:
apply plugin: 'com.android.application'
(2)更改插件的值,如下所示:
apply plugin: 'com.android.library'
(3)点击Sync Project with Gradle Files。
就行了。模块的整个结构是相同的,但它现在作为一个Android库并编译成一个AAR文件而不是一个APK文件。
4、将您的库引用作为一个第三方库引用到项目(Add Your Library as a Dependency)
为了在另一个应用程序模块中使用您的Android库的代码,进行如下:
(1)可以选择两种方式中的一种来把Android库文件添加到你的工程中(如果你在同一个项目中创建了库模块,那么它已经在那里了,你可以跳过这一步)。
- 添加编译的AAR(或者JAR)文件:
1.点击 File > New Module。
2.点击Import .JAR/.AAR Package,然后点击Next。
3.输入AAR或者JAR文件的位置,之后点击Finish。 - 导入库文件到你的工程中:
1.点击File > New > Import Module。
2.输入库模块的位置,之后点击Finish。
将库模块复制到您的项目中,因此您可以实际地编辑库代码。如果要维护单个版本的库代码,这可能不是你想要的,你应该替换以上所述所编译的AAR文件。
(2)确保库被列在你的settings.gradle文件顶部,如图所示为一个名为“我的库模块”的库:
include ':app', ':my-library-module'
(3)打开app模块的build.gradle文件,添加一个新的线路的依赖块,如下面的代码段显示:
dependencies {
compile project(":my-library-module")
}
(4)点击Sync Project with Gradle Files。
在上面的这个例子中,命名为“my-library- module”的Android库模块成为其中build.gradle文件所在的模块构建的依赖。
您的应用程序模块可以访问Android库任何代码和资源,而在牲畜APK文件时会将AAR文件打包到APK文件中去。
然而,你想单独分享你的AAR文件,你可以在project-name/module-name/build/outputs/aar/找到这个文件,并且通过单击Build > Make Project可以重新生成它。
5、开发中的几点思考(Development Considerations)
当你开发你的库模块和依赖的应用程序时,要注意以下的行为和限制。
一旦你增加了对你的应用程序模块的库模块的引用,你可以设置他们的相对优先权。在构建时间,库与应用程序在一个时间合并,从最低优先级到最高。
- 资源的合并冲突
从库模块与依赖的应用程序模块的库模块中的资源合并资源。如果两个模块中定义了一个给定的资源标识,则使用来自应用程序的资源。
如果多个AAR库之间发生冲突,然后,使用依赖列表中列出的库中的资源(向依赖块的顶部)。
为了避免常见的资源标识的资源冲突,请考虑使用一个前缀或其他一致的命名方案,该方案是唯一的模块(或是在所有项目模块是唯一的)。
- 一个库模块可以包括一个jar库
你可以开发一个库模块,它本身包括一个库;然而,你需要手动编辑相关的应用程序模块的构建路径,并添加一个路径到jar文件中。
- 一个库模块可以依赖于一个外部的jar库
你可以开发一个依赖于外部库的库模块。(例如,地图外部库)。在这种情况下,依赖的应用程序必须构建一个包括外部库(例如,Google APIs Add-On)的目标。请注意,库模块和依赖程序都必须在它们的清单文件中声明外部库,在中。
- 库模块不能包括原始文件
该工具不支持使用库模块中原始资源文件(保存在assets/目录中)的使用。应用程序所使用的任何资源必须存储在应用程序模块本身的assets/目录中。
- 应用程序模块的minSdkVersion必须等于或大于由标准库定义的版本
作为依赖应用程序模块的一部分,一个库被编译为依赖的应用程序模块的一部分,所以在库模块中使用的应用程序模块必须与应用程序模块支持的平台版本兼容。
- 每个库模块创建自己的R类
当你建立相关的app模块,库模块被编译成一个AAR文件添加到应用程序模块。因此,每个库都有自己的R类,根据库的包名称命名。从主模块和库模块生成的R类是在所需要的所有包中创建的,包括主模块的包和库包。