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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/838748.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Webstorm开发插件

WebStorm是一款由JetBrains开发的强大的JavaScript集成开发环境&#xff08;IDE&#xff09;&#xff0c;它为开发人员提供了丰富的功能和工具来提高开发效率。与此同时&#xff0c;WebStorm还支持插件开发&#xff0c;允许用户根据自己的需要扩展和定制IDE的功能。在本文中&am…

解放双手,批量自动上传视频到微信视频号

文件夹里面有很多视频&#xff0c;一个个手工上传到视频号很麻烦&#xff0c;可以借助AI来自动化。 先把视频号上传流程熟悉一遍&#xff0c;把一些按钮截图&#xff0c;记录一些屏幕坐标。 然后&#xff0c;在deepseek的代码助手中输入提示词&#xff1a; 你是一个Python编程…

Error: incorrect data check at Zlib.zlibOnError [as onerror] (node:zlib:189:17)

在macos Intel芯片本上运行yarn install报错&#xff1a; error https://registry.yarnpkg.com/esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz: incorrect data check error https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz: incorrec…

机器学习-SVM预测

本文使用机器学习SVM对数据进行预测。仅供参考 1、数据 1.1 训练数据集&#xff1a; medol.xlsx文件示例 otv3015-1.9153622093018-1.9634097763021-1.7620284083024-1.789477583 1.2 预测数据集 test.xlsx文件示例 ot35163519 2、模型训练 train.py import pandas as …

软件工程期末复习(8)需求的表达方法和状态转换图

需求的表达方法 系统模型 需求分析的任务就是借助于当前系统的逻辑模型导出目标系统的逻辑模型&#xff0c;解决目标系统 “做什么” 的问题 通常软件开发项目是要实现目标系统的物理模型。目标系统的具体物理模型是由它的逻辑模型经实例化&#xff0c;即具体到某个业务领域而…

韵搜坊 -- java爬虫抓取数据

文章目录 三种抓取方式数据抓取的流程获取文章具体操作 获取用户获取图片jsoup操作 三种抓取方式 直接调用请求接口(最方便&#xff0c;这里使用该方法) HttpClient,OKHttp,RestTemplate,Hutool等网页渲染出明文内容后&#xff0c;从前端页面的内容抓取有些网站可能是动态请求…

第三十二天 | 46.全排列 47.全排列||

终于进入排列&#xff01;&#xff08;之前都是组合&#xff09; 排列和组合的区别&#xff1a;在数学上的区别都懂&#xff0c;主要是看在代码实现上有什么区别 题目&#xff1a;46.全排列 树型结构比较简单 用used标记某一元素是否使用过。在组合问题中&#xff0c;其实是…

【制作100个unity游戏之26】unity2d横版卷轴动作类游戏7(附带项目源码)

最终效果 系列导航 文章目录 最终效果系列导航前言血条 能量条UI配置画布绘制血条 能量条UI 头像框 延迟虚血源码完结 前言 欢迎来到【制作100个Unity游戏】系列&#xff01;本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第26篇中&#xff0c;我们将探索如何…

C语言指向结构体数组的指针如何应⽤?

一、问题 在使⽤数组时&#xff0c;可以⽤指向数组或数组元素的指针和指针变量。同样&#xff0c;在结构体类型的数组及其元素中也可以应⽤指针或指针变量来指向。具体怎么应⽤呢&#xff1f; 二、解答 在如下代码中实现指向结构体数组的指针的应⽤。 #include <stdio.h&g…

【华为OD机试-C卷D卷-200分】找城市(C++/Java/Python)

【华为OD机试】-(A卷+B卷+C卷+D卷)-2024真题合集目录 【华为OD机试】-(C卷+D卷)-2024最新真题目录 题目描述 一张地图上有n个城市,城市和城市之间有且只有一条道路相连:要么直接相连,要么通过其它城市中转相连(可中转一次或多次)。城市与城市之间的道路都不会成环。 当…

token存入前端的请求头中,后端获取【秒杀项目】

token存入前端的请求头中,后端获取【秒杀项目】 前言token存入前端的请求头中,后端获取【秒杀项目】token存入前端的请求头中后端获取 前言 2023-08-28 17:34:39 token存入前端的请求头中,后端获取【秒杀项目】 token存入前端的请求头中 function set_login_status() {var …

数据库设计大题详解

大题一&#xff1a;画E-R图&#xff08;概念结构设计&#xff09; 实体就是具体的物品&#xff0c;关系就是实体之间的关系&#xff0c;属性就是特征&#xff0c;内涵的意思 简单的小栗子&#xff1a; 1对1&#xff0c;1对n&#xff0c;n对m&#xff0c;自己考虑两者存在这个关…

PatterNodes 3 mac矢量图设计 ,色彩与图案的完美融合!

PatterNodes 3 for Mac是一款功能强大的矢量图形模式创建软件&#xff0c;专为Mac用户设计。它采用基于节点的界面&#xff0c;支持创建形状、线条、曲线或文本&#xff0c;以构建复杂的矢量图形模式。该软件还具备灵活的参数调整功能&#xff0c;允许用户实时预览结果并进行无…

根据参考风格进行矢量图绘制

摘要 利用机器学习根据给定的文本描述生成图像的技术已经取得了显著的进步&#xff0c;例如CLIP图像-文本编码器模型的发布&#xff1b;然而&#xff0c;当前的方法缺乏对生成图像风格的艺术控制。我们提出了一种方法&#xff0c;用于为给定的文本描述生成指定风格的绘图&…

Spring框架学习笔记(三):AOP编程

1 动态代理 1.1 通过案例理解动态代理 &#xff08;1&#xff09;需求说明&#xff1a; 1. 有 Vehicle接口(交通工具接口, 有一个 run 方法), 下面有两个实现类 Car 和 Ship 2. 当运行 Car 对象 的 run 方法和 Ship 对象的 run 方法时&#xff0c;输入如下内容, 注意观察前后…

HTML静态网页成品作业(HTML+CSS+JS)——在线购物商城网页设计制作(4个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;使用Javacsript代码实现图片轮播切换&#xff0c;共有4个页面。 二、…

手机图片恢复不求人:手动找回丢失的照片!

无论是外出旅行、聚会还是日常点滴&#xff0c;我们总是习惯用手机记录下来&#xff0c;让美好的瞬间定格在一张张照片中。然而&#xff0c;有时因为误删、清空缓存或是更换手机&#xff0c;那些珍贵的照片突然消失了。手机图片恢复有什么简单易行、容易上手的方法吗&#xff1…

头歌答案哪里找

头歌EduCoder平台实训答案在此&#xff1a;实训笔记 有些作业是在难写&#xff0c;参考上面的连接地址吧&#xff0c;看看有没有自己想要的解答。

容器组件:角标组件,纵向拖动组件(HarmonyOS学习第四课【4.2】)

Badge&#xff08;角标组件&#xff09; 可以附加在单个组件上用于信息标记的容器组件。 说明 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 支持单个子组件。 说明 子组件类型&#xff1a;系统组件…

Win端交叉编译鸿蒙Ohos Native层第三方库流程

1. 概述 鸿蒙端SDK开发需要依赖使用到的三方库(如OpenCV、其他C库等)&#xff0c;以下为Windows端交叉编译Ohos端三方库流程 2. 准备工作 与Android NDK交叉编译相类似&#xff0c;我们首先需要下载OpenHarmony NDK(包含在OpenHarmony SDK中)&#xff0c;这里笔者使用IDE中自…