Android Studio 动态加载库
Android Studio dynamically loaded library
我有一个 Android 应用程序,它使用 DexClassLoader
动态加载库。到目前为止,应用程序和库是在不同的项目中开发的。我想将项目合并为一个项目(一个项目中有两个模块?)但我不确定如何使用 Android Studio/Gradle 来实现它。请注意,我不想在应用程序和库之间添加静态依赖项。我想要达到的结果是:
- 应用程序和库都在同一个项目中。
- 应用程序和库的构建可能分为两个独立的步骤(但一个步骤可能很好 :D )。
- 编译后的库最终必须是应用程序的资产,并捆绑在生成的 APK 中;即,不是静态编译到应用程序中,而是作为 APK 中的独立文件。
有什么想法吗?
如果您想将模块引入项目,可以在项目中编辑文件 settings.gradle
以包含模块并提供其路径。
include ':app' //your project module name
include ':library' //your imported module name
project(':library').projectDir = new File("/<path_to_module_library>/other_project/library")
然后该模块将出现在您的项目中。
如果您转到项目 gradle 文件(例如:build.gradle),您现在可以将模块作为项目依赖项包含在内。
dependencies {
...
compile project(':library')
...
}
编辑
如果您只想自动将您的 jar 从您的库复制到您项目的资产文件夹,您可以简单地在您的库 build.gradle 中定义一个 gradle task,例如:
task copyTask(type: Sync) {
from '/<path_to_your_jar>/classes.jar'
into '/<path_to_your_project>/app/assets/'
}
这会将您的 jar 复制到您的资产文件夹。
要在编译代码时使用它,可以将此任务添加到 Run/Debug 配置中。
小米的回答给出了很好的方向,但最终的解决方案有些不同。
解决方案概述
该项目将包含两个模块:一个用于应用程序,一个用于库。应用程序模块将依赖于库,因此库将在应用程序之前构建。当 JAR 文件准备好后,它将被转换为 DEX 并复制到应用程序的资产库中。应用程序的构建 activity 会自动将资产文件夹捆绑在最终的 APK 中。
分步解决方案
如果不存在,请将库模块包含在项目设置文件中 settings.gradle
:
include ':app', ':libmynewlibrary'
在app
模块的build.gradle
添加依赖:
dependencies {
...
compile project(':libmynewlibrary')
}
现在是棘手的部分。我们希望在创建 JAR 后立即添加自定义操作。幸运的是 Android Gradle 插件有一个预定义的任务 "jar" - 它显然构建了 JAR。我们将在 lib 的 build.gradle
中添加一些内容。请注意,该任务是隐式的,根本不在 gradle 文件中。我们只是通过添加 doLast
来扩展它:
jar {
doLast {
exec {
executable "dx"
args "--verbose", "--dex", "--output=../app/src/main/assets/mynewlib.dex", "build/libs/libmynewlib.jar"
}
}
}
我有一个 Android 应用程序,它使用 DexClassLoader
动态加载库。到目前为止,应用程序和库是在不同的项目中开发的。我想将项目合并为一个项目(一个项目中有两个模块?)但我不确定如何使用 Android Studio/Gradle 来实现它。请注意,我不想在应用程序和库之间添加静态依赖项。我想要达到的结果是:
- 应用程序和库都在同一个项目中。
- 应用程序和库的构建可能分为两个独立的步骤(但一个步骤可能很好 :D )。
- 编译后的库最终必须是应用程序的资产,并捆绑在生成的 APK 中;即,不是静态编译到应用程序中,而是作为 APK 中的独立文件。
有什么想法吗?
如果您想将模块引入项目,可以在项目中编辑文件 settings.gradle
以包含模块并提供其路径。
include ':app' //your project module name
include ':library' //your imported module name
project(':library').projectDir = new File("/<path_to_module_library>/other_project/library")
然后该模块将出现在您的项目中。
如果您转到项目 gradle 文件(例如:build.gradle),您现在可以将模块作为项目依赖项包含在内。
dependencies {
...
compile project(':library')
...
}
编辑
如果您只想自动将您的 jar 从您的库复制到您项目的资产文件夹,您可以简单地在您的库 build.gradle 中定义一个 gradle task,例如:
task copyTask(type: Sync) {
from '/<path_to_your_jar>/classes.jar'
into '/<path_to_your_project>/app/assets/'
}
这会将您的 jar 复制到您的资产文件夹。
要在编译代码时使用它,可以将此任务添加到 Run/Debug 配置中。
小米的回答给出了很好的方向,但最终的解决方案有些不同。
解决方案概述
该项目将包含两个模块:一个用于应用程序,一个用于库。应用程序模块将依赖于库,因此库将在应用程序之前构建。当 JAR 文件准备好后,它将被转换为 DEX 并复制到应用程序的资产库中。应用程序的构建 activity 会自动将资产文件夹捆绑在最终的 APK 中。
分步解决方案
如果不存在,请将库模块包含在项目设置文件中
settings.gradle
:include ':app', ':libmynewlibrary'
在
app
模块的build.gradle
添加依赖:dependencies { ... compile project(':libmynewlibrary') }
现在是棘手的部分。我们希望在创建 JAR 后立即添加自定义操作。幸运的是 Android Gradle 插件有一个预定义的任务 "jar" - 它显然构建了 JAR。我们将在 lib 的
build.gradle
中添加一些内容。请注意,该任务是隐式的,根本不在 gradle 文件中。我们只是通过添加doLast
来扩展它:jar { doLast { exec { executable "dx" args "--verbose", "--dex", "--output=../app/src/main/assets/mynewlib.dex", "build/libs/libmynewlib.jar" } } }