【Android 安装包优化】Android 中使用 7zr 可执行程序 解压缩文件
文章目录
- 一、Android 中使用 7zr 可执行程序 解压缩文件
- 二、完整代码示例
- 三、参考资料
一、Android 中使用 7zr 可执行程序 解压缩文件
在上一篇博客 【Android 安装包优化】Android 中使用 7zr 可执行程序压缩文件 中 , 将 /data/user/0/kim.hsl.a7_zip/files 目录压缩存放到 /data/user/0/kim.hsl.a7_zip/files/files.7z 文件中 ;
拼装 7zr 解压缩命令 :
var cmd = "${exeFile.absolutePath} x ${filesDir.absolutePath}/files.7z -o${filesDir.absolutePath}/unzip_file"
实际命令 :
/data/user/0/kim.hsl.a7_zip/files/7zr x /data/user/0/kim.hsl.a7_zip/files/files.7z -o/data/user/0/kim.hsl.a7_zip/files/unzip_file
执行命令行 :
var process: Process = Runtime.getRuntime().exec(cmd)
使用 7zr 命令压缩文件 :
/*** 使用 7zr 进行解压缩*/fun uncompress7z() {// /data/user/0/kim.hsl.a7_zip/files/7zrvar exeFile = File(filesDir, "7zr")// 执行前赋予可执行权限exeFile.setExecutable(true)var cmd = "${exeFile.absolutePath} x ${filesDir.absolutePath}/files.7z -o${filesDir.absolutePath}/unzip_file"Log.i(TAG, "解压缩命令 : $cmd")var process: Process = Runtime.getRuntime().exec(cmd)// 读取命令执行过程数据var reader = BufferedReader(InputStreamReader(process.inputStream))while (true) {val line = reader.readLine()if (line != null) {Log.i(TAG, "$line")}else{break}}val exitValue = process.exitValue()Log.i(TAG, "解压缩文件 , 执行完毕 , exitValue = $exitValue")}
执行结果 :
解压缩命令 : /data/user/0/kim.hsl.a7_zip/files/7zr x /data/user/0/kim.hsl.a7_zip/files/files.7z -o/data/user/0/kim.hsl.a7_zip/files/unzip_file
7-Zip (a) [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21
p7zip Version 16.02 (locale=utf8,Utf16=on,HugeFiles=on,64 bits,8 CPUs LE)
Scanning the drive for archives:
1 file, 308166 bytes (301 KiB)
Extracting archive: /data/user/0/kim.hsl.a7_zip/files/files.7z
--
Path = /data/user/0/kim.hsl.a7_zip/files/files.7z
Type = 7z
Physical Size = 308166
Headers Size = 168
Method = LZMA2:20
Solid = -
Blocks = 1
Everything is Ok
Folders: 1
Files: 1
Size: 994304
Compressed: 308166
解压缩文件 , 执行完毕 , exitValue = 0
二、完整代码示例
完整代码 :
package kim.hsl.a7_zipimport android.os.Build
import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import java.io.*class MainActivity : AppCompatActivity() {companion object {val TAG = "MainActivity"}override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)copy7zr()compress7z()uncompress7z()}/*** 将 7zr 文件拷贝到应用私有目录*/fun copy7zr() {Log.i(TAG, "开始拷贝 7zr 文件")// /data/user/0/kim.hsl.a7_zip/files/7zrvar exeFile = File(filesDir, "7zr")Log.i(TAG, "filesDir = ${filesDir.absolutePath} , exeFile = ${exeFile.absolutePath}")// 查看该文件是否存在, 如果存在设置该文件可执行// 如果不存在 , 拷贝文件if (exeFile.exists()) {exeFile.setExecutable(true)Log.i(TAG, "内置存储空间存在该 /data/user/0/kim.hsl.a7_zip/files/7zr 文件")return} else {Log.i(TAG, "内置存储空间不存在 7zr 可执行文件 , 开始拷贝文件")}// 如果不存在 , 拷贝文件var inputStream: InputStream = assets.open("libs/arm64-v8a/7zr")// /data/user/0/kim.hsl.a7_zip/files/7zrvar fileOutputStream: FileOutputStream = FileOutputStream(exeFile)Log.i(TAG, "Build.CPU_ABI = ${Build.CPU_ABI}")// 不同 CPU 架构拷贝不同的可执行程序if (Build.CPU_ABI.startsWith("armeabi-v7a")) {inputStream = assets.open("libs/armeabi-v7a/7zr")} else if (Build.CPU_ABI.startsWith("arm64-v8a")) {inputStream = assets.open("libs/arm64-v8a/7zr")} else if (Build.CPU_ABI.startsWith("x86")) {inputStream = assets.open("libs/x86/7zr")} else if (Build.CPU_ABI.startsWith("x86_64")) {inputStream = assets.open("libs/x86_64/7zr")}// 拷贝文件var buffer: ByteArray = ByteArray(1024)var readCount = inputStream.read(buffer);while (readCount != -1) {fileOutputStream.write(buffer)readCount = inputStream.read(buffer);}fileOutputStream.flush()fileOutputStream.close()Log.i(TAG, "拷贝 7zr 文件结束")}/*** 使用 7zr 进行压缩*/fun compress7z() {// /data/user/0/kim.hsl.a7_zip/files/7zrvar exeFile = File(filesDir, "7zr")// 执行前赋予可执行权限exeFile.setExecutable(true)var cmd = "${exeFile.absolutePath} a ${filesDir.absolutePath}/files.7z ${filesDir.absolutePath} -mx=9 -t7z"Log.i(TAG, "压缩命令 : $cmd")var process: Process = Runtime.getRuntime().exec(cmd)// 读取命令执行过程数据var reader = BufferedReader(InputStreamReader(process.inputStream))while (true) {val line = reader.readLine()if (line != null) {Log.i(TAG, "$line")}else{break}}val exitValue = process.exitValue()Log.i(TAG, "压缩文件 , 执行完毕 , exitValue = $exitValue")}/*** 判定命令是否执行完毕* 调用 process.exitValue 方法 , 如果没有执行完毕 , 会抛异常,* 如果执行完毕会返回一个确定的值*/fun isComplete(process: Process): Boolean {try {// 已经执行完毕process.exitValue()return true} catch (e: IllegalThreadStateException) {// 未执行完毕return false}}/*** 使用 7zr 进行解压缩*/fun uncompress7z() {// /data/user/0/kim.hsl.a7_zip/files/7zrvar exeFile = File(filesDir, "7zr")// 执行前赋予可执行权限exeFile.setExecutable(true)var cmd = "${exeFile.absolutePath} x ${filesDir.absolutePath}/files.7z -o${filesDir.absolutePath}/unzip_file"Log.i(TAG, "解压缩命令 : $cmd")var process: Process = Runtime.getRuntime().exec(cmd)// 读取命令执行过程数据var reader = BufferedReader(InputStreamReader(process.inputStream))while (true) {val line = reader.readLine()if (line != null) {Log.i(TAG, "$line")}else{break}}val exitValue = process.exitValue()Log.i(TAG, "解压缩文件 , 执行完毕 , exitValue = $exitValue")}
}
执行结果 :
2021-04-29 22:16:33.842 10262-10262/kim.hsl.a7_zip I/MainActivity: 开始拷贝 7zr 文件
2021-04-29 22:16:33.844 10262-10262/kim.hsl.a7_zip I/MainActivity: filesDir = /data/user/0/kim.hsl.a7_zip/files , exeFile = /data/user/0/kim.hsl.a7_zip/files/7zr
2021-04-29 22:16:33.844 10262-10262/kim.hsl.a7_zip I/MainActivity: 内置存储空间不存在 7zr 可执行文件 , 开始拷贝文件
2021-04-29 22:16:33.844 10262-10262/kim.hsl.a7_zip I/MainActivity: Build.CPU_ABI = arm64-v8a
2021-04-29 22:16:33.873 10262-10262/kim.hsl.a7_zip I/MainActivity: 拷贝 7zr 文件结束
2021-04-29 22:16:33.873 10262-10262/kim.hsl.a7_zip I/MainActivity: 压缩命令 : /data/user/0/kim.hsl.a7_zip/files/7zr a /data/user/0/kim.hsl.a7_zip/files/files.7z /data/user/0/kim.hsl.a7_zip/files -mx=9 -t7z
2021-04-29 22:16:34.240 10262-10262/kim.hsl.a7_zip I/MainActivity: 7-Zip (a) [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21
2021-04-29 22:16:34.240 10262-10262/kim.hsl.a7_zip I/MainActivity: p7zip Version 16.02 (locale=utf8,Utf16=on,HugeFiles=on,64 bits,8 CPUs LE)
2021-04-29 22:16:34.240 10262-10262/kim.hsl.a7_zip I/MainActivity: Scanning the drive:
2021-04-29 22:16:34.240 10262-10262/kim.hsl.a7_zip I/MainActivity: 1 folder, 1 file, 994304 bytes (971 KiB)
2021-04-29 22:16:34.240 10262-10262/kim.hsl.a7_zip I/MainActivity: Creating archive: /data/user/0/kim.hsl.a7_zip/files/files.7z
2021-04-29 22:16:34.240 10262-10262/kim.hsl.a7_zip I/MainActivity: Items to compress: 2
2021-04-29 22:16:34.240 10262-10262/kim.hsl.a7_zip I/MainActivity: Files read from disk: 1
2021-04-29 22:16:34.240 10262-10262/kim.hsl.a7_zip I/MainActivity: Archive size: 308166 bytes (301 KiB)
2021-04-29 22:16:34.240 10262-10262/kim.hsl.a7_zip I/MainActivity: Everything is Ok
2021-04-29 22:16:34.240 10262-10262/kim.hsl.a7_zip I/MainActivity: 压缩文件 , 执行完毕 , exitValue = 0
2021-04-29 22:16:34.241 10262-10262/kim.hsl.a7_zip I/MainActivity: 解压缩命令 : /data/user/0/kim.hsl.a7_zip/files/7zr x /data/user/0/kim.hsl.a7_zip/files/files.7z -o/data/user/0/kim.hsl.a7_zip/files/unzip_file
2021-04-29 22:16:34.246 10262-10262/kim.hsl.a7_zip I/MainActivity: 7-Zip (a) [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21
2021-04-29 22:16:34.246 10262-10262/kim.hsl.a7_zip I/MainActivity: p7zip Version 16.02 (locale=utf8,Utf16=on,HugeFiles=on,64 bits,8 CPUs LE)
2021-04-29 22:16:34.246 10262-10262/kim.hsl.a7_zip I/MainActivity: Scanning the drive for archives:
2021-04-29 22:16:34.246 10262-10262/kim.hsl.a7_zip I/MainActivity: 1 file, 308166 bytes (301 KiB)
2021-04-29 22:16:34.246 10262-10262/kim.hsl.a7_zip I/MainActivity: Extracting archive: /data/user/0/kim.hsl.a7_zip/files/files.7z
2021-04-29 22:16:34.275 10262-10262/kim.hsl.a7_zip I/MainActivity: --
2021-04-29 22:16:34.275 10262-10262/kim.hsl.a7_zip I/MainActivity: Path = /data/user/0/kim.hsl.a7_zip/files/files.7z
2021-04-29 22:16:34.275 10262-10262/kim.hsl.a7_zip I/MainActivity: Type = 7z
2021-04-29 22:16:34.275 10262-10262/kim.hsl.a7_zip I/MainActivity: Physical Size = 308166
2021-04-29 22:16:34.275 10262-10262/kim.hsl.a7_zip I/MainActivity: Headers Size = 168
2021-04-29 22:16:34.275 10262-10262/kim.hsl.a7_zip I/MainActivity: Method = LZMA2:20
2021-04-29 22:16:34.275 10262-10262/kim.hsl.a7_zip I/MainActivity: Solid = -
2021-04-29 22:16:34.275 10262-10262/kim.hsl.a7_zip I/MainActivity: Blocks = 1
2021-04-29 22:16:34.275 10262-10262/kim.hsl.a7_zip I/MainActivity: Everything is Ok
2021-04-29 22:16:34.275 10262-10262/kim.hsl.a7_zip I/MainActivity: Folders: 1
2021-04-29 22:16:34.275 10262-10262/kim.hsl.a7_zip I/MainActivity: Files: 1
2021-04-29 22:16:34.275 10262-10262/kim.hsl.a7_zip I/MainActivity: Size: 994304
2021-04-29 22:16:34.275 10262-10262/kim.hsl.a7_zip I/MainActivity: Compressed: 308166
2021-04-29 22:16:34.275 10262-10262/kim.hsl.a7_zip I/MainActivity: 解压缩文件 , 执行完毕 , exitValue = 0
三、参考资料
参考资料 :
- 7-Zip 官网 : https://www.7-zip.org/
Android NDK 编译构建脚本参考文档 :
- ndk-build 脚本 : https://developer.android.google.cn/ndk/guides/ndk-build
- Android.mk 构建脚本 : https://developer.android.google.cn/ndk/guides/android_mk
- Application.mk 构建脚本 : https://developer.android.google.cn/ndk/guides/application_mk
博客资源 : 源码 , 编译后的可执行文件, 在 7zip\p7zip_16.02\CPP\ANDROID\7zr\libs\ 目录下 ;
- 下载地址 : https://download.csdn.net/download/han1202012/18215890
- GitHub 项目源码 : https://github.com/han1202012/7-Zip
- 博客源码快照 : https://download.csdn.net/download/han1202012/18254613
【Android 安装包优化】Android 中使用 7zr 可执行程序 解压缩文件相关推荐
- 【Android 安装包优化】Tint 着色器 ( 简介 | 布局文件中的 Tint 着色器基本用法 | 代码中使用 Tint 着色器添加颜色效果 )
文章目录 一.Tint 着色器简介 二.布局文件中的 Tint 着色器基本用法 三.代码中使用 Tint 着色器添加颜色效果 四.参考资料 一.Tint 着色器简介 Tint 着色器的作用是是 可以使 ...
- 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 测试 lib7zr.so 动态库调用 )
文章目录 一.拷贝 p7zip 源码中的头文件到 Android Studio 项目中 二.完整代码示例 1.Java 层代码 2.JNI 层代码 3.日志头文件 4.执行结果 四.参考资料 前置博客 ...
- 【Android 安装包优化】Android 中使用 7zr 可执行程序 压缩文件
文章目录 一.Android 中使用 7zr 可执行程序压缩文件 二.完整代码示例 三.参考资料 一.Android 中使用 7zr 可执行程序压缩文件 在上一篇博客 [Android 安装包优化]A ...
- 【Android 安装包优化】Android 应用中 7zr 可执行程序准备 ( Android Studio 导入可执行 7zr 程序 | 从 Assets 资源文件拷贝 7zr 到内置存储 )
文章目录 一.Android Studio 导入可执行 7zr 程序 二.从 Assets 资源文件拷贝 7zr 到内置存储空间 三.参考资料 一.Android Studio 导入可执行 7zr 程 ...
- 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( jni 中 main 函数声明 | 命令行处理 | jni 调用 lib7zr.so 函数库处理压缩文件完整代码 )
文章目录 一.JNI 中 main 函数声明 二.命令字符串切割并传入 main 函数 三.完整代码示例 1.完整 jni 代码 2.完整 java 代码 3.执行结果 四.参考资料 前置博客 : [ ...
- 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 拷贝 lib7zr.so 动态库头文件到 Android 工程中 | 配置 CMakeLists.txt 构建脚本 )
文章目录 一.拷贝 p7zip 源码中的头文件到 Android Studio 项目中 二.配置 CMakeLists.txt 构建脚本 1.导入动态库 2.导入头文件 三.完整 CMakeLists ...
- 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 修改 7zr 交叉编译脚本 Android.mk | 交叉编译 lib7zr.so 动态库 )
文章目录 一.修改 7zr 交叉编译脚本 Android.mk 二.完整的 7zr 交叉编译脚本 Android.mk 三.交叉编译 lib7zr.so 动态库 四.参考资料 一.修改 7zr 交叉编 ...
- 【Android 安装包优化】Android 中使用 SVG 图片 ( Android 5.0 以下的矢量图方案 | 矢量图生成为 PNG 图片 )
文章目录 一.Android 5.0 以下的矢量图方案 二.矢量图生成为 PNG 图片 三.完整的 build.gradle 构建脚本 四.编译效果 五.参考资料 一.Android 5.0 以下的矢 ...
- 【Android 安装包优化】WebP 应用 ( 4.0 以下兼容 WebP | Android Studio 中使用 libwebp.so 库向下兼容版本 | libwebp 库测试可用性 )
文章目录 一. Android Studio 中导入 libwebp.so 库 二. Android Studio 中测试 libwebp.so 库 三.参考资料 一. Android Studio ...
最新文章
- python流程控制-python简单流程控制
- web05-CounterServlet
- IntelliJ IDEA安装
- P4705 玩游戏(生成函数,多项式ln)
- C# 混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集...
- matlab 度表示,在matlab中,单精度类型用关键字()表示,双精度类型用关键字()表示...
- 《海量数据库解决方案》之位图索引的结构和特征
- 什么标签用于在表单中构建复选框_以下 ( ) 标签用于在表单中构建复选框 。_IP通信技术答案_学小易找答案...
- 现代数字信号处理总结 下
- iosbanner_ios图片的局部拉伸-------App首页banner图的iPhone X适配
- STP Security之BPDU Filter、BPDU Guard、Root Guard
- PMP每日一题(集锦)
- JS 实战: Drag 点击拖曳效果
- tensorflow实现卷积神经网络——经典网络(LeNet5、AlexNet、VGG-16、ResNet)
- Nginx配置WebSocket 【支持wss与ws连接】
- 【毕业设计】【期末作业】新闻发布系统(php+mysql)
- 解决win10服务主机:网络服务占用网络宽带的方法(自测有效)
- TYUT太原理工大学2022数据库大题之概念模型设计
- t3营改增服务器不能修改吗,畅捷通T3产品如何同步营改增
- Java、JSP社区交流站点的分析与实现