Java Android Studio动态加载库

Java Android Studio动态加载库,java,android,gradle,shared-libraries,dex,Java,Android,Gradle,Shared Libraries,Dex,我有一个Android应用程序,它使用DexClassLoader动态加载库。到目前为止,应用程序和库是在单独的项目中开发的。我想把这些项目合并成一个项目(一个项目中有两个模块?),但我不知道如何用Android Studio/Gradle实现它。请注意,我不想在应用程序和库之间添加静态依赖项。我想要达到的结果是: 应用程序和库都在同一个项目中 应用程序和库的构建可能分为两个单独的步骤(但一个步骤可能很好:D) 编译后的库最终必须是应用程序的资产,并捆绑在生成的APK中;i、 例如,不是静态编译

我有一个Android应用程序,它使用
DexClassLoader
动态加载库。到目前为止,应用程序和库是在单独的项目中开发的。我想把这些项目合并成一个项目(一个项目中有两个模块?),但我不知道如何用Android Studio/Gradle实现它。请注意,我不想在应用程序和库之间添加静态依赖项。我想要达到的结果是:

  • 应用程序和库都在同一个项目中
  • 应用程序和库的构建可能分为两个单独的步骤(但一个步骤可能很好:D)
  • 编译后的库最终必须是应用程序的资产,并捆绑在生成的APK中;i、 例如,不是静态编译到应用程序中,而是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")
    
    编辑

    如果您只想自动将jar从库复制到项目的assets文件夹中,只需在library build.gradle中定义一个:

    task copyTask(type: Sync) {
        from '/<path_to_your_jar>/classes.jar'
        into '/<path_to_your_project>/app/assets/'
    }
    
    任务复制任务(类型:Sync){
    来自“//classes.jar”
    进入“//app/assets/”中
    }
    
    这将把你的jar复制到你的资产文件夹中

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


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

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

    逐步解决
  • 如果还没有,请将库模块包括在项目设置文件
    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"
            }
        }
    }
    

  • 问题是我不希望库模块被静态编译到我的APK中;我希望它被添加为一项资产,以便以后可以手动加载。@FireAphis啊,我明白了。所以答案1和2是可以的,除了编译项目应该把模块apk(或jar)放在assets文件夹中,对吗?第一步看起来是正确的,我确实希望jar放在assets文件夹中。但是如果将它添加到依赖项中,它不会静态地将jar链接到应用程序中吗?我想避免这种情况。一般来说,声明依赖关系不那么重要——我可以不用它。但是我如何让gradle将jar复制到资产中呢?
    jar {
        doLast {
            exec {
                executable "dx"
                args "--verbose", "--dex", "--output=../app/src/main/assets/mynewlib.dex", "build/libs/libmynewlib.jar"
            }
        }
    }