如何配置 gradle 以工作 "offline"(使用缓存的依赖项)

How to configure gradle to work "offline" (using cached dependencies)

我有一个命令行 apk 生成器,它使用相同的源代码编译很多 APK,因此这些应用具有相同的依赖关系。

在 gradle 文档中我可以看到:

The Gradle project needs network connectivity to download dependencies.

我知道可以将 gradle 配置为离线工作,而不是下载它为其他 apk 下载的相同依赖项。这个离线模式怎么激活?

Gradle 在避免重新下载工件方面做得很好,但您可以将 --offline 传递给 Gradle 以防止在构建期间访问网络。

例如

gradle --offline build

如果它需要来自网络但它没有的东西,而不是尝试获取它,您的构建将会失败。

Android工作室

在 Android Studio 中,您可以 gradle 通过激活此选项完全离线构建您的应用程序:

Settings -> Build, Execution, Deployment -> Build tools -> Gradle


Gradle CLI

在 Gradle 命令行界面中,您可以使用 --offline 标志来完成此操作。

Specifies that the build should operate without accessing network resources.

Android Studio(3.6.1 及以上版本)

您可以 gradle 通过激活此选项完全离线构建您的应用程序:

这是来自 Android Studio Gradle 工具栏

的屏幕截图

Gradle 离线构建(从缓存或本地仓库快速构建)(Android Studio v3.0+)

配置离线构建依赖(gradle + maven)

Important Note: The library or android gradle plugin version which is not present in offline repo then it will download from remote.

如果您想在没有网络连接的情况下构建项目,请按照 以下步骤配置 IDE 以使用 Android Gradle 的离线版本 插件和 Google Maven 依赖项。

如果您还没有这样做,download the offline components 来自 下载页面。

下载并解压离线组件

下载离线组件后,将其内容解压到 以下目录,如果尚不存在,您可能需要创建该目录:

  1. 在 Windows 上:%USER_HOME%/.android/manual-offline-m2/
  2. 在 macOS 和 Linux 上:~/.android/manual-offline-m2/

要更新离线组件,请执行以下操作:

  1. 删除manual-offline-m2/目录中的内容。
  2. 重新下载offline components
  3. 将您下载的 ZIP 文件的内容解压缩到 <code>manual-offline-m2/ 目录。

在您的 Gradle 项目中包含离线组件

告诉 Android 构建系统使用您下载的离线组件 并解压缩,您需要创建一个脚本,如下所述。记住,你 只需创建并保存此脚本一次,即使在更新您的离线后也是如此 组件。

  1. 使用以下路径和文件名创建一个空文本文件:

    在 Windows 上:%USER_HOME%/.gradle/init.d/offline.gradle

    在 macOS 和 Linux 上:~/.gradle/init.d/offline.gradle

  2. 打开文本文件并包含以下脚本:

    def reposDir = new File(System.properties['user.home'], ".android/manual-offline-m2")
    def repos = new ArrayList()
    reposDir.eachDir {repos.add(it) }
    repos.sort()
    allprojects {
      buildscript {
        repositories {
              for (repo in repos) {
                    maven {
                    name = "injected_offline_${repo.name}"
                    url = repo.toURI().toURL()
                          }
          }
        }
      }
      repositories {
        for (repo in repos) {
          maven {
            name = "injected_offline_${repo.name}"
            url = repo.toURI().toURL()
          }
        }
      }
    }
    
  3. 保存文本文件。

  4. (可选)如果您想验证离线组件是否正常工作 有意地,从您的项目 build.gradle 中删除在线存储库 文件,如下图。在您确认您的项目构建正确之后 如果没有这些存储库,您可以将它们放回 build.gradle 文件。

    buildscript {
        repositories {
    // Hide these repositories to test your build against
    // the offline components. You can include them again after
    // you&#39;ve confirmed that your project builds ‘offline’.
    // google()
    // jcenter()
        }
        ...
    }
    allprojects {
        repositories {
            // google()
            // jcenter()
        }
        ...
    }
    

注意:此脚本适用于您在工作站上打开的所有 Gradle 个项目。

来源:https://developer.android.com/studio/intro/studio-config#offline

  • 从上述文档下载 Gradle 插件和 Maven 并进行设置
  • 如果出现任何问题,请按照我在下面 Whosebug 中的解决方案进行操作 link


我试过这种方法在离线模式下构建。

  1. 我已经复制了 gradle 分发 ZIP 并将其保存在本地。
  2. 编辑 gradle-wrapper.properties 使“distributionUrl”指向本地文件
  3. 当我尝试在 linux "./gradlew --offline build" 中执行构建命令时,它抛出错误:
A problem occurred configuring project ':MyApp'.
> Could not resolve all artifacts for configuration ':MyApp:classpath'.
   > Could not resolve com.android.tools.build:gradle:4.1.1
     Required by:
         project :MyApp
      > No cached version of com.android.tools.build:gradle:4.1.1 available for offline mode

要建立在 的基础上,值得注意的是,如果您像我一样有一个 AAR 和一个 .pom 文件以及一些来自 Google 的任何文档,则过程上面的链接答案还需要几个步骤:

  1. 在 ~/.android/manual-offline-m2 下创建一个目录,作为您的本地存储库,例如my_local_deps
  2. 在您的本地 repo 文件夹下创建一个或多个目录以将工件组名称表示为手动嵌套的文件夹(例如 com/my/thing 而不是一个名为 com.my.thing 的文件夹)
  3. 创建一个文件夹,其名称与工件的模块名称或工件 ID 相匹配,例如mylib
  4. 在上一步的模块文件夹下创建一个文件夹作为版本说明符,例如一个名为 1.2.3
  5. 的文件夹
  6. 将您的 AAR 和 pom 文件放在上一步的版本文件夹下

最终结果应该类似于 ~/.android/manual-offline-m2/com/my/thing/mylib/1.2.3/mylib-1.2.3.aar 和 mylib-1.2.3.pom 对于在 Gradle 中被称为“实现 'com.my.thing:mylib:1.2.3'”的工件

现在,当您重新 运行 Gradle 并且它 运行 是链接答案中的 offline.gradle 脚本时,它应该会获取您的离线工件。容易,对吧?嗯