Android aar包的使用 打包aar后报错ClassNotFoundException,aar中有dependencies依赖的情况;

示例:现有A,B两个library module都是本地的,A引用B,我把A打成了aar库,打出来之后却没有B的内容,导致我的主工程引用A之后,执行某个应用了B中的类的方法的时候崩溃了,请问怎么才能打包A成aar库的时候把B库的内容都打进去(B也可能是远程仓库)。解决问题在后面;

1、如何打AAR包:

如上图所示,选中你需要打aar包的Module,然后点击Build中的“Make Module 就OK了

或点击图二中的assemble ;

 

这个是AAR包的输出位置;

2:如何引用AAR包:

将相应AAR包复制到APP的某个目录如(app\libs),同时将加入到在APP的dependencies内,如下:
       repositories {
              flatDir {
              dirs 'libs' //this way we can find the .aar file in libs folder
           }
        }
   dependencies {
         compile(name:'xxxxx', ext:'aar')  //xxxxx是你aar的名字
    }

3、打包aar后报错ClassNotFoundException,aar中有dependencies依赖的情况:

AAR只能打包本地的代码,你在dependencies中的依赖无法打包到AAR中;

解决1:把你在AAR包中依赖地址在新工程再引用一次;有点SB例(Module1中依赖了OkHttp,把Module1打包为AAR,Module2使用了此AAR后,在依赖一次OkHttp)

解决2:https://github.com/kezong/fat-aar-android ; https://github.com/adwiv/android-fat-aar

 

fat-aar-android的使用:https://github.com/kezong/fat-aar-android

第一步: Apply plugin

添加以下代码到你工程根目录下的build.gradle文件中:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:xxx'
        classpath 'com.kezong:fat-aar:1.2.8'
    }
}

添加以下代码到你的主library的build.gradle中:

apply plugin: 'com.kezong.fat-aar'

第二步: Embed dependencies

  • implementation或者api改成embed

代码所示:

dependencies {
    implementation fileTree(dir: 'libs', include: '*.jar')
    // java dependency
    embed project(path: ':lib-java', configuration:'default')
    // local full aar dependency
    embed (name:'lib-aar-local2',ext:'aar')
    // remote jar dependency
    embed 'com.google.guava:guava:20.0'
    // remote aar dependency
    embed 'com.facebook.fresco:fresco:1.11.0'
    // don't want to embed in
    // 不建议使用implementation,因为该依赖可能与application的依赖版本不一致,使用implementation可能会导致R类找不到的问题
    compileOnly 'com.android.support:appcompat-v7:27.1.1'
}

多级依赖

本地依赖

如果你想将本地所有相关的依赖项全部包含在最终产物中,你需要在你主library中对所有依赖都加上embed关键字

比如,mainLib依赖lib1,lib1依赖lib2,如果你想将所有依赖都打入最终产物,你必须在mainLib的build.gradle中对lib1以及lib2都加上embed关键字

远程依赖

如果你想将所有远程依赖在pom中声明的依赖项同时打入在最终产物里的话,你需要在build.gradle中将embed的transitive值改为true,例如:

// the default value is false
// invalid for local aar dependency
configurations.embed.transitive = true

如果你将transitive的值改成了true,并且想忽略pom文件中的某一个依赖项,你可以添加exclude关键字,例如:

embed('com.facebook.fresco:fresco:1.11.0') {
    exclude(group:'com.facebook.soloader', module:'soloader')
}

这个时我成功引入的aar包,其中socket的内容是远程依赖,可以打包到aar中;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值