精华内容
下载资源
问答
  • 原文链接:Android Studio多Module使用aar编译报错的解决方案 AAR Format 在 Android Studio 之前,如果用引用第三方的库,一般使用 jar 包,它只包含了class,没有包含对应的资源、so库等,所以引用起来就不方便...

    原文链接:Android Studio多Module使用aar编译报错的解决方案

    AAR Format

    在 Android Studio 之前,如果用引用第三方的库,一般使用 jar 包,它只包含了class,没有包含对应的资源、so库等,所以引用起来就不方便,特别是一些 UI 库,第三方在使用的时候,还需要自己单独导入对应的资源(字符串、图片等)。

    现在 Android 中引入了 aar 这种包结构,它其实也是一个zip包,它里面包含了很多资源,具体的结构如下所示:

    参考链接:AAR Format

    The ‘aar’ bundle is the binary distribution of an Android Library Project.

    The file extension is .aar, and the maven artifact type should be aar as well, but the file itself a simple zip file with the following entries:

    /AndroidManifest.xml (mandatory)
    /classes.jar (mandatory)
    /res/ (mandatory)
    /R.txt (mandatory)
    /assets/ (optional)
    /libs/*.jar (optional)
    /jni//*.so (optional)
    /proguard.txt (optional)
    /lint.jar (optional)
    These entries are directly at the root of the zip file.

    The R.txt file is the output of aapt with –output-text-symbols.

    在Gradle中如何使用aar

    Android Studio (AS) 中使用aar,通常是把aar文件放到 libs 目录下面,需要在 MODULE 目录下面 build.gralde 中添加如下配置:

    repositories {
        flatDir {
            dirs 'libs'
        }
    }

    另外,还需要在 dependencies block中添加如下代码:

    dependencies {
        compile(name: 'aar-file-name', ext: 'aar')  
        // 其中aar-file-name不用后缀名
    }

    多Module中使用aar编译报错

    在开发Android App的时候,如果项目比较复杂,都可能会有很多个 library 工程,考虑如下场景:

    Module A:Library
    Module B:Library
    Module C:App
    其中 Module B 依赖 Module A,Module C 依赖 Module A,Module B。

    如果在 Module A 中添加了aar库的话,则编译的时候,可能会报错,例如在 Module A 中使用了gif库, 对应的引用代码是:

    compile(name: 'gif-1.0', ext: 'aar')

    在编译的时候,错误信息可能如下所示:

    Failed to resolve: gif-1.0
    Module A 是可以正常编译通过的,但是编译 Module C 的时候,就会发现找不到对应的 gif 库,因为在 Module A 中指定的 libs 目录是相对的,在 Module C 中的 build.gradle 只会从自己所在目录下面的 libs 中查找,结果是找不到 gif 相关的 aar 库,所以就会编译出错。

    解决方案

    上述编译错误的根本原因是不 Module C 在编译的时候找不到对应的 gif 库,所以,根本要解决的就是如何让所有的工程都能引用到呢?

    方案一

    所有依赖 Module A 的 Module 都添加:

    repositories {
        flatDir {
            dirs 'xxx/libs' // Module A的libs的目录地址
        }
    }

    把所有的 Module 都添加上 Module A 的 libs 目录的相对地址。

    这种方案不也的地方在于:这样改动太多,而且如果以后多增加一个 Module 的话,也必须记得添加这行,否则会编译不过,这个方案不好,不具备扩展性。

    方案二

    有没有一种更好的方案呢?在网上查了一些,从一些方案中想到了最终的方案,本质上是要保证所有的 Module 都能引用到某个目录下面的 aar 库不就行了吗?基于这个思路去想,就想到能否在 Project 下的 build.gradle 中的 repositories 中添加相应的引用呢?默认的配置如下:

    allprojects {
        repositories {
            jcenter()
        }
    }

    那就试一试吧,在 repositories 下添加 flatDir 试试。代码如下:

    注意:这里一定是在 Project 下面的 build.gralde 中添加。

    dirs project(‘:AppLibrary’).file(‘libs’)
    编译,通过了,耶~~

    最终代码是这样的:

    allprojects {
        repositories {
            jcenter()
    
            flatDir {
                // 由于Library module中引用了 gif 库的 aar,在多 module 的情况下,
                // 其他的module编译会报错,所以需要在所有工程的repositories
                // 下把Library module中的libs目录添加到依赖关系中
                dirs project(':AppLibrary').file('libs')  
            }
        }
    }

    大家也可以参考这个链接,我从这上面也得到了一些想法和帮助。

    Adding local .aar files to Gradle build using “flatDirs” is not working

    总的说来,方案二比较完美地解决了多 module 引用 aar 库的问题,推荐使用这种方法。

    展开全文
  • FAQ: AAR打包引用丢包问题, jar, aar, dependency 嵌套层级依赖的丢失 ...如果直接作为module 依赖是没有问题的,但是如果打包成aar,确实找不到相关的类。 Android Library项目中如果使用Androi...

    转载:https://www.cnblogs.com/bluestorm/p/6757999.html

    FAQ: AAR打包引用丢包问题, jar, aar, dependency 嵌套层级依赖的丢失

    问: aar包中,如何包含第三方依赖库?

    如果直接作为module 依赖是没有问题的,但是如果打包成aar,确实找不到相关的类。
     

    Android Library项目中如果使用Android Gradle plugin打aar包,通过maven依赖的库,或者是local依赖的aar都不会包含在生成的aar包里

    如果项目是发布一个SDK,为了方便开发者使用,我们倾向于生成一个包含所有依赖库以及.so等文件的aar包。

     

    需要解决的问题:

    1.aar打包丢失lib库maven远程依赖;

    关于1的解决方案可以参考该链接:

    建立本地或者远程的maven库……

    Androidstudio 打包aar 无法引用类库中 dependencies 远程依赖 - Freetofly白的博客 - 博客频道 - CSDN.NET
    http://blog.csdn.net/u011840744/article/details/50608677

     

    2.aar打包丢失本地aar依赖

    关于2的解决方案如下:

     

    方案一、 所有依赖 Module A 的 Module 都添加:  ---给好aar的路径:xxmodule/libs/xx.aar

    1

    2

    3

    4

    5

    repositories {

        flatDir {

            dirs 'xxx/libs' // Module A的libs的目录地址

        }

    }

    把所有的 Module 都添加上 Module A 的 libs 目录的相对地址。

     

    方案二、 Project 下的 build.gradle 中的 repositories 中添加相应的引用如下:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    allprojects {

        repositories {

            jcenter()

     

            flatDir {

                // 由于Library module中引用了 gif 库的 aar,在多 module 的情况下,

                // 其他的module编译会报错,所以需要在所有工程的repositories

                // 下把Library module中的libs目录添加到依赖关系中

                dirs project(':AppLibrary').file('libs'

            }

        }

    }

      

     方案3、编写脚本,实现aar打包的时候把相应依赖全部打包进aar中

    为项目增加一个sub project(如pkg_project)专门用于打包,该项目中build.gradle内容如下:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    54

    55

    56

    57

    58

    59

    60

    61

    62

    63

    64

    65

    66

    67

    68

    apply plugin: 'java'

    version = 1.0

    buildscript {

        repositories {

            mavenCentral()

        }

        dependencies {

            classpath 'com.android.tools.build:gradle:19.1.0'

        }

    }

     

    repositories {

        mavenCentral()

    }

     

    dependencies {

        compile project(':<your_library_project>'//此处填写需要打包的Android Library Project name

    }

     

    task sync_jars() << {

         //把所有依赖的.jar库都拷贝到build/aar/libs下

        copy {

            into buildDir.getPath() +"/aar/libs"

            from configurations.compile.findAll {

                it.getName().endsWith(".jar")

            }

        }

    }

     

    task sync_aars(dependsOn:':<your_library_project>:assembleRelease') << {

         //把所有依赖的.aar库里包含的classes.jar都拷贝到build/aar/libs下,并重命名以不被覆盖

        def jar_name

        def aar_path

        def dest_dir = buildDir.getPath()+"/aar"

        configurations.compile.findAll {

            it.getName().endsWith(".aar")

        }.collect {

            aar_path = it.getPath()

            jar_name = "libs/"+it.getName().replace(".aar",".jar")

            copy {

                from zipTree(aar_path)

                into dest_dir

                include "**/*"

                rename 'classes.jar', jar_name

            }

        }

    }

     

    task fataar(dependsOn:[sync_aars, sync_jars]) << {

        task (obfuse_classes_jar, type: proguard.gradle.ProGuardTask) {

            //把build/aar/libs/*.jar混淆后生成build/aar/classes.jar

            configuration "proguard.cfg"

            injars buildDir.getPath()+"/aar/libs"

            outjars buildDir.getPath()+"/aar/classes.jar"

            libraryjars "${System.getProperty('java.home')}/lib/rt.jar"

            libraryjars "${System.getProperty('java.home')}/Contents/Classes/classes.jar"

            libraryjars System.getenv("ANDROID_HOME")+"/platforms/android-19/android.jar"

        }.execute()

        task (gen_aar, type: Zip) {

            //把生成最终的aar包,注意libs目录需要被排除

            def dest_dir = buildDir.getPath()+"/aar/"

            baseName = "mysdk-all"

            extension = "aar"

            destinationDir = file(buildDir.getPath())

            from dest_dir

            exclude "libs"

        }.execute()

    }

    最后就可以使用gradlew pkg_project:fataar来打包了

    解决办法:

    使用相对路劲来找到这个aar文件。

    repositories {
        flatDir {
            dirs '../myLibrary2/libs';dirs 'libs'  // 申明本地库,给aar的全路径
        }
    }
    
    展开全文
  • 2.module生成aar build一下,或者点击运行下面的task也行。   3.使用 拷贝到需要使用的模块的libs目录下。 然后在模块下的build.gradle文件添加 repositories {  flatDir {  di...

    1.生成一个module

    然后,新建一个activity,在app的manifest中声明就行了,也能引用。

    2.module生成aar

    build一下,或者点击运行下面的task也行。

     

    3.使用

    拷贝到需要使用的模块的libs目录下。

    然后在模块下的build.gradle文件添加

    repositories {
        flatDir {
            dirs 'libs'   // aar目录
        }
    }
    compile(name: 'mylibrary_release', ext: 'aar')

    然后

     

    最后 最多clean rebuild 就出来了。

     

     

     

     

    展开全文
  • 踩坑子Module引用aar

    2019-09-24 01:15:50
    module会引用子module,如下所示: 子module则依赖一个aar: 这样相当于主module间接的依赖着aar,但是这样运行会报错: 提示找不到aar,解决方法如下: Demo Demo地址 ...

    在这里插入图片描述

    主module会引用子module,如下所示:
    在这里插入图片描述
    子module则依赖一个aar:
    在这里插入图片描述

    这样相当于主module间接的依赖着aar,但是这样运行会报错:
    在这里插入图片描述

    提示找不到aar,解决方法如下:
    在这里插入图片描述

    Demo

    Demo地址

    展开全文
  • 主要介绍了Android Studio 多层级 Moduleaar 引用问题的解决方法,需要的朋友参考下
  • 安卓module引用aar

    2019-04-16 16:36:57
    假设有一个名字叫Application的工程,此工程下引用了名字叫open_sdk的module,op_sdk这个module需要引用一个名字叫player的aar(player.aar),那么如何集成呢? 需要两步: 一:在Application的gradle下配置 ...
  • 在SDK开发过程中,我们可能遇到过需要将多个Module的代码打包成一个jar或者aar的情况,由于安卓打包的时候不会将module依赖的其他module打包进aar中,所以通过AS打包出来的aar是不完整的。但是在组件化开发盛行的...
  • Android多Module合并aar打包

    千次阅读 2020-05-29 11:48:26
    Android多Module合并aar打包 最近项目需要这方面的东西,折磨了我好些时间,做下笔记免得忘记 fat-aar 开发Android几年了,没有百度解决不了的问题,如果有那就谷歌(水平菜,接触不到高深项目)。在网上找到了 ...
  • 该篇文章主要记录module的一些问题,以及jar和aar引用等相关问题,会持续记录更新。一、新建module如果是作为lib被引用,需要选择Android Library。二、作为lib的module如果引用了aar文件:1、把aar文件放到module的...
  • 遇到问题 在多Module时,一个Module引用aar 结果编译出错 Failed to resolve: :AliyunSdk-RC:  按照规范把aar文件放到 libs 目录下面,在 MODULE 目录下面 build.gralde 中添加如下配置: repositories {...
  • module中引入了AAR,而工程中导入了改module作为依赖,即使工程中没使用没直接使用AAR中的东西,只使用module使用AAR的类依然会找报错。这种情况需要在工程中也导入AAR包并指定位置如: defaultConfig { ...
  • 这里只记录一下如何打aar包,为什么使用这里就闲扯了。 一般通过gradle 打apk的包的时候,对应的module就会生成相应的aar包。 这里提供一个简单的方式。 在上图中的Build Variant 中就有debug和release 的选项,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,939
精华内容 3,175
关键字:

module使用aar