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

我是Android开发的新手。 一个多月以来,我遇到了一些没有解决方案的问题。 请尽可能帮助我。

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

  1. 我的图书馆代码
  2. 布局和资源文件
  3. Gradle对第三方的依赖。

首先,我想到为我的库创建.jar文件,但后来我发现laulyoit和资源文件不是用jar编译的。 然后我决定创建AAR文件。 请建议这个是正确的移动还是有其他选择???

现在我遇到了gradle依赖的主要问题。 我们正在创建一个付费图书馆,使用Google等仅通过Gradle提供的第三方。 现在,因为我正在创建一个AAR文件,所以没有Manifest.xml和Gradle文件,如何将第三个paties与我自己的代码集成。 我们有严格的指示,我们不能告诉图书馆的用户包括要包括的第三方。 简单来说,我们不能让用户知道我们的库正在使用哪种第三方。 那么我有没有办法创建一个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中的输出文件创建。 这是同样的gradle。

 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中:

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

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

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

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

现在手动或作为依赖模块将此* .aar文件添加到目标项目。 一旦主项目合并,这将给出合并的Android Manifest file

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

 MainProject ===> libraryModule ===> internallib 

在此处输入图像描述

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

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

嗨@ user3572586,

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

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

  • 您应该使用maven存储库(您必须在私有或公共maven存储库中发布库),您将不会遇到相同的问题。

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

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

第一: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