(转)Library Module详解

来源:互联网 发布:淘宝一元抢手机 编辑:程序博客网 时间:2024/06/08 06:33

原地址:http://blog.csdn.net/p892848153/article/details/52124413


Create an Android Library

原文:https://developer.android.com/studio/projects/android-library.html

Android library的结构跟Android app module一样。它里面可以包含:源码,资源文件和Android manifest文件。不同的是Android Library会编译成Android Archive(AAR),也就是aar文件,而Android app会编译成APK文件。

以下情况Android Library很有用:

  • 你要开发多个app, 这些app需要共用一些组件,比如Actiivty, Services或者UI.
  • 你开发的app有多个版本,比如免费版和付费版,这两个版本之间的核心组件是一样。

这种情况下,你只要把需要共用的文件移到一个library module中,然后app module依赖这个library module就可以了。

Create a Library Module

创建一个Library module的流程如下:

  1. 点击 File > New > New Module
  2. Create New Module窗口,点击Android Library, 然后点击Next
    这里也有创建Java Library的选项,Java Library会编译成一个JAR文件。当你想在不同的平台之间共享代码的时候,Java Library非常有用。Java Library不能共享Android资源文件和manifest文件,只能共享代码。
  3. 给Library输入名字,选择一个最小支持的SDK版本,然后点击Finish.

Convert an app module to a library module

如果你有一个app module, 里面都是你想在不同module之间共享的代码,你可以将其转换成一个library module, 步骤如下:

  1. 打开app module的build.gradle文件,在顶部,你可以看到:

        apply plugin: 'com.android.application'
    • 1
    • 1
  2. 更改plugin的值为:

    apply plugin: 'com.android.library'
    • 1
    • 1
  3. 删除掉 applicationId这个配置,library module是没有applicationId,只有在manifest文件中有个package值表明包目录.

  4. 点击 Sync Project with Gradle Files.

注意library的manifest文件中,不能有android:icon,这会和引用它的app module中的manifest文件中的android:icon冲突。如果一定要在library的manifest中定义android:icon,那么就必须在app module的manifest文件的标签中添加 tools:replace=”android:icon”,这样app moduel定义的icon将会覆盖library定义的icon,从而解决冲突。

理论上,我们不应该在library中声明的activity中添加:

  <intent-filter>                <action android:name="android.intent.action.MAIN"/>                <category android:name="android.intent.category.LAUNCHER"/>  </intent-filter>  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

但是,就算我们添加了,也没事,功能一切正常,只不过在launcher上面会有两个icon。一个启动app module,一个启动library module。

Add Your Library as a Dependency

app module想要引用library module,流程如下:

  1. 有两种方法在项目增加library(如果app module和library module在同一个project中,可以忽略下面的步骤) :

    • 增加编译生成的AAR或者JAR文件: 
      1. 点击 File > New Module
      2. 点击Import .JAR/.AAR Package然后点击Next.
      3. 输入AAR或者JAR文件的路径,然后点击Finish.
    • 导入library module到你的project:

      1. 点击File > New > Import Module.
      2. 输入library module文件夹的路径,然后点击Finish.

      library module会被拷贝一份到你的project,你可以修改library的代码。如果你想让library的代码只有一个版本,那么这个方法就不适合你,你应该导入library module生成的AAR文件来引用library module。

  2. 确保library module在settings.gradle文件的顶部有声明,比如有一个library名字是”my-library-module”:

    include ':app', ':my-library-module'
    • 1
    • 1
  3. 打开app module的build.gradle文件,在dependencies块中增加下面的行:

    dependencies {    compile project(":my-library-module")}
    • 1
    • 2
    • 3
    • 1
    • 2
    • 3
  4. 点击Sync Project with Gradle Files.

app module现在可以使用library中的任何代码和资源,在编译的时候,有一个AAR文件会被打包进APK中。 
你可以在project-name/module-name/build/outputs/aar/文件下找到AAR文件,可以通过点击Build > Make Project来重新生成AAR文件。

Development Considerarions

关于引用library module的app module和被引用的library module,有几点需要注意. 
如果你的app module引用了多个library module, 你可以给这些library module排优先级。在编译的时候,这些library会按从优先级低到高来和app一次性合并。

  • 资源合并冲突 
    编译工具会把library module的资源和app module的资源合并起来。如果library module和app module中有相同的资源id,则app module中的会保留。

    如果是多个AAR library之间发生了这样的冲突,依赖library module的列表(dependencies块关于library module的声明)中最上面的library module的资源会被保留.

    为了避免资源冲突,可以考虑使用前缀或者其他的相对各个module都独一无二的命名体系。

  • library module可以引用JAR library

    library module可以引用JAR library。不过,你需要手动的编辑引用library module的app module的build path,在其中增加一个指向JAR文件的路径。

  • library module可以依赖一个external JAR library

    library module可以引用external library.(比如, Maps external library).依赖者app module也必须构建引用相同的external library.注意:library module和依赖者app module都必须在它们的manifest文件中使用uses- library来声明引用external library.

  • library module不能包含assets资源

    编译工具不支持在library modules中使用asset资源(存放在assets/ 文件下)。所有使用到的asset资源都必须存放在app module的assets/ 文件夹下。

  • app module的minSdkVersion必须大于等于library module的

    library module最后被编译成app module的一部分,所以app module使用的SDK版本必须包含library module使用的SDK版本中的所有API。

  • 每个library module都会创建它们自己的R

    当你编译app module时,library module都会被编译进一个AAR文件,然后将这个文件加入app module.因此,每个library都有它们自己的R类,按各自的包名命名。


原创粉丝点击