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

apk-parse包信息解析

最近公司做项目,需要解析apk包的基本信息,上网找了好多资料,最终决定使用apk-parse。

.yml文件

引入jar包

<dependency>
<groupId>net.dongliu</groupId>
<artifactId>apk-parser</artifactId>
<version>2.6.10</version>
</dependency>

解析操作代码

/**
* 解析apk
* @param apkFile 文件
* @return
* @throws IOException
*/

public ApkParseVo parseApk(MultipartFile apkFile){
File tempFile=null;
ApkParseVo apkParseVo=new ApkParseVo();
if (ObjectUtil.isNull(apkFile)) {
throw new ServiceException("上传文件不能为空");
}
// 获取后缀名
String suffix = apkFile.getOriginalFilename().substring(apkFile.getOriginalFilename().lastIndexOf(".")+1);
if(StringUtils.isBlank(suffix)){
throw new ServiceException("后缀名不能为空");
}
// 后缀名是apk 解析信息
else if(apkSuffix.equals(suffix)){
ApkMeta apkMeta=null;
try{
// 临时文件
tempFile =new File(tempPath+apkSuffix+"\\"+new Date().getTime()+"."+suffix);
try(FileOutputStream fileOutputStream = new FileOutputStream(tempFile)) {
fileOutputStream.write(apkFile.getBytes());
} catch (IOException e) {
throw new ServiceException("输出错误");
}
try (ApkFile apk = new ApkFile(tempFile)) {
apkMeta=apk.getApkMeta();
} catch (Exception e) {

}
}catch (Exception e){
throw new ServiceException("出错了");
}
if(ObjectUtil.isNull(apkMeta)){
throw new ServiceException("出错了");
}

// 输出解析信息
System.out.println(PlatformEnum.ANDROID.getCode());
System.out.println(apkMeta.getLabel());
System.out.println(apkMeta.getVersionName());
System.out.println(apkMeta.getVersionCode().toString());
System.out.println(apkMeta.getPackageName());
// 上传图片
String icons=apkMeta.getIcon();
if(StringUtils.isNotBlank(icons)){
// 这里传参的packageName是在resource目录下创建的文件名,具体的可以灵活修改
File iconFile=new File(saveBit(icons, tempFile));


// 删除文件
FileUtils.del(iconFile);
}
}
// 删除apk临时文件
FileUtils.del(tempFile);
return apkParseVo;
}

解析APK中的图片

/**
* 解析apk, 拷贝图标到指定url文件的目录下
*
* @param apkIconUrl apk的iconUrl
* @param tempFile apk临时文件
*/
public String saveBit(String apkIconUrl, File tempFile) {
ZipFile zf=null;
// 输入流
InputStream in=null;
ZipInputStream zin = null;
InputStream inStream =null;
FileOutputStream fileOutStream=null;
ByteArrayOutputStream outStream=null;
// 临时存放路径
String iconPath=tempPath+iconTemp+"\\" + File.separator + new Date().getTime()+".png";
try {
// 访问apk 里面的文件
zf = new ZipFile(tempFile);
in = new BufferedInputStream(new FileInputStream(tempFile));
zin = new ZipInputStream(in);
ZipEntry ze;
while ((ze = zin.getNextEntry()) != null) {
if (ze.getName().equals(apkIconUrl)) {
inStream = zf.getInputStream(ze);
outStream = new ByteArrayOutputStream();
// 创建一个Buffer字符串
byte[] buffer = new byte[1024];
// 每次读取的字符串长度,如果为-1,代表全部读取完毕
int len = 0;
// 使用一个输入流从buffer里把数据读取出来
while ((len = inStream.read(buffer)) != -1) {
// 用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度
outStream.write(buffer, 0, len);
}
// 把outStream里的数据写入内存
// 得到图片的二进制数据,以二进制封装得到数据,具有通用性
byte[] data = outStream.toByteArray();
// new一个文件对象用来保存图片,默认保存当前工程根目录
File imageFile = new File(iconPath);
// 创建输出流
fileOutStream = new FileOutputStream(imageFile);
// 写入数据
fileOutStream.write(data);
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
// 关闭输入流
assert zf != null;
zf.close();
assert in != null;
in.close();
assert zin != null;
zin.close();
assert inStream != null;
inStream.close();
assert outStream != null;
outStream.close();
assert fileOutStream != null;
fileOutStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return iconPath;
}

相关文章:

apk-parse包信息解析

最近公司做项目&#xff0c;需要解析apk包的基本信息&#xff0c;上网找了好多资料&#xff0c;最终决定使用apk-parse。 .yml文件 引入jar包 <dependency> <groupId>net.dongliu</groupId> <artifactId>apk-parser</artifactId> <version&…...

AI绘画进阶工具ComfyUI 傻瓜整合包安装教程!模型共享,一键安装!

哈喽大家好&#xff0c;今天给大家分享一下AI绘画工具Stable Diffusion的另一种UI界面&#xff0c;常见的有&#xff1a; 窗口式界面的WebUI 节点式工作流的ComfyUI ComfyUI更加进阶一些&#xff0c;是一个节点式工作流的AI绘画界面&#xff0c;它高度可定制、自定义编辑Ai生…...

无人机摄影测量数据处理、三维建模及在土方量计算

原文链接&#xff1a;无人机摄影测量数据处理、三维建模及在土方量计算https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247603776&idx2&snd96440e116900a46a71c45ff77316896&chksmfa8217a7cdf59eb15da39dd6366378b98ca39b9c836b76a473ff292b67ee37a6ff6…...

大模型平台后端开发(xiaomi)

文章目录 算法题 算法题 1 三数之和 &#xff08;注意去重的边界条件&#xff0c;过几天再刷几次&#xff09; 2 长度最小的子数组 (代码随想录题目&#xff0c;滑动窗口) 3 用链表实现栈 package mainimport ("errors""fmt" )// Node 定义链表节点 type…...

性能测试工具—jmeter的基础使用

1.Jmeter三个重要组件 1.1线程组的介绍&#xff1a; 特点&#xff1a; 模拟用户&#xff0c;支持多用户操作多个线程组可以串行执行&#xff0c;也可以并行执行 线程组的分类&#xff1a; setup线程组&#xff1a;前置处理&#xff0c;初始化普通线程组&#xff1a;编写…...

前端 JS 经典:CommonJs 规范

1. Node 环境介绍 CommonJs 简称 CMJ&#xff0c;CMJ 的模块标准&#xff0c;必须在 node 的环境中才支持。在浏览器中用&#xff0c;是不行的。 查看电脑是否安装 node&#xff0c;通过打开终端&#xff0c;运行 node -v 查看是否返回 node 版本。返回则已安装。 CMJ 在 no…...

三分钟速览量化交易系统:揭秘QMT与Ptrade(内附免费提供渠道)

在当今金融市场的快速发展中&#xff0c;量化交易系统以其独特的优势&#xff0c;逐渐成为投资者们追求稳定收益的重要工具。其中&#xff0c;QMT和Ptrade作为两大知名的量化交易平台&#xff0c;受到了广泛关注。本文将带您在三分钟内快速了解量化交易系统&#xff0c;并深入揭…...

处理QTcpSocket接收到数据的槽函数

这段代码是一个典型的用于处理QTcpSocket接收到数据的槽函数 onReadyRead()。它尝试从发出信号的QTcpSocket读取数据&#xff0c;并将这些数据添加到一个成员变量 recvList&#xff08;假设这是一个 QList<QString> 类型&#xff09;。整体上&#xff0c;这段代码逻辑是合…...

回归的无分布预测推理

摘要 我们利用保形推理&#xff0c;开发了回归中无分布预测推理的一般框架。所提出的方法允许使用回归函数的任何估计量构建响应变量的预测带。所得的预测带在标准假设下保留了原始估计量的一致性&#xff0c;同时保证了有限样本边际覆盖&#xff0c;即使这些假设不成立。我们…...

有限域中的一些概念

一、单位元&#xff1a; 在自然数中&#xff0c;任意数加上0等于本身&#xff0c;0则为加法的单位元&#xff0c;任意数乘以1等于本身&#xff0c;1则为乘法单位元。 有限域中单位元用e表示&#xff0c;即乘法&#xff0c;加法的单位元都用e表示&#xff0c;不过这两者的e不一样…...

使用css的box-reflect属性制作倒影效果

box-reflect 是一个在 CSS 中创建元素倒影效果的非标准属性。尽管它在过去的一些 WebKit 浏览器中&#xff08;如旧版的 Safari 和 Chrome&#xff09;得到了支持&#xff0c;但由于它并未成为 CSS 标准的一部分&#xff0c;因此在现代浏览器中的兼容性较差。以下是对 box-refl…...

ChatGPT 4o 使用案例之一

2024年GPT迎来重大更新&#xff0c;OpenAI发布GPT-4o GPT-4o&#xff08;“o”代表“全能”&#xff09; 它可以接受任意组合的文本、音频和图像作为输入&#xff0c;并生成任意组合的文本、音频和图像输出。它可以在 232 毫秒内响应音频输入&#xff0c;平均为 320 毫秒&…...

【免费Web系列】大家好 ,今天是Web课程的第一天点赞收藏关注,持续更新作品 !

开干,开干!!! 1. 前端开发介绍 我们介绍Web网站工作流程的时候提到&#xff0c;前端开发&#xff0c;主要的职责就是将数据以好看的样式呈现出来。说白了&#xff0c;就是开发网页程序&#xff0c;如下图所示&#xff1a; 那在讲解web前端开发之前&#xff0c;我们先需要对we…...

C++|树形关联式容器(set、map、multiset、multimap)介绍使用

目录 一、关联式容器介绍 1.1概念 1.2键值对 1.3树形结构的关联式容器 1.3.1pair模板介绍 1.3.2make_pair的介绍 二、set的介绍和使用 2.1set介绍 2.2set使用 2.2.1构造 2.2.2容量 2.2.3修改 三、map的介绍和使用 3.1map介绍 3.2map使用 3.2.1构造 3.2.2容量 …...

springboot整合s3,用ImageIO进行图片格式转换

上次用laravel进行了一些s3得整合&#xff0c;可以看出来其实蛮简单得。 先导包 <dependency><groupId>software.amazon.awssdk</groupId><artifactId>s3</artifactId></dependency> 然后在配置类中写bean private static final String …...

Windows 10无法远程桌面连接:原因及解决方案

在信息技术日益发展的今天&#xff0c;远程桌面连接已成为企业日常运维、技术支持乃至个人用户远程办公的必备工具。然而&#xff0c;有时我们可能会遇到Windows 10无法远程桌面连接的问题&#xff0c;这无疑会给我们的工作和生活带来诸多不便。 原因分析 1、远程访问未启用&a…...

图神经网络实战(10)——归纳学习

图神经网络实战&#xff08;10&#xff09;——归纳学习 0. 前言1. 转导学习与归纳学习2. 蛋白质相互作用数据集3. 构建 GraphSAGE 模型实现归纳学习小结系列链接 0. 前言 归纳学习 (Inductive learning) 通过基于已观测训练数据&#xff0c;建立一个通用模型&#xff0c;使模…...

Python——IO编程

IO在计算机中指Input/Output&#xff0c;也就是输入和输出。由于程序和运行时数据是在内存中驻留&#xff0c;由CPU这个超快的计算核心来执行&#xff0c;涉及到数据交换的地方&#xff0c;通常是磁盘、网络等&#xff0c;就需要IO接口。 比如你打开浏览器&#xff0c;访问新浪…...

什么是网络端口?为什么会有高危端口?

一、什么是网络端口&#xff1f; 网络技术中的端口默认指的是TCP/IP协议中的服务端口&#xff0c;一共有0-65535个端口&#xff0c;比如我们最常见的端口是80端口默认访问网站的端口就是80&#xff0c;你直接在浏览器打开&#xff0c;会发现浏览器默认把80去掉&#xff0c;就是…...

CleanMyMac X v4.14.6中文破解版,让您的电脑像新的一样

小编给您带来CleanMyMac X v4.14.6中文破解版&#xff0c;CleanMyMac X破解版是应用在MacOS上的一款Mac系统清理优化工具&#xff0c;使用cleanmymac x 中文破解版只需两个简单步骤就可以把系统里那些乱七八糟的无用文件统统清理掉&#xff0c;节省宝贵的磁盘空间。 CleanMyMa…...

Solidworks PDM二次开发实战:文件夹权限与数据卡配置详解

1. Solidworks PDM二次开发入门指南 如果你正在使用Solidworks PDM管理产品数据&#xff0c;可能会遇到需要批量创建文件夹并设置权限的场景。比如新项目启动时&#xff0c;需要为不同部门创建标准化的文件夹结构&#xff0c;同时设置工程师只读、管理员完全控制的权限规则。手…...

如何为《欧洲卡车模拟2》实现完整智能驾驶体验?ETS2LA自动驾驶插件终极指南

如何为《欧洲卡车模拟2》实现完整智能驾驶体验&#xff1f;ETS2LA自动驾驶插件终极指南 【免费下载链接】Euro-Truck-Simulator-2-Lane-Assist Plugin based interface program for ETS2/ATS. 项目地址: https://gitcode.com/gh_mirrors/eur/Euro-Truck-Simulator-2-Lane-Ass…...

Windows平台QT BLE开发避坑指南:从环境搭建到稳定通信

1. Windows平台QT BLE开发环境搭建 在Windows平台上使用QT进行BLE开发&#xff0c;首先需要确保开发环境正确配置。我遇到过不少开发者因为环境问题卡在第一步&#xff0c;白白浪费好几天时间。这里分享几个关键点&#xff1a; 编译器选择是第一个坑。实测发现必须使用MSVC编译…...

OSINT自动化平台ClawShield:模块化架构与安全运营实战解析

1. 项目概述&#xff1a;一个面向安全运营的公开情报收集与分析平台最近在整理自己的开源项目收藏夹&#xff0c;发现一个挺有意思的仓库&#xff0c;叫SleuthCo/clawshield-public。乍一看这个名字&#xff0c;“ClawShield”&#xff0c;爪子与盾牌&#xff0c;就透着一股子攻…...

SmarterRouter:基于软件定义与模块化构建智能路由器系统

1. 项目概述&#xff1a;一个更聪明的路由器&#xff0c;它到底想做什么&#xff1f;如果你和我一样&#xff0c;折腾过家里的网络&#xff0c;从刷第三方固件到组软路由&#xff0c;那你肯定对“路由器”这三个字有复杂的感情。它本该是默默无闻的网络基石&#xff0c;却常常因…...

荣品RV1126 SDK编译避坑指南:从环境配置到分区调整,手把手解决常见编译错误

RV1126 SDK编译实战&#xff1a;从环境搭建到分区优化的全流程解决方案 1. 开发环境配置与初始化 RV1126开发环境的搭建是整个开发流程的第一步&#xff0c;也是后续所有工作的基础。一个稳定、高效的开发环境能够显著提升开发效率&#xff0c;减少不必要的错误。 首先需要确保…...

5分钟快速上手:使用res-downloader实现视频号批量下载的终极指南

5分钟快速上手&#xff1a;使用res-downloader实现视频号批量下载的终极指南 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader …...

飞书自动化工具feishu-atuo:Python积木式开发与实战指南

1. 项目概述&#xff1a;飞书自动化&#xff0c;从零到一的效率革命 如果你和我一样&#xff0c;每天的工作流里都离不开飞书&#xff0c;那你肯定也经历过这些时刻&#xff1a;手动把日报、周报从文档复制到表格里归档&#xff1b;在多个群里重复发送同样的通知&#xff1b;为…...

数据质量保证:确保数据准确性和可靠性

数据质量保证&#xff1a;确保数据准确性和可靠性 一、数据质量保证概述 1.1 数据质量保证的定义 数据质量保证是指通过一系列技术和流程&#xff0c;确保数据的准确性、完整性、一致性和及时性的过程。它涉及数据采集、存储、处理和使用的各个环节&#xff0c;确保数据符合业务…...

三维重建下半场,拼的全是底层基建实力!

三维重建已从算法创新竞赛正式迈入基础设施比拼新阶段&#xff0c;主流技术路线逐步收敛&#xff0c;单纯算法红利见顶&#xff0c;行业竞争核心转向数据、算力、平台、生态等底层综合能力。当下竞争不再只比模型效果&#xff0c;而是聚焦四大核心基建维度&#xff1a;采集传感…...