返回

容器实现模块隔离-pins实战篇

Android

导读

近期正在探索如何使用 Pins 改善我们的安卓项目结构,在网络上也看到不少这方面的文章。但这些文章大多只是讨论了如何使用 Pins 来实现代码模块化,却没有深入探讨如何实现资源隔离。因此,在本文中,我将结合我们项目的实际情况,为大家详细介绍如何使用 Pins 来实现代码模块化和资源隔离,并探讨如何跨越模块进行调用和调试。

为什么需要模块化?

随着项目的不断迭代,复杂的业务模块及项目自身的基础技术组件迅速扩张,以往基于单个模块的项目往往显得过于臃肿。代码目录结构,包名混乱,代码模块职责不清晰,耦合度高,不便维护。基础公共组件没有抽取并剥离干净,新人上手较难,项目整体编译慢,等等。于是,近几年来,基于Gradle构建的多模块化项目如雨后春笋般涌现出来,成为了解决以上问题的银弹。

Gradle 的多模块化

Gradle的多模块化,其实就是把一个大的项目,拆分为多个小的子项目(module),每个子项目都可以独立地进行编译、打包和发布。子项目之间可以相互依赖,也可以相互引用。这样就可以大大降低项目的复杂度,提高项目的可维护性。

Pins 是什么?

Pins 是一款开源的 Gradle 插件,它可以帮助我们轻松地实现模块化和资源隔离。Pins 可以将一个 Android 项目拆分成多个子模块,并为每个子模块分配一个独立的资源目录。这样,子模块之间就可以相互隔离,互不影响。

如何使用 Pins 实现代码模块化?

接下来,我们就一起来看看如何使用 Pins 来实现代码模块化和资源隔离。

  1. 新建一个 Android Studio 项目

首先,我们需要新建一个 Android Studio 项目。在新建项目时,选择“Empty Activity”模板,然后点击“Next”。

  1. 添加 Pins 插件

在项目的 build.gradle 文件中,添加以下代码来添加 Pins 插件:

plugins {
    id 'com.google.android.pins' version '1.0.2'
}
  1. 将项目拆分成多个子模块

接下来,我们需要将项目拆分成多个子模块。在 Android Studio 中,右键点击项目名称,选择“New”>“Module”,然后选择“Android Library”模板。

  1. 配置子模块之间的依赖关系

在每个子模块的 build.gradle 文件中,我们需要配置子模块之间的依赖关系。例如,如果子模块 A 依赖于子模块 B,那么在子模块 Abuild.gradle 文件中添加以下代码:

dependencies {
    implementation project(':B')
}
  1. 运行项目

最后,我们可以运行项目来验证是否成功实现了代码模块化。点击 Android Studio 工具栏中的“Run”按钮,或者按 Ctrl+R,就可以运行项目了。

如何使用 Pins 实现资源隔离?

Pins 不仅可以实现代码模块化,还可以实现资源隔离。Pins 可以为每个子模块分配一个独立的资源目录,这样子模块之间就可以相互隔离,互不影响。

  1. 在每个子模块的 build.gradle 文件中,添加以下代码:
pins {
    resourceDirectories = ["src/main/res/${moduleName}"]
}
  1. 在每个子模块的 res 目录下,创建一个子目录,子目录的名称与子模块的名称相同。

  2. 将资源文件复制到子目录中。

例如,如果我们有一个名为 app 的子模块,那么我们在 app/res 目录下创建一个名为 app 的子目录,然后将 app 模块的资源文件复制到这个子目录中。

如何跨越模块进行调用和调试?

在实现代码模块化和资源隔离之后,我们还需要考虑如何跨越模块进行调用和调试。

调用

要跨越模块进行调用,我们可以使用以下两种方式:

  1. 使用 Gradle 的 provided 依赖项

我们可以使用 Gradle 的 provided 依赖项来跨越模块进行调用。provided 依赖项不会将依赖项的代码打包到 APK 中,但是可以在编译时和运行时使用依赖项的代码。

例如,如果我们想在子模块 A 中使用子模块 B 的代码,那么我们在子模块 Abuild.gradle 文件中添加以下代码:

dependencies {
    provided project(':B')
}
  1. 使用 Android Studio 的“Module Dependency”功能

我们也可以使用 Android Studio 的“Module Dependency”功能来跨越模块进行调用。在 Android Studio 中,右键点击子模块 A,选择“Open Module Settings”,然后在“Dependencies”选项卡中,点击“Add”按钮,选择子模块 B,然后点击“OK”按钮。

调试

要跨越模块进行调试,我们可以使用以下两种方式:

  1. 使用 Android Studio 的“Attach Debugger to Android Process”功能

我们可以使用 Android Studio 的“Attach Debugger to Android Process”功能来跨越模块进行调试。在 Android Studio 中,点击工具栏中的“Attach Debugger to Android Process”按钮,或者按 Ctrl+Alt+D,然后选择要调试的子模块,然后点击“Attach”按钮。

  1. 使用 Gradle 的 debugRuntimeClasspath 配置

我们也可以使用 Gradle 的 debugRuntimeClasspath 配置来跨越模块进行调试。在子模块 Abuild.gradle 文件中,添加以下代码:

debugRuntimeClasspath = files("$rootDir/B/build/intermediates/classes/debug")

这样,当我们调试子模块 A 时,就可以同时调试子模块 B 的代码了。

总结

在本文中,我们详细介绍了如何使用 Pins 来实现代码模块化和资源隔离,并探讨了如何跨越模块进行调用和调试。希望本文能够帮助大家更好地理解和使用 Pins。