Java 如何从具有gradle依赖关系的代码创建Android库?
我正在创建一个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文件,那么我如何
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
.....
}