我正在创建一个基于以下组件的依赖关系的Android库。
首先我想到为我的库创建.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'
}
答案 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
根据您的评论,可以通过在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