原文地址:https://developer.android.com/studio/projects/android-library.html
一个Android Library 与一个Android App模块的结构相同.它可以包含创建一个App所需要的一切,包括源代码,资源文件,和一个Android manifest.然而不同的是,一个app编译成一个运行在设备上的APK, 一个Android Library编译成一个Android Archive (AAR),作为Android App模块依赖.
一个Library模块在下面情况下有用:
1. 当你创建多个APP时,用到一些相同的组件,如activities, sevices或者UI layouts.
2. 当你创建的一个APP存在多个APK版本,例如一个免费的和付费的版本,都需要相同的核心组件.
在这些情况下,简单地移动你想再利用的文件到一个Library模块,然后添加这个library作为App模块的依赖.这篇文章教你怎样做:
创建一个Library模块
1. 点击File > New > New Module.
2.在Create New Module窗口中,点击Android Library,然后点击Next.
创建一个Java Library, 它构建了一个传统的JAR文件. 一个JAR文件对许多工程有用,特别当你想在不同的平台分享代码,它不让你刽子手Android资源和manifest文件,这个对Android工程中的代码复用非常有用.所以这个引导注重创建Android Libraries.
3. 给你的Library命名并选择一个最小的SDK版本, 然后点击Finish.
一旦Gradle 工程同步完成, library模块将出现在左边的工程面板中.如果你不想看到新的模块文件,确保它在显示Android view.
将App模块转换成Library模块
1.打开一个存在的App模块的build.gradle文件,在文件的上面,你可以看到:
apply plugin:'com.android.application'
2. 改变如下:
apply plugin:'com.android.library'
3. 点击Sync Project with Gradle Files.
这样就好了.这个模块的整个结构保持相同, 但它现在作为一个Android library, 编译将会创建一个AAR文件而不是一个APK文件.
添加你的Library作为一个依赖
将你的Android Library代码用到另外一个App模块,过程如下:
1. 将Library添加到工程有2种方法(如果Library模块在同一个工程中,你可以跳过这步)
方法1: 添加编译的AAR(或者JAR)文件:
点击File > New Module.
点击Import .JAR/.AAR Package, 然后点击Next.
写入AAR或者JAR文件的位置,然后点击Finish.
方法2: 工程中导入Library模块
点击File > New > Import Module.
写入Library模块文件的位置,然后点击Finish.
Library模块已经挎入到你的工程, 你能够编辑Library的代码.如果你相保持Library代码一个版本,那么这个可能不是你想要的,你应该导入编译好的AAR文件.
2. 确保你的Library列在settings.gradle文件的上面.如这儿如示,一个Library名字为 "my-library-module":
include':app',':my-library-module'
3. 打开app模块的build.gradle文件, 在dependencies中添加:
dependencies{
compile project(":my-library-module")
}
4. 点击Sync Project with Gradle Files.
在上面的这个例子中,Android library模块命名为my-library-module,成为了build.gradle文件所在模块的依赖.
现在可以在你的App模块中获得任何Android library的代码和资源, 在编译的时候AAR文件绑定到你的APK.
然而,如果你想单独地分享你的AAR文件,你能在project-name/module-name/build/outputs/aar/找到它, 你可以重新产生它通过点击Build > Make Project.
开发考虑
当你开发你的library模块和依赖的App,你应该意识到下面这些行为和限制:
一旦你将library模块引用到你的Android app模块,你能设置它们相关的优先权.在创建的时候,library同时与App的内容合并,开始从最低优先级到最高.
1. 资源合并冲突
构建工具从一个library模块和这些依赖的app模块中合并资源.如果给定的资源ID在这两个模块中定义, app的资源将会被利用.
如果冲突发生在多个AAR library中,则使用从依赖列表中先列出的library的资源.
为了避免相同ID资源的冲突,考虑用一个前缀或者其它一致的命名方案,该方案是唯一的模块(或者在所有项目中是唯一的)
2.一个library模块可以包含一个JAR library
你可以开发一个library模块它自身包含一个JAR library; 然而,你需要手动编辑相关的应用模块的构建路径,并添加到JAR文件的路径。
3. 一个library模块可以依赖一个外部的JAR library
你可以开发一个library模块依赖一个外部library.(例如, Maps外部library).这种情况下,依赖应用程序必须建立针对外部library的目标(例如,Google APIs Add-On). library模块和依赖的app必须在它们的manifest文件中声明外部library, 在<uses-library>元素中.
4. library模块不能包括原始的assets
这些工具在library模块中不支持原始的asset文件的用法(保存在assets/文件夹中).任何asset资源都被一个app存储在自己模块的assets/文件夹中.
5. app模块的最小sdk版本必须等于或者大于library中定义的版本.
一个library作为依赖的app模块的一部分被编译, 所以library模块所用的APIs必须和app模块所支持的平台版本相匹配.
6.每个library模块创建它自己的R类
当你创建一个依赖的app模块, library模块被编译成一个AAR文件然后添加到app模块.因此,每个library有它自己的R类,通过library的包名来命名.从主模块生成R类和需要包括主模块包和libraries包的所有包所创建的library模块.
网友评论