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

【Gradle-12】分析so文件和依赖的关系

1、前言

在包大小的占比中,so文件的占比往往是最高的,动辄几兆的大小多一个都会把包大小的指标打爆。
而在各厂商要求对手机CPU ARM架构进行分包适配的情况下,你更需要知道哪些依赖是没有适配v7a/v8a的,这将影响你的APP在应用市场的审核。
所以搞清楚so文件和依赖的关系,它不仅是一个技术指标归因的工具,也是应对厂商分包适配的利器。

2、分析APK

我们一般分析APK是通过Android Studio提供的Analyze APK工具,可以清晰的看到APK文件的组成部分,比如lib文件夹下有哪些so文件,但是却无法直观的看出这些so文件属于哪个依赖。
如下图:
analyze apk.png

3、so文件怎么来的

想要知道so文件是属于哪个依赖,那么得先搞清楚so文件是怎么来的。
如果你分析过apk里面的so文件,你会发现,除了项目中lib文件夹下手动添加的so文件之外,还有一些不知道是哪来的。
要想搞清楚这个,你还得知道我们的依赖是依赖的什么东西。

以okhttp为例:

implementation 'com.squareup.okhttp3:okhttp:4.10.0'

我们通过GAV坐标依赖的实际是square公司发布的jar/aar文件
jar.png
所以,除了你自己添加的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把文件里面所有的子文件打出来。
输出:
输出1.png
可以看到,已经把所有的子文件都打出来了,包括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&#xff1a;https://github.com/mozilla/pdf.js pdfjsLib是一个开源项目&#xff0c;您可以在GitHub上找到其源代码和相关资源。 2.放置文件位置 3.进入 在index.html引入 <script src"<% BASE_URL %>static/pdfjs-dist/b…...

企业计算机中了mkp勒索病毒怎么办,服务器中了勒索病毒如何处理

计算机技术的不断发展给企业的生产生活提供了极大便利&#xff0c;但也为企业带来了网络安全威胁。近期&#xff0c;云天数据恢复中心陆续接到很多企业的求助&#xff0c;企业的计算机服务器遭到了mkp勒索病毒攻击&#xff0c;导致企业的所有工作无法正常开展&#xff0c;给企业…...

Android拖放startDragAndDrop拖拽Glide加载堆叠圆角图,Kotlin(5)

Android拖放startDragAndDrop拖拽Glide加载堆叠圆角图&#xff0c;Kotlin&#xff08;5&#xff09; 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、时间&#xff1a;1994-2021年 2、来源&#xff1a;原始数据整理自能源年鉴 3、指标&#xff1a;统计年度、行业代码、行业名称、煤炭二氧化碳排放量、焦炭二氧化碳排放量、原油二氧化碳排放量、汽油二氧化碳排放量、煤油二氧化碳排放…...

如何进行Go程序的打包发布

上一篇&#xff0c;我们已经用GoLand开发了第一个程序Hello Kitty,接下去&#xff0c;我们将完成Go程序的打包发布。 执行&#xff1a; go build -x main.gogo build 和 go run 在编译过程中其实是差不多的&#xff0c;不同之处是 go build 会生成编译好二进制文件并删掉编译…...

python工具HIKVISION视频编码设备接入网关任意文件下载

python工具 构造payload /serverLog/downFile.php?fileName../web/html/serverLog/downFile.php漏洞证明 文笔生疏&#xff0c;措辞浅薄&#xff0c;望各位大佬不吝赐教&#xff0c;万分感谢。 免责声明&#xff1a;由于传播或利用此文所提供的信息、技术或方法而造成的任何…...

[NLP] 使用Llama.cpp和LangChain在CPU上使用大模型

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

开发知识点-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的预训练和微调

模型输入无标签文本&#xff08;Text without annotation&#xff09;&#xff0c;通过消耗大量计算资源预训练&#xff08;Pre-train&#xff09;得到一个可以读懂文本的模型&#xff0c;在遇到有监督的任务是微调&#xff08;Fine-tune&#xff09;即可。 最具代表性是BERT&…...

Android codec2 视频框架 之输入buffer

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

Python实现局部二进制算法(LBP)

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

如何评价现在的CSGO游戏搬砖市场

如何评价现在的csgo市场&#xff1f; 其实整个搬砖市场&#xff0c;现在已经变得乌烟瘴气&#xff0c;散发着“恶臭”。我个人非常鄙视那些虚有其表&#xff0c;大小通吃的做法&#xff0c;那些甚至连搬砖数据都看不懂的人&#xff0c;也出来吹嘘着“实力强大&#xff0c;经验丰…...

ResourceQuota对象在K8s上的说明

ResourceQuota资源对象的说明&#xff0c;以及在集群中的作用说明 定义说明 https://kubernetes.io/zh-cn/docs/concepts/policy/resource-quotas/ 集群中的资源组的划分和设计 在具有 32 GiB 内存和 16 核 CPU 资源的集群中&#xff0c;允许 A 团队使用 20 GiB 内存 和 10 核…...

悟空crm二次开发 增加客户保护功能 (很久没有消息,但是有觉得有机会的客户)就进入了保护转态

需求&#xff1a;客户信息录入不限数量&#xff0c;但是录入的信息1个月内只有自己和部门领导能看到&#xff0c;如果1个月内未成交或者未转移至自己的客保 则掉入公海所有人可见&#xff0c;这里所说的客保就是现在系统自带的客保 1、需求思维导图 2、新增保护按钮 3、点击该…...

k8s之配置资源管理

一&#xff0c;secret Secret 是用来保存密码、token、密钥等敏感数据的 k8s 资源&#xff0c;这类数据虽然也可以存放在 Pod 或者镜像中&#xff0c;但是放在 Secret 中是为了更方便的控制如何使用数据&#xff0c;并减少暴露的风险。 有三种类型&#xff1a; 1&#xff0c;k…...

赛氪助力全国大学生数学竞赛山东赛区圆满举办

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

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题目来源题目解读解题思路方法一&#xff1a;逐位颠倒方法二&#xff1a;分治 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于…...

十分钟了解自动化测试

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

别再手动装软件了!用Miniconda一键搞定转录组上游分析环境(Ubuntu 20.04保姆级教程)

告别手动安装&#xff1a;用Miniconda构建可复现的转录组分析环境 刚接触生物信息学的同学往往会被各种软件依赖和版本冲突折磨得焦头烂额。记得我第一次搭建转录组分析环境时&#xff0c;花了整整三天时间在解决各种"Command not found"和"Library not found&q…...

低代码开发,让企业应用搭建不再难

一、开头你知道吗&#xff1f;传统开发企业应用往往需要耗费大量时间和人力&#xff0c;而现在&#xff0c;低代码开发的出现&#xff0c;让企业应用搭建变得如行云流水般简单。低代码开发平台以其独特的优势&#xff0c;正在改变企业数字化转型的进程。二、主体部分&#xff0…...

Phi-4-mini-reasoning开源可部署优势凸显|ollama镜像免配置实操手册

Phi-4-mini-reasoning开源可部署优势凸显&#xff5c;ollama镜像免配置实操手册 想快速体验高质量推理模型却苦于复杂部署&#xff1f;Phi-4-mini-reasoning Ollama组合让你3分钟搞定专业级AI助手 1. 为什么选择Phi-4-mini-reasoning&#xff1f; 如果你正在寻找一个既强大又…...

别再只盯着线宽了!PCB设计新手必懂的差分布线与等长布线实战避坑指南

高速PCB设计进阶&#xff1a;差分布线与等长布线的工程化实践 第一次在Altium Designer里看到DRC报出密密麻麻的差分对长度误差警告时&#xff0c;我盯着屏幕上那些红色波浪线足足愣了三分钟——明明按照教科书上的理论设置了90Ω阻抗&#xff0c;为什么实际布线后信号眼图还是…...

Git仓库创建与初始化:本地与克隆的奥秘

Git仓库创建与初始化:本地与克隆的奥秘 昨天隔壁组的小王跑过来问我:“哥,我本地改了一堆代码,现在想用Git管起来,该直接git init还是从远程仓库拉?” 我看了眼他满屏的临时文件,叹了口气——这问题看似基础,但选错起手式,后续协作全是坑。 从一次血泪调试说起 上个…...

别再只用GPT了!用这份电商客服数据集,5分钟本地微调你的专属行业大模型

5分钟打造电商专属AI客服&#xff1a;低成本微调实战指南 电商行业每天面对海量重复咨询——"我的快递到哪了&#xff1f;"、"商品能退换吗&#xff1f;"、"有没有优惠券&#xff1f;"。传统客服团队成本高昂&#xff0c;而通用大模型API不仅按量…...

Unity游戏开发中的穿山甲广告SDK集成实战

1. 穿山甲广告SDK基础认知 第一次接触穿山甲广告SDK时&#xff0c;我和很多开发者一样感到无从下手。这个由字节跳动推出的广告聚合平台&#xff0c;其实就像游戏里的"金币商人"——它帮助我们把游戏内的广告位变成真金白银的收入。根据官方数据&#xff0c;使用穿山…...

Java程序员转大模型开发:从入门到落地,小白也能轻松上手

在AI技术飞速迭代、大模型从实验室走向产业落地的今天&#xff0c;传统编程领域的Java程序员正面临着新的职业选择——转型大模型开发。这不仅是一场跨越技术边界的挑战&#xff0c;更是一次实现职业升级、突破薪资瓶颈的绝佳机遇。相比于陷入传统开发的内卷&#xff0c;借助大…...

AI智能证件照工坊值得部署吗?隐私安全+离线运行实测分析

AI智能证件照工坊值得部署吗&#xff1f;隐私安全离线运行实测分析 1. 这不是P图工具&#xff0c;而是一台“证件照打印机” 你有没有过这样的经历&#xff1a;临时要交简历&#xff0c;发现手机里没有合规的证件照&#xff1b;赶着办护照&#xff0c;照相馆排队两小时&#…...

从“普惠”到“全能”:全志T153工业芯如何以HZ-T153_MiniEVM重塑工控开发体验

1. 为什么工业控制需要"普惠型"芯片&#xff1f; 在工业自动化领域&#xff0c;设备制造商常常面临一个两难选择&#xff1a;要么采用性能强大但价格昂贵的外国芯片方案&#xff0c;要么选择价格低廉但功能受限的入门级控制器。全志T153的出现打破了这种局面&#xf…...