安卓将子模块打aar包,并将其远程依赖打包进去
生成 AAR 包
在Android Studio Terminal 窗口输入以下命令:
./gradlew :monitor:assembleRelease
把 monitor 换成你子模块的名称,不出意外的话 就会在下面目录生成相应aar文件

注意:如果你的Java运行环境是Java 8 则在老一点的AS上 可以运行打包成功,在较新一点的AS上会打包报错,主要是新的AS要求的环境变量 都Java 11 以上了,可以考虑配个环境,再打包或者使用较旧的AS如 2021版本的。
🆗,到这里没什么压力
这时你会发现aar包并不大,甚至只有几十kb,如果你的子moudle 没使用第三方依赖的话,你会发现使用时没什么问题,如果有第三方依赖的话,它还是不大,甚至编译期也不会报错 ,但你运行时就会报错依赖找不到。
其实你在打aar包的时候并没有把第三方库 打包进去,这还搞个🔨
不要慌,继续往下看👇
将远程依赖打包进aar中
介绍下我们的主角:fat-aar-android 链接如下
https://github.com/kezong/fat-aar-android?tab=readme-ov-file
一个gradle插件,它可以将依赖项合并到最终的aar文件中,并与agp3 .+一起工作
由于作者不维护了最终支持版本为 AGP 3.0 - 7.1.0,和 Gradle 4.9 - 7.3
在新项目上会报错,这不是重点,还是有大佬fork版本呢
下面这个库还在继续维护,gradle 版本大于 4.9 - 7.3 可以使用这个库
https://github.com/aasitnikov/fat-aar-android
我照着使用文档搞的,好像报错了,就按着example代码写的,好家伙,源码的和说明文档的写法不一样,懵了,就试着搞了一下,编译通过🤭,如过你照着使用文档弄,可以通过的话就忽略下面代码把!
Step 1: 将下面的代码段添加到root build中:
就是你项目的根build.gradle文件,不是app下的哦
buildscript {repositories {mavenCentral()google()jcenter()maven { url "https://plugins.gradle.org/m2/" }}dependencies {classpath 'com.github.kezong:fat-aar:1.3.8'}
}plugins {id 'com.android.application' version '7.0.2' apply falseid 'com.android.library' version '7.0.2' apply falseid 'org.jetbrains.kotlin.android' version '1.8.0' apply false
}
这个文件原本只有 plugins 块,把 buildscript 放进去就行
Step 2: 添加插件
在你想要打包的子Moudle 的build.gradle 中 添加 id 'com.kezong.fat-aar'
plugins {id 'com.android.library'id 'com.kezong.fat-aar'
}
也有可能你项目是这种写法:apply plugin: 'com.kezong.fat-aar' 都一样
Step 3: Embed 依赖
就是把你引入的第三方依赖 从 implementation xxx 换成 embed xxx 效果如下:
dependencies {implementation 'androidx.appcompat:appcompat:1.4.1'implementation 'com.google.android.material:material:1.5.0'implementation 'androidx.constraintlayout:constraintlayout:2.1.3'testImplementation 'junit:junit:4.13.2'androidTestImplementation 'androidx.test.ext:junit:1.1.3'androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'embed 'com.lzy.net:okgo:3.0.4'// ffmpegembed 'com.arthenica:ffmpeg-kit-full:6.0-2'embed 'com.arthenica:smart-exception-java:0.2.1' embed 'com.arthenica:smart-exception-common:0.2.1'// utilembed 'com.blankj:utilcodex:1.31.1'// gsonembed 'com.google.code.gson:gson:2.8.6'
}
然后运行上面 生成 AAR 包 的指令,就会看下像下面的打印
[fat-aar][embed detected][aar]com.lzy.net:okgo:3.0.4
[fat-aar][embed detected][aar]com.arthenica:ffmpeg-kit-full:6.0-2
[fat-aar][embed detected][aar]com.blankj:utilcodex:1.31.1
然后 BUILD SUCCESSFUL 你会发现aar包 比原来胖了一圈,不出意外你就可以拿着aar包 愉快地玩耍了
当然,不出意外是不可能的,导入, 运行, 啪! 又报错🤦♂️
看log又是相关类找不到。我不是都打包进去了吗?怎么还找不到!
以上面 'com.arthenica:ffmpeg-kit-full:6.0-2'举例
如果要在项目中依赖的话,确实没什么问题,因为它如果依赖了别的文件的话,会自动下载的,而打包成aar文件它就不会下载了,这时候就缺少了相关文件,怎么办呢?分析吧
打开External Libraries文件夹,可以看到 多了 exception-java 和 exception-common 这两个库

把这两个库 像上面Step 3 那样 放进去就行了,然后再回到最初 生成 AAR 包
关机 跑路 一气呵成 emm… 跑题了😆
编译 运行 啪!成了😁,特,属予作文以记之。
相关文章:
安卓将子模块打aar包,并将其远程依赖打包进去
生成 AAR 包 在Android Studio Terminal 窗口输入以下命令: ./gradlew :monitor:assembleRelease把 monitor 换成你子模块的名称,不出意外的话 就会在下面目录生成相应aar文件 注意:如果你的Java运行环境是Java 8 则在老一点的AS上 可以运…...
python 提取视频中的音频 采用ffmpeg-python 库
要使用 ffmpeg-python 库从视频文件中提取音频,首先需要确保你的系统中已经安装了 FFmpeg 和 ffmpeg-python 库。以下是详细的步骤: 步骤 1: 安装 FFmpeg 确保你的系统中已经安装了 FFmpeg。如果你使用的是 CentOS,可以参照前面的回答来安装 …...
区块链的搭建和运维4
区块链的搭建和运维4 (1) 搭建基于MySQL分布式存储的区块链 1.构建单群组网络节点 使用开发部署工具构建单群组网络节点,命令如下: bash build_chain.sh -l 127.0.0.1:4 -p 30300,20200,85452. 启动 MySQL 并设置账户密码 输入如下命令,…...
数据驱动决策:内容数据产品经理的成长与价值
数据驱动决策:内容数据产品经理的成长与价值 内容数据产品经理以数据为媒介,在用户与决策之间搭建桥梁,通过理解分析模型和用户决策路径,设计产品以促成更多决策产出,创造用户价值。例如,在衡量数据产品经理…...
pyinstaller 打包python 提示 object has no attribute
参考: 错误:gi.repository.BlockDev’ object has no attribute plugin_specs_from_names 查看包路径 rpm -ql python3-blockdev/usr/lib64/python3.7/site-packages/gi/overrides/BlockDev.py /usr/lib64/python3.7/site-packages/gi/overrides/__pyca…...
ubuntu20.04搭建RUST开发环境并与C语言交互
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 ubuntu20.04搭建RUST开发环境并与C语言交互 前言开战一、确认环境版本二、环境搭建三、hello world!四、跟c语言进行交互1.rust调用C静态库2.C调用rust库 总结参考…...
C语言 ——— 学习、使用memmove函数 并模拟实现
目录 memmvoe函数的功能 学习memmove函数编辑 模拟实现memmove函数 memmvoe函数的功能 memmvoe函数的功能类似于memcpy函数,都是内存拷贝,唯一的区别是memcpy函数不能成功拷贝原数据,而memmvoe函数可以 举例来说: [1, 2, 3…...
职场中必须明白的三个道理,不明白无出头之日,你越早知道越好
职场中有很多优秀的人才,他们工作能力出众,为人处事也非常的善良,但是有时候,这样的优点反而成了他们在职场中被欺负的原因,因为他们太善良,很容易被别人利用,为了自己的利益,有些人…...
做webserver项目的一些问题和思路总结
1.webserver是做什么的?这个项目最后想实现什么? 网络服务器,是一个处理HTTP请求并返回HTTP响应的程序。(socket实现的是网络编程,不一定是HTTP,还有其他协议,具体协议由端口来确定)…...
大数据-70 Kafka 高级特性 物理存储 日志存储 日志清理: 日志删除与日志压缩
点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…...
基于S7-200 SMART实现PID控制仿真实验
关键字:Matalb;S7-200 SMART;Modbus TCP;PID控制 系列文章目录 基于S7-200 SMART实现一键启停 顺序功能图——(二)设计机组延时关机程序 基于S7-200 SMART实现Modbus TCP通信 基于S7-200 SMART实现MATLAB写…...
社交及时通讯平台完整版源码,uniapp技术,可打包成app
源码简介: 全原生,从底层开始结构就完全不一样,mongodb的库,uniapp混编手端,二开难度要比视酷或者酷信容易很多。全开源,带开发文档。前端用的是uniapp技术,所以是多端合一,可以做h…...
TensorFlow和Pytorch是什么?干什么用的?
TensorFlow和Pytorch都是机器学习框架,允许用户自定义开发机器学习模型(利用已经实现好的神经网络层)。 1. 加载和预处理数据 加载数据:使用合适的库(如 Pandas、Numpy 或 TensorFlow 的数据处理 API)从文…...
采购人可否自行选择采购方式?|数智化招采系统支持多种采购方式
采购人是否有权自行确定采购方式,主要取决于采购项目的性质和规模,特别是是否达到公开招标的数额标准。 一、达到公开招标数额标准以上的项目 《中华人民共和国政府采购法实施条例》第二十三条规定:“采购人采购公开招标数额标准以上的货物…...
ubuntu dde 改为中文
在 Ubuntu Deepin Desktop Environment (DDE) 中,如果已经将系统语言设置为中文,但系统菜单仍然显示英文,可以尝试以下步骤解决: 检查语言设置:确保你的系统语言已经正确设置为中文。你可以在“系统设置”->“区域和…...
Nginx配置小细节,location和proxy_pass 斜杠/ 问题
理解nginx的配置有助于理解前后端调用的过程,这里是location与proxy_pass需要注意的点 location 不带斜杠 的是模糊匹配,例如 location /abc 可以匹配 /abc/index.html,也可以匹配 /abcd/index.html location 带斜杠的是固定匹配,…...
java 解析 PDF OFD 发票 部分文字缺失
1、pdfbox https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox 到这里用最新的版本 最近碰到发票各式各样,千奇百怪:记录其中一个 解析出来是:缺少一个通字 发票好几处都缺少文字,解析出来的是 一个 圆点 原因&…...
C/C++数字与字符串互相转换
前言: 在C/C程序中,会需要把数字与字符串做出互相转换的操作,用于实现程序想要的效果。下面将介绍多种方法实现数字与字符串互相转换。 字符串转为数字 一、利用ASCII 我们知道每个字符都有一个ASCII码,利用这一点可以将字符-0…...
[Spring] Spring AOP
🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏: 🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection与…...
鸿蒙 webview 实现顶部 Progress进度条
1, 先看效果 2, 直接cv代码 import web_webview from ohos.web.webview;interface PerUrl {url: string,age: number } Component export struct webviews {controller: web_webview.WebviewController new web_webview.WebviewController();ports: web_webview.WebMessageP…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
