Java 如何从具有gradle依赖关系的代码创建Android库?

Java 如何从具有gradle依赖关系的代码创建Android库?,java,android,maven,gradle,Java,Android,Maven,Gradle,我正在创建一个Android库,它基于以下组件具有依赖关系 我的库代码 布局和资源文件 Gradle依赖于第三方 首先我考虑为我的库创建.jar文件,但后来我发现lauloyit和resources文件不是用jar编译的。然后我决定创建AAR文件。请建议这一步是正确的还是有其他选择 现在我遇到的主要问题是gradle依赖关系。我们正在创建一个付费图书馆,它使用一些第三方,如谷歌,只能通过Gradle获得。既然我正在创建一个AAR文件,就不会有Manifest.xml和Gradle文件,那么我如何

我正在创建一个Android库,它基于以下组件具有依赖关系

  • 我的库代码
  • 布局和资源文件
  • Gradle依赖于第三方
  • 首先我考虑为我的库创建.jar文件,但后来我发现lauloyit和resources文件不是用jar编译的。然后我决定创建AAR文件。请建议这一步是正确的还是有其他选择

    现在我遇到的主要问题是gradle依赖关系。我们正在创建一个付费图书馆,它使用一些第三方,如谷歌,只能通过Gradle获得。既然我正在创建一个AAR文件,就不会有Manifest.xml和Gradle文件,那么我如何将第三方与我自己的代码集成呢。我们有严格的指示,我们不能告诉图书馆的用户包括第三方。简单地说,我们不能让用户知道我们的图书馆正在使用什么样的第三方。 那么,有没有任何方法可以创建一个AAR文件,该文件还预先编译了gradle依赖项,而不向用户透露我们使用的是什么服务

    更新1

    这是我的build.gradle for Library

    apply plugin: 'com.android.library'
    
    android {
       compileSdkVersion 25
       buildToolsVersion "25.0.2"
       defaultConfig {
            minSdkVersion 15
            targetSdkVersion 25
            versionCode 1
            versionName "1.0"
            multiDexEnabled true
            testInstrumentationRunner         "android.support.test.runner.AndroidJUnitRunner"
    }
       dexOptions {
            preDexLibraries = false
            javaMaxHeapSize "4g" // 2g should be also OK
       }
       buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
     }
    
     dependencies {
     compile fileTree(dir: 'libs', include: ['*.jar'])
     androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
      })
       compile 'com.android.support:appcompat-v7:+'
    
       compile 'com.google.android.gms:play-services-vision:10.2.1'
    
       testCompile 'junit:junit:4.12'
    }
    
    之后,我将.aar文件移动到本地maven,然后在应用程序项目中使用输出文件创建。这是同样的渐变

    apply plugin: 'com.android.application'
    android {
        compileSdkVersion 25
        buildToolsVersion "25.0.2"
        defaultConfig {
        applicationId "com.jarvis.myapplication"
        minSdkVersion 15
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
        buildTypes {
            release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    }
    
    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
        })
    
        compile('com.company:mylibrary:1.0@aar')
            {
                transitive = true
            }
        compile 'com.android.support:appcompat-v7:25.3.0'
        testCompile 'junit:junit:4.12'
    }
    

    如果您创建一个.aar项目,那么就是一个清单文件,它将在编译时与应用程序的清单合并。一切正常。 您可以在.aar项目中使用任何gradle依赖项,甚至可以使用proguard模糊处理和签名

    要在主应用程序中编译.aar库,请在build.grade文件的
    依赖项中这样放置它:

    dependencies {
        compile(name:'your_lib_name', ext:'aar')
    }
    
    您必须将.aar文件复制到
    app
    文件夹中的
    libs
    文件夹中

    但有一点是明确的: 如果有人使用你的.aar文件,他或她可以随时在android studio中查看合并的清单文件,你不能隐藏你的依赖项。至少,据我所知。
    Android受到开源库(甚至通过maven)的强烈驱动,在大多数情况下,你甚至必须包括你使用的外部库的许可证,用户可以在你的应用程序中看到它的菜单项或链接。否则,在某些情况下,您可能会违反许可证甚至使用条款。您不能隐藏它们。

    您可以在库项目中创建一个包含所有必需依赖项的
    *.aar
    文件

    现在手动或将此*.aar文件作为依赖模块添加到目标项目中。一旦合并了主项目,就会得到合并的
    Android清单文件

    以下结构将库项目(libraryModule)作为主项目的依赖项添加。同样,库模块内部库具有内部依赖性

    MainProject ===> libraryModule ===> internallib
    

    根据您的评论,可以通过在
    build.gradle
    (模块:app)中添加以下内容来解决多索引问题

    你好@user3572586

    • aar文件不包含可传递的依赖项,也不包含 有一个描述库使用的依赖项的pom文件

    • 这意味着,如果您使用flatDir repo导入aar文件 您还必须在项目中指定依赖项

    • 您应该使用maven存储库(您必须在 私人或公共maven回购协议),您将不会遇到相同的问题

    • 在本例中,gradle使用pom文件下载依赖项 其中将包含依赖项列表


    若要对用户隐藏付费库,最好在项目中为单个库创建包,然后生成.aar文件。我自己创建了一个实时流库,在那个时候,依赖项模块被移动到我的项目中,然后生成.aar文件

    首先:AAR文件有清单。而且,如果您使用gradle来构建它们,它们将具有gradle构建脚本

    所以,你问题的第一部分是没有意义的。只需创建一个AAR库,并使用gradle maven插件(gradle)或maven android插件(maven)添加依赖项

    对于第二部分,这有点棘手。您需要的基本上是一个着色AAR或Uber AAR,一个将依赖项捆绑到自身中的AAR文件。您可以通过使用maven shade插件或gradle shade插件(取决于您使用哪个系统创建aar)来实现这一点。使用这种方法,您的客户可能会遇到严重的问题。您可以看到,在java中,您的项目使用依赖范围和类路径的概念。作用域指的是需要依赖项的时刻,以及是谁带来了依赖项。Classpath是项目使用的所有类的集合,既有来自依赖项的类,也有来自项目本身的类(因此客户机总是能够知道您在使用什么,因为编译器也需要知道)。因此,路径中不能有多个版本的依赖项,因为类会冲突,导致项目无法编译。这就是为什么我们通常不试图隐藏我们正在使用的依赖项;它可以更容易地解决冲突。如果您使用流行的依赖项(如谷歌地图),您的库可能会成为客户的问题,因此被丢弃。您最好使用设计好的契约开发库,然后使用特定依赖项开发具有特定实现的辅助插件。这样,您的项目将更易于维护,并且不受依赖关系的约束。在这种情况下,如果最坏的情况发生,并且您的实现的依赖项与客户机的项目不兼容,那么在不影响代码的情况下创建辅助实现将更容易

    defaultConfig {
    
     .....
     multiDexEnabled true
     .....
    }