相关疑难解决方法(0)

Gradle中的transitive = true究竟做了什么(wrt crashlytics)?

Gradle transitive = true到底做了什么?Gradle文档中不清楚.这是在上下文compilebuild.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之间的行为发生了变化?

编辑:使用gradle未解析aar库的相关传递依赖项

java android gradle crashlytics build.gradle

160
推荐指数
4
解决办法
6万
查看次数

在Android Studio中创建aar文件

我想在Android Studio中为我的库创建一个aar文件,我会选择jar选项,但我的库有资源.

知道如何从库中创建aar文件吗?

android jar android-studio aar

159
推荐指数
5
解决办法
12万
查看次数

Android档案库(aar)vs标准jar

我一直在阅读一些关于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?

java android jar aar

124
推荐指数
4
解决办法
6万
查看次数

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

android gradle maven android-studio android-gradle-plugin

61
推荐指数
1
解决办法
2万
查看次数

如何发送具有远程依赖项(gradle)的Android库(aar)?

我正在尝试使用具有远程依赖关系的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)

android gradle maven aar

14
推荐指数
1
解决办法
1980
查看次数

gradle可以解决Android .aar文件中的依赖关系吗?

我正在开发一个内部库(我们称之为"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 build gradle aar

6
推荐指数
1
解决办法
1273
查看次数

将第三方库捆绑到我的 .aar 中

我正在构建一个用于音乐流媒体的 Android 库。它有ExoPlayer作为依赖项(顺便说一句,这是一个优秀的库!)。

我们将此库用于我们现在也在 Xamarin 中开发的另一个项目。目前,我们需要添加两个库(我的 .aar 和 ExoPlayer 的 .jar)。说实话,这有点烦人,我很想把我的 .aar 放进去,然后就可以了。

那么两个问题:

  1. 有没有办法可以使用 gradle 等将 ExoPlayer 捆绑到我的 .aar 中?(我是个初学者,请彻底)
  2. 我意识到这可能不是最好的做法(依赖关系应该由应用程序管理,等等),但实际上,每次更新前者时,我们都会一起测试 ExoPlayer 和我的库。那么,是否有充分的理由我不应该将 ExoPlayer 捆绑到我的库中,或者可以吗?

这是我当前的 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)

android jar android-gradle-plugin aar exoplayer

5
推荐指数
1
解决办法
3854
查看次数

在Gradle 4.x中使用api使用aar库导致缺少依赖项

当我使用*.aar文件而不是使用Gradle 4.x的模块构建应用程序并遵循有关implementsapi文档时,我希望使用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我看到同样的问题.

有人知道我做错了吗?

android module android-gradle-plugin aar

4
推荐指数
1
解决办法
1754
查看次数

在应用程序中找不到传递库依赖项

假设我有一个库模块,其中包含一些第三方库,例如 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

1
推荐指数
1
解决办法
2131
查看次数