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

时间:2017-03-14 10:38:04

标签: java android maven gradle

我正在创建一个基于以下组件的依赖关系的Android库。

  1. 我的图书馆代码
  2. 布局和资源文件
  3. Gradle对第三方的依赖。
  4. 首先我想到为我的库创建.jar文件,但后来我发现laulyoit和资源文件没有用jar编译。然后我决定创建AAR文件。请建议这个是正确的移动还是有其他选择?

    现在我遇到的主要问题是gradle依赖项。我们正在创建一个付费图书馆,使用Google等仅通过Gradle提供的第三方。现在,因为我正在创建一个AAR文件,所以没有Manifest.xml和Gradle文件,如何将第三方与我自己的代码集成。我们有严格的指示,我们不能告诉图书馆的用户包括要包括的第三方。简单来说,我们不能让用户知道我们的库正在使用哪种第三方。 那么有什么方法可以创建一个AAR文件,该文件也预先编译了gradle依赖项,而不会向用户透露我们正在使用的服务?

    更新1

    这是我的图书馆的build.gradle

    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之后,然后使用我的应用程序Project中的输出文件创建。这是同样的格斗。

    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'
    }
    

4 个答案:

答案 0 :(得分:7)

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

要在主应用程序中编译.aar库,请将其放在build.grade文件的dependencies中:

dependencies {
    compile(name:'your_lib_name', ext:'aar')
}

您必须将.aar文件复制到libs文件夹中的app文件夹。

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

答案 1 :(得分:3)

嗨@ user3572586,

  • aar文件不包含传递依赖关系,并且不包含 有一个pom文件,描述了库使用的依赖项。

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

  • 您应该使用maven存储库(您必须在中发布库) 私人或公共maven回购),你不会有同样的问题。

  • 在这种情况下,gradle使用pom文件下载依赖项 它将包含依赖项列表。

要隐藏用户付费的lib,请更好地为项目中的单个库创建包,然后生成.aar文件。我自己创建了一个实时流lib同一问题面,那时依赖模块移动到我的项目内部然后生成.aar文件。

答案 2 :(得分:2)

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

现在手动或作为依赖关系模块将此 *。aar 文件添加到目标项目中。合并主项目后,这将合并Android Manifest file

以下结构将库项目( libraryModule )添加为主项目的依赖项。 libraryModule 再次具有 internallib 的内部依赖性

MainProject ===> libraryModule ===> internallib

enter image description here

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

defaultConfig {

 .....
 multiDexEnabled true
 .....
}

答案 3 :(得分:2)

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

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

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

链接到maven shade插件: https://maven.apache.org/plugins/maven-shade-plugin/

链接到gradle shade插件: https://github.com/zawn/android-shade-plugin