Android Studio动态加载库

时间:2016-02-23 16:45:16

标签: java android gradle shared-libraries dex

我有一个使用making use of delegate. After, push the second动态加载库的Android应用程序。到目前为止,应用程序和库是在单独的项目中开发的。我想将项目整合到一个项目中(项目中的两个模块?)但我不知道如何使用Android Studio / Gradle实现它。请注意,我不想在应用程序和库之间添​​加静态依赖项。我想要达到的结果是:

  1. 应用程序和库都在同一个项目中。
  2. 应用程序和库的构建可能分为两个步骤(但一步可能很好:D)。
  3. 编译后的库最终必须是应用程序的资产,并捆绑在生成的APK中;即,不是静态编译到应用程序中,而是APK中的独立文件。
  4. 有什么想法吗?

2 个答案:

答案 0 :(得分:1)

如果您想将模块带入项目,可以在项目中编辑文件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从库中复制到项目的assets文件夹,只需在库build.gradle中定义gradle task,如:

task copyTask(type: Sync) {
    from '/<path_to_your_jar>/classes.jar'
    into '/<path_to_your_project>/app/assets/'
}

这会将你的jar复制到你的资产文件夹。

要在编译代码时使用它,可以将此任务添加到运行/调试配置中。

enter image description here

答案 1 :(得分:1)

小米的回答给出了一个很好的方向,但最终的解决方案有所不同。

解决方案概述

该项目将包含两个模块:一个用于应用程序,另一个用于库。应用程序模块将依赖于库,因此库将在应用程序之前构建。当JAR文件准备好后,它将被转换为DEX并复制到应用程序的资产库中。应用程序的构建活动将自动捆绑最终APK中的资产文件夹。

逐步解决方案

  1. 如果还没有,请将库模块包含在项目设置文件WS : (' '|'\r'|'\n'|'\t') -> channel(HIDDEN); 中:

    settings.gradle
  2. include ':app', ':libmynewlibrary' 模块的build.gradle中添加依赖项:

    app
  3. 现在是棘手的部分。我们希望在创建JAR后立即添加自定义操作。幸运的是,Android Gradle插件有一个预定义的任务“jar” - 它显然构建了JAR。我们将在lib的dependencies { ... compile project(':libmynewlibrary') } 中添加一些内容。请注意,该任务是隐式的,根本不在gradle文件中。我们只是通过向其添加build.gradle来扩展它:

    doLast