当前位置: 首页 > news >正文

安卓将子模块打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: 添加插件
在你想要打包的子Moudlebuild.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-javaexception-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,还有其他协议,具体协议由端口来确定&#xff09…...

大数据-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 带斜杠的是固定匹配&#xff0c…...

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…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来&#xf…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...

MinIO Docker 部署:仅开放一个端口

MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

对象回调初步研究

_OBJECT_TYPE结构分析 在介绍什么是对象回调前,首先要熟悉下结构 以我们上篇线程回调介绍过的导出的PsProcessType 结构为例,用_OBJECT_TYPE这个结构来解析它,0x80处就是今天要介绍的回调链表,但是先不着急,先把目光…...

react-pdf(pdfjs-dist)如何兼容老浏览器(chrome 49)

之前都是使用react-pdf来渲染pdf文件,这次有个需求是要兼容xp环境,xp上chrome最高支持到49,虽然说iframe或者embed都可以实现预览pdf,但为了后续的定制化需求,还是需要使用js库来渲染。 chrome 49测试环境 能用的测试…...

零基础在实践中学习网络安全-皮卡丘靶场(第十一期-目录遍历模块)

经过前面几期的内容我们学习了很多网络安全的知识,而这期内容就涉及到了前面的第六期-RCE模块,第七期-File inclusion模块,第八期-Unsafe Filedownload模块。 什么是"遍历"呢:对学过一些开发语言的朋友来说应该知道&…...

LINUX编译vlc

下载 VideoLAN / VLC GitLab 选择最新的发布版本 准备 sudo apt install -y xcb bison sudo apt install -y autopoint sudo apt install -y autoconf automake libtool编译ffmpeg LINUX FFMPEG编译汇总(最简化)_底部的附件列表中】: ffmpeg - lzip…...

视觉slam--框架

视觉里程计的框架 传感器 VO--front end VO的缺点 后端--back end 后端对什么数据进行优化 利用什么数据进行优化的 后端是怎么进行优化的 回环检测 建图 建图是指构建地图的过程。 构建的地图是点云地图还是什么信息的地图? 建图并没有一个固定的形式和算法…...