Gradle transitive = true到底做了什么?Gradle文档中不清楚.这是在上下文compile中build.gradle.在我的情况下,我依赖于Android的崩溃.
compile('com.crashlytics.sdk.android:crashlytics:2.2.2@aar') {
transitive = true;
}
Run Code Online (Sandbox Code Playgroud)
几个Gradle文档(此处和此处)暗示"传递"默认为true.然而,删除transitive = true导致传递依赖性的结果(特别是KitGroup).
class file for io.fabric.sdk.android.KitGroup not found
Run Code Online (Sandbox Code Playgroud)
文档说它默认为true,但实际行为似乎正好相反.
我正在运行Gradle 2.2.1.也许2.2和2.4之间的行为发生了变化?
我想在Android Studio中为我的库创建一个aar文件,我会选择jar选项,但我的库有资源.
知道如何从库中创建aar文件吗?
我一直在阅读一些关于Gradle作为Android应用程序的标准构建系统的新采用的文章.好吧,来自标准的Java开发,我通常依赖于jar文件来构建我的项目.然而似乎安卓也有AAR包,这是相当于DLL在Windows操作系统文件,提到这里:
首先,您必须意识到Android平台不允许应用程序级别的"共享库".在"传统"编程语言平台,C,C++,Java中,您可以命名它,我们有这种共享运行时库的机制.(例如,Windows上的DLL,Unix上的DSO,JVM上的Jar等).但是,在Android上,除非您是Google或手机制造商,否则您无法做到这一点(请参阅下面的脚注1).作为应用程序开发人员,这可能是一个基本限制.在构建时和运行时"共享"或"重用"代码是软件工程实践中非常重要的一部分.由于上述限制,这在Android上相当困难(并非不可能,更难).
但是,我对这个概念有些怀疑.我的意思是,开发人员何时应该对其应用程序中包含aar依赖项感兴趣?这种依赖关系是否收紧到SDK最低版本?
例如,在一个项目中,我访问一个COM端口,我使用NDK预编译 .so库.如果我想分享这个实用程序,我是否必须创建一个aar?
所以,现在我有一个图书馆项目,说项目public static取决于像这样的图书馆public static.
现在,它public static有一个maven buildstep,可以生成AAR并将其推送到公共场所.
所以现在让我说我有项目B,我们会称之为public static.Bar是一个Android应用程序,public static依赖于public static.
好吧,我有.但是,当我从该调用中调用public static函数时,我收到以下消息:public staticpublic staticpublic static
java.lang.NoClassDefFoundError: com.squareup.okhttp.OkUrlFactory
at com.foo.sdk.utils.OkHttpStack.<init>(OkHttpStack.java:15)
Run Code Online (Sandbox Code Playgroud)
那么,这样的事情可能吗?或者public static需要手动依赖public static以及任何其他依赖项public static?
我正在尝试使用具有远程依赖关系的gradle构建aar文件.下面是一个示例构建脚本.如您所见,我有两个依赖项.我遇到的问题是当我发布时,aar文件不包含远程依赖项,所以当我在其他项目中包含aar文件时,我得到NoClassDefFound错误.
我发现如果我将jar从我当地的maven repo复制到我项目中的libs文件夹,那么jar确实会包含在发布版本中.如何在aar文件中包含远程依赖项?我还在其他地方读到,这样运送依赖关系是不好的做法,所以如果有更好的方法来做我想做的事情,我就是为了它.
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.9.+'
}
}
apply plugin: 'android-library'
repositories {
mavenCentral()
mavenLocal()
}
android {
... omitted for brevity
}
dependencies {
compile 'com.somepackage:someartifact:1.0'
compile 'com.anotherpackage:artifact:2.0'
}
Run Code Online (Sandbox Code Playgroud) 我正在开发一个内部库(我们称之为"banana_lib"),它将包含在Android应用程序项目中.我想以.aar文件的形式向客户端提供此库.
我的图书馆依赖于另一个图书馆(让我们说Gson).如果我能帮助它,我想避免将这种依赖的类捆绑到我的库中("胖罐","超级罐"方法).
我知道我可以要求我的库的用户将依赖项包含在应用程序的build.gradle文件中:
dependencies {
compile 'com.google.code.gson:gson:2.2.4'
compile files('libs/banana_lib.aar')
Run Code Online (Sandbox Code Playgroud)
}
但我不想让我的库的用户在应用程序的build.gradle文件中包含我的库的依赖项给图书馆用户带来负担.
问题: 有没有办法让gradle自动解析/包含.aar文件的依赖项?有什么办法可以让.aar库的用户尽量减少工作量?我需要提供一对.aar和.pom文件吗?我的主要目标是减少这个库的用户必须做的事情.我觉得图书馆应该理想地定义它的所有依赖项,gradle应该只在后台解决它们.
换一种略有不同的方式:有没有办法允许客户端/用户通过以下方式包含(内部!)库(具有外部依赖性):1.)将.aar文件添加到构建中.2.)将它包含在build.gradle中.
如果有其他解决方案可以将库的用户/包含者必须做的工作量保持在最低限度,那么这也很有趣:)
非常感谢!
我正在构建一个用于音乐流媒体的 Android 库。它有ExoPlayer作为依赖项(顺便说一句,这是一个优秀的库!)。
我们将此库用于我们现在也在 Xamarin 中开发的另一个项目。目前,我们需要添加两个库(我的 .aar 和 ExoPlayer 的 .jar)。说实话,这有点烦人,我很想把我的 .aar 放进去,然后就可以了。
那么两个问题:
这是我当前的 gradle 文件。不过,没什么令人兴奋的东西。但是当我将初始应用程序转换为库时,也许有一些奇怪的事情,谁知道呢......
apply plugin: 'com.android.library'
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
defaultConfig {
minSdkVersion 19
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile ('com.google.android.exoplayer:exoplayer:r1.5.6')
testCompile 'junit:junit:4.12'
testCompile 'org.mockito:mockito-core:1.10.19'
compile 'com.android.support:appcompat-v7:23.2.0'
}
Run Code Online (Sandbox Code Playgroud) 当我使用*.aar文件而不是使用Gradle 4.x的模块构建应用程序并遵循有关implements和api的文档时,我希望使用api包含的aar文件包含所有依赖项,但它没有.
当你这样做
git clone https://github.com/hannesa2/aar_dependency
./gradlew clean assembleDebug
Run Code Online (Sandbox Code Playgroud)
手段
dependencies {
api project(':mylibrary')
Run Code Online (Sandbox Code Playgroud)
它工作正常.
但是当我使用lib-module的insted时,先前生成的*.aar文件作为依赖
dependencies {
api 'com.example.my.mylibrary:mylibrary-debug@aar'
Run Code Online (Sandbox Code Playgroud)
(在演示应用程序中)
git checkout with_aar
./gradlew clean assembleDebug
Run Code Online (Sandbox Code Playgroud)
我碰到了这个
任务:app:transformClassesWithDesugarForDebug线程"main"中的异常java.lang.TypeNotPresentException:在sun.invoke.util.BytecodeDescriptor的sun.invoke.util.BytecodeDescriptor.parseSig(BytecodeDescriptor.java:85)中输入不存在的io.reactivex.ObservableTransformer .parseMethod(BytecodeDescriptor.java:63)位于com.google.devtools的java.lang.invoke.MethodType.fromMethodDescriptorString(MethodType.java:1067)的sun.invoke.util.BytecodeDescriptor.parseMethod(BytecodeDescriptor.java:41).在org.objectweb.asm.MethodVisitor.visitInvokeDynamicInsn(未知来源)的org.objectweb.asm.MethodVisitor.visitInvokeDynamicInsn(未知来源)的build.android.desugar.LambdaDesugaring $ InvokedynamicRewriter.visitInvokeDynamicInsn(LambdaDesugaring.java:399)
因为我将这些aar工件上传到我们的Maven Nexus公司时遇到了这个问题,所以我创建了这个demo-repo以准确显示出错了什么.在演示应用程序或使用Maven我看到同样的问题.
有人知道我做错了吗?
假设我有一个库模块,其中包含一些第三方库,例如 OkHttp。当我在我的应用程序中包含这个库时,我无法使用这些第三方库。我阅读了以下文章第 1 条、
第 2 条
并尝试了
1. compile project(':library-name')
{将库的 .aar 文件作为模块导入到 myproject 中之后}
2. 我将 .aar 文件包含在 libs 文件夹中并添加了以下依赖项
build.gradle(项目级别)
allprojects {
repositories {
flatDir {
dirs 'libs'
}
}
}
Run Code Online (Sandbox Code Playgroud)
build.gradle(应用程序级别)
compile fileTree(dir: 'libs', include: ['*.jar'])
compile ('com.myapp.package:library-name:1.0.0@aar'){
transitive=true
}
Run Code Online (Sandbox Code Playgroud)
3. 与2类似,但在
build.gradle中(应用程序级别)
compile fileTree(dir: 'libs', include: ['*.jar'])
compile (name:'library-name', ext:'aar'){
transitive=true
}
Run Code Online (Sandbox Code Playgroud)
但是,我仍然无法使用我的库中存在的传递库。我收到以下异常。
java.lang.NoClassDefFoundError: Failed resolution of: Lcom/squareup/okhttp/MediaType;
Run Code Online (Sandbox Code Playgroud)
有人可以帮忙吗
编辑:
以下是我的库的 build.gradle
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'org.apache.httpcomponents:httpcore:4.4.4' …Run Code Online (Sandbox Code Playgroud) android gradle android-library android-studio android-gradle-plugin