【问题标题】:How to create a library project in Android Studio and an application project that uses the library project如何在 Android Studio 中创建库项目和使用该库项目的应用程序项目
【发布时间】:2013-05-12 03:57:13
【问题描述】:

我是 gradle 构建系统和 IntelliJ 的新手。

那么我如何创建一个Android Library Project(例如com.myapp.lib1)和应用程序项目(例如com.myapp.app)并让构建系统在应用程序项目上包含com.myapp.lib1?

我去了项目结构 -> 模块 -> 我的应用项目,并在 lib 项目中添加了一个依赖项。 IntelliJ 现在可以在 app 项目中使用时识别 lib 项目中的类,但是当我运行 app 项目时,出现如下错误:

Gradle: error: package com.myapp.lib1 does not exist

【问题讨论】:

  • 我正在使用 Android 库来构建我的应用的免费/付费版本。新的 Gradle 构建系统使用 Build Variants 概念使这种方法过时。您现在可以使用相同的代码自动构建不同的签名 APK。我希望我早点知道这一点。
  • @theczechsensation——你能详细说明一下吗?上传完整版APK后,我尝试上传免费版APK,但使用相同的包名。 Google Play Store (GPS) 给我消息说我已经使用了那个包名。你所说的 gradle 是否意味着我不需要两个单独的包中的两个单独的应用程序?
  • 这是完美的答案stackoverflow.com/a/31366602/1118772。 Aqib Mumtaz 在答案中提到,但它是最后。与其在其他方式上浪费时间,你可以这样做。 philosophicalhacker.com/2014/10/02/…
  • 有趣的thread adding Libraries.有图文解说。

标签: android-studio


【解决方案1】:

不知道为什么没有独立jar项目的例子。

在 Eclipse 中,我们只需在项目设置对话框中选中“Is Library”框。
在 Android Studio 中,我按照这个步骤得到了一个 jar 文件。

  1. 创建一个项目。

  2. 在左侧项目菜单中打开文件。(app/build.gradle): Gradle Scripts > build.gradle(Module: XXX)

  3. 换一行:apply plugin: 'com.android.application' -> 'apply plugin: com.android.library'

  4. 删除文件中的applicationId:applicationId "com.mycompany.testproject"

  5. 构建项目:构建 > 重建项目

  6. 然后就可以得到aar文件了:app > build > outputs > aar文件夹

  7. aar文件扩展名改成zip

  8. 解压,可以在文件夹中看到classes.jar。 重命名并使用它!

无论如何,我不知道为什么 google 使 jar 创建在 android studio 中如此麻烦。

【讨论】:

  • 在 Android Studio 2.2.2 dec 上为我工作。 2016.
【解决方案2】:

创建一个库:

文件 > 新模块

选择 Android 库

要使用该库,请将其添加为依赖项:

文件 > 项目结构 > 模块 > 依赖项

然后将模块(android库)添加为模块依赖项。

运行您的项目。它工作。

【讨论】:

  • 这会在项目中创建模块的文件。如果您希望模块在项目外部以便与其他应用程序一起使用,该怎么办?
  • @rrbrambley:我找到了一种在多个项目中重用模块的方法。我使用名为 winbolic link for Windows 的应用程序创建了(NTFS Junction)文件夹链接。当我有一个想要在多个项目中重用的模块时,我会在每个项目的目录中创建一个指向要重用项目的文件夹链接,以在其中使用它。在此之后,我添加了模块依赖项(在 Andr. Studio 中)。现在我可以在每个项目中使用/编辑模块,同时保持同步。不确定这是否是正确的方法,但现在它似乎工作得很好!这比本地 maven repo 更有效。
  • 很遗憾,截至 2014 年 7 月,不再有屏幕中显示的项目设置。我必须按照下面 GrkEngineer 的回答编辑 .grade 文件。
  • 这应该被否决,因为这会从现有项目中创建一个模块
  • 如果您想在其他项目中使用相同的库,您必须将库模块复制到该项目并手动配置 settings.gradle 和主模块的 build.gradle。
【解决方案3】:

Google 的 Gradle Plugin 推荐的配置你的 gradle 文件以构建多个项目的方法有一些缺点如果你有多个项目依赖于一个库项目,这篇文章简要解释了 Google 的推荐配置,它的缺点,并推荐了一种不同的方式来配置你的gradle 文件以支持 Android Studio 中的多项目设置:

An alternative multiproject setup for android studio

另一种方式:

事实证明,在 Android Studio 中管理多个项目是一种更好的方法。诀窍是为您的库创建单独的 Android Studio 项目,并告诉 gradle 您的应用所依赖的库的模块位于库的项目目录中。如果您想在我上面描述的项目结构中使用此方法,您可以执行以下操作:

  1. 为 StickyListHeaders 库创建一个 Android Studio 项目
  2. 为 App2 创建一个 Android Studio 项目
  3. 为 App1 创建一个 Android Studio 项目
  4. 配置 App1 和 App2 以构建 StickyListHeaders 项目中的模块。

第 4 步是最难的部分,所以我将详细描述这一步。您可以通过在 settings.gradle 文件中添加项目语句并在该项目语句返回的 ProjectDescriptor 对象上设置 projectDir 属性来引用项目目录外部的模块:

代码一必须输入settings.gradle:

include ':library1'
project(':library1').projectDir = new File('../StickyListHeader/library1')

如果您正确完成了此操作,您会注意到项目引用的模块将显示在项目导航器中,即使这些模块位于项目目录之外:

这使您可以同时处理库代码和应用程​​序代码。当您以这种方式在外部引用模块时,版本控制集成也可以正常工作。您可以提交修改并将其推送到库代码,就像您可以提交修改并将修改推送到应用代码一样。

这种设置多个项目的方式避免了困扰 Google 推荐配置的困难。因为我们引用了项目目录之外的模块,所以我们不必为依赖它的每个应用程序制作库模块的额外副本,并且我们可以对库进行版本控制,而无需任何 git submodule 废话。

不幸的是,这种设置多个项目的其他方式很难找到。显然,这不是您通过查看 Google 的指南就能弄明白的,而且目前还没有办法使用 Android Studio 的 UI 以这种方式配置您的项目。

【讨论】:

  • 这是完美的答案。谢谢。
  • 很好的答案,但您应该将帖子中的相关部分复制到您的答案中,以防链接中断。
  • 注意: 对于 gradle 中的字符串评估,您必须使用双引号 (")。这对我来说是“节省一天”。链接到 this
  • 我们如何从app代码中引用库代码?按照您的设置说明进行操作后,应用代码仍然无法引用库代码中的包。是否需要执行额外的步骤?
  • @CEGRD 您需要转到文件 > 项目结构并单击您正在处理的模块的名称。然后转到依赖项选项卡>单击下拉菜单中的“+”,然后单击“模块依赖项”。然后您应该能够将 library1 模块添加到您当前的项目中。
【解决方案4】:

看看这个link about multi project setups

需要指出的一些事情,请确保您已更新 settings.gradle 以引用应用程序和库模块。

settings.gradle:include ':app', ':libraries:lib1', ':libraries:lib2'

还要确保应用的 build.gradle 具有以下内容:

dependencies {
     compile project(':libraries:lib1')
}

您应该具有以下结构:

 MyProject/
  | settings.gradle
  + app/
    | build.gradle
  + libraries/
    + lib1/
       | build.gradle
    + lib2/
       | build.gradle

应用的 build.gradle 应使用 com.android.application 插件,而任何库的 build.gradle 应使用 com.android.library 插件。

如果您能够使用此设置从命令行构建,Android Studio IDE 应该会更新。

【讨论】:

  • build.gradle 中定义的插件是唯一的区别吗?即,您可以通过更改这一行将现有模块更改为 Android 库吗?
  • 有一天,我们将单击一个导入按钮,该库将正常工作,然后我们将开始在编辑器中输入代码。
  • 这种方法似乎将库包含在实际项目中。 OP 想要知道如何创建一个单独的 Android 库项目,该项目位于自己的项目/空间中,并且仅作为 lib 包含在主应用程序项目中
  • @SteveM 这一直是我整个职业生涯的问题。我只是在没有任何设计的情况下开始编码。然后花几个小时调试和重构。
【解决方案5】:

对于 Intellij IDEA(和 Android Studio),每个库都是一个模块。将 Android Studio 中的模块视为等同于 Eclipse 中的项目。 Android Studio 中的项目是模块的集合。模块可以是可运行的应用程序或库模块。

因此,为了向您添加一个新的 android 库项目,您需要创建一个“Android 库”类型的模块。然后将此库模块添加到您的主模块(应用程序模块)的依赖列表中。

【讨论】:

    【解决方案6】:

    创建重用库项目的最简单方法:

    1. 在一个打开的项目上file > new > new module(并回答 UI 问题)

    1. settings.gradle文件中检查/或添加if:include ':myLibrary'
    2. build.gradle文件中检查/或添加if:

      dependencies { ... compile project(':myLibrary') }

    3. 要在另一个项目中重用此库模块,请将其文件夹复制到项目中而不是步骤 1,然后执行步骤 2 和 3。

    您也可以新建一个工作室应用项目 通过将 build.gradle 文件中的插件分配更改为 com.android.library,您可以轻松地将现有应用程序模块更改为库模块。

    apply plugin: 'com.android.application'
    
    android {...}
    

    apply plugin: 'com.android.library'
    
    android {...}
    

    更多here

    【讨论】:

    • 如果您通过更改插件分配将现有应用程序模块更改为库模块,您还必须从 gradle 文件中删除行 `applicationId "com...."。跨度>
    • "警告:配置 'compile' 已过时,已替换为 'implementation' 和 'api'。"
    【解决方案7】:

    您可以像 Blundell 在他的回答中所说的那样向任何应用程序添加新模块,然后从任何其他应用程序中引用它。

    如果您想将模块移动到计算机上的任何位置,只需移动模块文件夹(模块是完全独立的),那么您必须引用该模块。

    要引用此模块,您应该:

    • 在应用的 build.gradle 文件中添加:

      dependencies {
      ...
      compile project(':myandroidlib')
      }
      
    • 在 settings.gradle 文件中添加以下内容:

       include ':app', ':myandroidlib'
       project(':myandroidlib').projectDir = new File(PATH_TO_YOUR_MODULE)
      

    【讨论】:

    • 例如project(':library').projectDir = new File('../library'),其中library是与android项目文件夹并行的文件夹名称。
    【解决方案8】:

    不要忘记在你的build.gradle 中使用apply plugin: 'com.android.library' 而不是应用插件:'com.android.application'

    【讨论】:

      【解决方案9】:

      Documentation Way

      根据 Android Studio 文档中的建议,这是推荐的方式。

      Create a library module

      创建一个新项目来制作您的库。单击文件 > 新建 > 新模块 > Android 库 > 下一步 >(选择名称)> 完成。然后将您想要的任何类和资源添加到您的库中。

      当您构建模块时,将创建一个 AAR 文件。你可以在project-name/module-name/build/outputs/aar/找到它。

      Add your library as a dependency

      您可以像这样将您的库作为依赖项添加到另一个项目中:

      1. 使用文件>新建模块>导入.JAR/.AAR包>下一步>(选择文件位置)>完成导入您的库AAR文件。 (不要导入代码,否则会在太多地方可编辑。)
      2. 在 settings.gradle 文件中,确保您的库名称在那里。

        include ':app', ':my-library-module'
        
      3. 在应用程序的 build.gradle 文件中,将编译行添加到依赖项部分:

        dependencies {
            compile project(":my-library-module")
        }
        
      4. 系统将提示您将项目与 gradle 同步。去做吧。

      就是这样。您现在应该可以使用您的库了。

      注意事项

      如果您想让更多的观众轻松访问您的库,请consider using JitPac or JCenter

      【讨论】:

        【解决方案10】:

        有同样的问题并通过以下方式解决:

        开始情况

        FrigoShare (root)
        |-Modules:    frigoshare,   frigoShare-backend
        

        目标:想要添加一个名为dataformats的模块

        1. 添加新模块(例如:Java Library
        2. 确保您的settings.gradle 看起来像这样(通常是自动的):

          include ':frigoshare', ':frigoShare-backend', ':dataformats'

        3. 确保(手动)需要使用您的库的模块的build.gradle 文件具有以下依赖关系:

          dependencies { ... compile project(':dataformats') }

        【讨论】:

          【解决方案11】:

          目的:单一位置的 Android 库 - 跨多个项目共享 http://raevilman.blogspot.com/2016/02/android-library-project-using-android.html

          【讨论】:

            【解决方案12】:

            正如上面的 czechsensation 评论,我尝试搜索 Gradle Build Varians 并找到了这个链接:http://code.tutsplus.com/tutorials/using-gradle-build-variants--cms-25005 这是一个非常简单的解决方案。这就是我所做的: - 在 build.gradle 中:

            flavorDimensions "version"
            
            productFlavors {
                trial{
                    applicationId "org.de_studio.recentappswitcher.trial"
                    flavorDimension "version"
                }
                pro{
                    applicationId "org.de_studio.recentappswitcher.pro"
                    flavorDimension "version"
                }
            
            }
            

            然后我的应用程序还有 2 个版本:专业版和试用版,其中包含 2 个不同的 packageName,即上面代码中的 2 个 applicationId,因此我可以将两者都上传到 Google Play。我仍然只是在“主要”部分编码并使用 getpackageName 在版本之间切换。请转到我提供的链接了解详细信息。

            【讨论】:

              【解决方案13】:

              有两种最简单的方法,如果一种不起作用,请尝试另一种。

              1. 在您使用的库的 build.gradle 文件中添加库的依赖项,并将您的库粘贴到外部库中。

              1. 只需转到 app 文件夹中的 libs 文件夹,然后将所有 .jar 例如库文件粘贴到那里 现在这里的技巧是现在进入 settings.gradle 文件现在在“之后”添加这一行“include ':app:libs'”包括 ':app'" 它肯定会工作............:)

              【讨论】:

                【解决方案14】:

                在我的例子中,使用 MAC OS X 10.11 和 Android 2.0,并且完全按照 Aqib Mumtaz 的解释进行操作。

                但是,每次,我都会收到以下消息:“配置项目 ':app' 时出现问题。> 无法评估模块 xxx:找不到名称为 'default' 的配置。”

                我发现这个消息的原因是 Android 2.0 不允许直接创建库。因此,我决定先创建一个应用程序项目,然后修改 build.gradle 以将其转换为库。

                此解决方案不起作用,因为库项目与应用项目非常不同。

                所以,我已经这样解决了我的问题:

                • 首先创建一个标准应用(如果需要);
                • 然后选择“文件/创建模块”
                • 转到查找器并移动框架目录中新创建的模块的文件夹

                然后继续 Aqib Mumtaz 提出的解决方案。

                因此,您的库源将被共享,而无需每次都复制源文件(这对我来说是异端!)

                希望对你有所帮助。

                【讨论】:

                  猜你喜欢
                  • 2015-11-10
                  • 2016-12-26
                  • 1970-01-01
                  • 2015-01-31
                  • 1970-01-01
                  • 2013-12-21
                  • 1970-01-01
                  • 1970-01-01
                  • 2016-03-01
                  相关资源
                  最近更新 更多