【Gradle-12】分析so文件和依赖的关系
1、前言
在包大小的占比中,so文件的占比往往是最高的,动辄几兆的大小多一个都会把包大小的指标打爆。
而在各厂商要求对手机CPU ARM架构进行分包适配的情况下,你更需要知道哪些依赖是没有适配v7a/v8a的,这将影响你的APP在应用市场的审核。
所以搞清楚so文件和依赖的关系,它不仅是一个技术指标归因的工具,也是应对厂商分包适配的利器。
2、分析APK
我们一般分析APK是通过Android Studio提供的Analyze APK
工具,可以清晰的看到APK文件的组成部分,比如lib
文件夹下有哪些so文件,但是却无法直观的看出这些so文件属于哪个依赖。
如下图:
3、so文件怎么来的
想要知道so文件是属于哪个依赖,那么得先搞清楚so文件是怎么来的。
如果你分析过apk里面的so文件,你会发现,除了项目中lib文件夹下手动添加的so文件之外,还有一些不知道是哪来的。
要想搞清楚这个,你还得知道我们的依赖是依赖的什么东西。
以okhttp为例:
implementation 'com.squareup.okhttp3:okhttp:4.10.0'
我们通过GAV坐标依赖的实际是square公司发布的jar/aar
文件
所以,除了你自己添加的so文件之外,其余的,都是通过依赖导进来的。
ok,整体思路我们捋一下:
Gradle管理依赖会自动去下载jar/aar,然后我们通过遍历所有依赖,拿到对应的jar/arr,再去获取其中对应的so文件。
听起来并不复杂,实际上也很简单,下面来实战一下。
4、实战
4.1、栗子
以阿里云音视频SDK为例,它一定是包含so文件的,我不信它不用FFmpeg🐶。
添加示例依赖:
//8.全功能:直播推流(含超低延时直播、RTC连麦)+短视频+播放器+美颜特效implementation 'com.aliyun.aio:AliVCSDK_Premium:6.4.0'
其他配置就不赘述了,可以自行去看文档。
别忘了添加ndk
配置,否则so打不进去。
defaultConfig {ndk {abiFilters 'arm64-v8a', 'armeabi-v7a', 'armeabi-v8a'}}
4.2、遍历
ok,准备工作到位,写个插件遍历所有的依赖文件并打印出来。
Configuration configuration = project.getConfigurations().getByName(applicationVariant.getName() + "CompileClasspath");
configuration.forEach(file -> {System.out.println(TAG + "file " + file.getName());String fineName = file.getName();if (fineName.endsWith(".jar") || fineName.endsWith(".aar")) {try {JarFile jarFile = new JarFile(file);for (Enumeration enums = jarFile.entries(); enums.hasMoreElements(); ) {JarEntry jarEntry = (JarEntry) enums.nextElement();System.out.println(TAG + "jarEntry " + jarEntry.getName());}} catch (IOException e) {throw new RuntimeException(e);}}
});
这里在Project评估完成之后,获取Configuration对象,然后遍历所有的依赖文件,最后通过JarEntry把文件里面所有的子文件打出来。
输出:
可以看到,已经把所有的子文件都打出来了,包括jni/、res/、assets/等等。
4.3、优化
上面的输出还不够直观,我们在过滤一下,只打印so文件,然后优化一下打印的格式。
configuration.forEach(file -> {String fineName = file.getName();System.out.println(TAG + "fine name = " + fineName);if (fineName.endsWith(".jar") || fineName.endsWith(".aar")) {try {JarFile jarFile = new JarFile(file);for (Enumeration enums = jarFile.entries(); enums.hasMoreElements(); ) {JarEntry jarEntry = (JarEntry) enums.nextElement();if (jarEntry.getName().endsWith(".so")){System.out.println(TAG + "----- so name = " + jarEntry.getName());}}} catch (IOException e) {throw new RuntimeException(e);}}
});
最终效果:
//...
GradleXPlugin >>>>> fine name = AliVCSDK_Premium-6.4.0.aar
GradleXPlugin >>>>> ----- so name = jni/arm64-v8a/libMNN_CL.so
GradleXPlugin >>>>> ----- so name = jni/arm64-v8a/libalivcffmpeg.so
GradleXPlugin >>>>> ----- so name = jni/arm64-v8a/liball_in_one.so
GradleXPlugin >>>>> ----- so name = jni/arm64-v8a/libMNN.so
GradleXPlugin >>>>> ----- so name = jni/armeabi-v7a/libMNN_CL.so
GradleXPlugin >>>>> ----- so name = jni/armeabi-v7a/libalivcffmpeg.so
GradleXPlugin >>>>> ----- so name = jni/armeabi-v7a/liball_in_one.so
GradleXPlugin >>>>> ----- so name = jni/armeabi-v7a/libMNN.so
//...
是不是还挺简单的~
5、最后
如果你不想自己写,这个插件我也发布远端了,按照下面三步走,即可使用。
Step 1. Add the JitPack repository to your build file
repositories {...maven { url 'https://jitpack.io' }
}
Step 2. Add the dependency
dependencies {classpath('com.github.yechaoa.GradleX:plugin:1.2')
}
Step 3. Add the Plugin Id to your build file and configure the gradleX{ } dsl
plugins {id 'com.yechaoa.plugin.gradleX'
}gradleX {printDependencies = falseanalysisSo = true
}
ok,以上即是本文介绍内容,学废了吗,写作不易,快来三连~
6、GitHub
https://github.com/yechaoa/GradleX
相关文章:

【Gradle-12】分析so文件和依赖的关系
1、前言 在包大小的占比中,so文件的占比往往是最高的,动辄几兆的大小多一个都会把包大小的指标打爆。 而在各厂商要求对手机CPU ARM架构进行分包适配的情况下,你更需要知道哪些依赖是没有适配v7a/v8a的,这将影响你的APP在应用市场…...

vue项目pdf文件的预览
1.下载 您可以在以下网址下载pdfjsLib:https://github.com/mozilla/pdf.js pdfjsLib是一个开源项目,您可以在GitHub上找到其源代码和相关资源。 2.放置文件位置 3.进入 在index.html引入 <script src"<% BASE_URL %>static/pdfjs-dist/b…...

企业计算机中了mkp勒索病毒怎么办,服务器中了勒索病毒如何处理
计算机技术的不断发展给企业的生产生活提供了极大便利,但也为企业带来了网络安全威胁。近期,云天数据恢复中心陆续接到很多企业的求助,企业的计算机服务器遭到了mkp勒索病毒攻击,导致企业的所有工作无法正常开展,给企业…...
Android拖放startDragAndDrop拖拽Glide加载堆叠圆角图,Kotlin(5)
Android拖放startDragAndDrop拖拽Glide加载堆叠圆角图,Kotlin(5) import android.content.ClipData import android.graphics.Canvas import android.graphics.Point import android.os.Bundle import android.util.Log import android.view.…...

1994-2021年分行业二氧化碳排放量数据
1994-2021年分行业二氧化碳排放量数据 1、时间:1994-2021年 2、来源:原始数据整理自能源年鉴 3、指标:统计年度、行业代码、行业名称、煤炭二氧化碳排放量、焦炭二氧化碳排放量、原油二氧化碳排放量、汽油二氧化碳排放量、煤油二氧化碳排放…...
如何进行Go程序的打包发布
上一篇,我们已经用GoLand开发了第一个程序Hello Kitty,接下去,我们将完成Go程序的打包发布。 执行: go build -x main.gogo build 和 go run 在编译过程中其实是差不多的,不同之处是 go build 会生成编译好二进制文件并删掉编译…...

python工具HIKVISION视频编码设备接入网关任意文件下载
python工具 构造payload /serverLog/downFile.php?fileName../web/html/serverLog/downFile.php漏洞证明 文笔生疏,措辞浅薄,望各位大佬不吝赐教,万分感谢。 免责声明:由于传播或利用此文所提供的信息、技术或方法而造成的任何…...

[NLP] 使用Llama.cpp和LangChain在CPU上使用大模型
一 准备工作 下面是构建这个应用程序时将使用的软件工具: 1.Llama-cpp-python 下载llama-cpp, llama-cpp-python [NLP] Llama2模型运行在Mac机器-CSDN博客 2、LangChain LangChain是一个提供了一组广泛的集成和数据连接器,允许我们链接和编排不同的模块。可以常…...

开发知识点-Ant-Design-Vue
Ant-Design-Vue a-input a-input Vue组件 a-spin 加载中的效果 data字段 mounted钩子函数 Ant Design Vue 组件库 list-type“picture-card” 上传的图片作为卡片展示 name show-upload-list action :beforeUpload“handleBeforeUpload” :headers“customHeaders” :disabl…...

2022最新版-李宏毅机器学习深度学习课程-P50 BERT的预训练和微调
模型输入无标签文本(Text without annotation),通过消耗大量计算资源预训练(Pre-train)得到一个可以读懂文本的模型,在遇到有监督的任务是微调(Fine-tune)即可。 最具代表性是BERT&…...

Android codec2 视频框架 之输入buffer
文章目录 输入端的内存管理输入数据包buffer结构体的转换 主要的流程如上, 申请内存在CCodecBufferChannel,申请之后回调到MediaCodec。然后应用从MediaCodec获取 将解码数据放到buffer中,CCodecBufferChannel在将这块buffer 送到componet模块…...

Python实现局部二进制算法(LBP)
1.介绍 局部二进制算法是一种用于获取图像纹理的算法。这算法可以应用于人脸识别、纹理分类、工业检测、遥感图像分析、动态纹理识别等领域。 2.示例 """ 局部二进制算法,计算图像纹理特征 """ import cv2 import numpy as np imp…...

如何评价现在的CSGO游戏搬砖市场
如何评价现在的csgo市场? 其实整个搬砖市场,现在已经变得乌烟瘴气,散发着“恶臭”。我个人非常鄙视那些虚有其表,大小通吃的做法,那些甚至连搬砖数据都看不懂的人,也出来吹嘘着“实力强大,经验丰…...
ResourceQuota对象在K8s上的说明
ResourceQuota资源对象的说明,以及在集群中的作用说明 定义说明 https://kubernetes.io/zh-cn/docs/concepts/policy/resource-quotas/ 集群中的资源组的划分和设计 在具有 32 GiB 内存和 16 核 CPU 资源的集群中,允许 A 团队使用 20 GiB 内存 和 10 核…...

悟空crm二次开发 增加客户保护功能 (很久没有消息,但是有觉得有机会的客户)就进入了保护转态
需求:客户信息录入不限数量,但是录入的信息1个月内只有自己和部门领导能看到,如果1个月内未成交或者未转移至自己的客保 则掉入公海所有人可见,这里所说的客保就是现在系统自带的客保 1、需求思维导图 2、新增保护按钮 3、点击该…...
k8s之配置资源管理
一,secret Secret 是用来保存密码、token、密钥等敏感数据的 k8s 资源,这类数据虽然也可以存放在 Pod 或者镜像中,但是放在 Secret 中是为了更方便的控制如何使用数据,并减少暴露的风险。 有三种类型: 1,k…...

赛氪助力全国大学生数学竞赛山东赛区圆满举办
近日,全国大学生数学竞赛山东赛区比赛有序进行,赛氪已连续6年助力本项赛事蓬勃发展。在中国高等教育学会高校竞赛评估与管理体系研究专家工作组发布的《2022全国普通高校大学生竞赛分析报告》中,本赛事荣登观察目录。 全国大学生数学竞赛旨在…...

pytorch基础语法问题
这里写目录标题 pytorch基础语法问题shapetorch.ones_like函数和torch.zeros_like函数y.backward(torch.ones_like(x), retain_graphTrue)torch.autograd.backward参数grad_tensors: z.backward(torch.ones_like(x))来个复杂例子z.backward(torch.Tensor([[1., 0]])更复杂例子实…...

【面试经典150 | 】颠倒二进制位
文章目录 写在前面Tag题目来源题目解读解题思路方法一:逐位颠倒方法二:分治 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更…… 专栏内容以分析题目为主,并附带一些对于…...

十分钟了解自动化测试
自动化测试 自动化测试的定义:使用一种自动化测试工具来验证各种软件测试的需求,它包括测试活动的管理与实施、测试脚本的开发与执行。 自动化测试只是测试工作的一部分,是对手工测试的一种补充; 自动化测试绝不能代替手工测试;多数情况下&…...

idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...

定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...

EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...