1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 【Android 安装包优化】Android 中使用 7zr 可执行程序 解压缩文件

【Android 安装包优化】Android 中使用 7zr 可执行程序 解压缩文件

时间:2022-07-14 00:41:45

相关推荐

【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_file7-Zip (a) [64] 16.02 : Copyright (c) 1999- Igor Pavlov : -05-21p7zip 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.7zType = 7zPhysical Size = 308166Headers Size = 168Method = LZMA2:20Solid = -Blocks = 1Everything is OkFolders: 1Files: 1Size: 994304Compressed: 308166解压缩文件 , 执行完毕 , exitValue = 0

二、完整代码示例

完整代码 :

package kim.hsl.a7_zipimport android.os.Buildimport android.os.Bundleimport android.util.Logimport androidx.appcompat.app.AppCompatActivityimport 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")}}

执行结果 :

-04-29 22:16:33.842 10262-10262/kim.hsl.a7_zip I/MainActivity: 开始拷贝 7zr 文件-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-04-29 22:16:33.844 10262-10262/kim.hsl.a7_zip I/MainActivity: 内置存储空间不存在 7zr 可执行文件 , 开始拷贝文件-04-29 22:16:33.844 10262-10262/kim.hsl.a7_zip I/MainActivity: Build.CPU_ABI = arm64-v8a-04-29 22:16:33.873 10262-10262/kim.hsl.a7_zip I/MainActivity: 拷贝 7zr 文件结束-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-04-29 22:16:34.240 10262-10262/kim.hsl.a7_zip I/MainActivity: 7-Zip (a) [64] 16.02 : Copyright (c) 1999- Igor Pavlov : -05-21-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)-04-29 22:16:34.240 10262-10262/kim.hsl.a7_zip I/MainActivity: Scanning the drive:-04-29 22:16:34.240 10262-10262/kim.hsl.a7_zip I/MainActivity: 1 folder, 1 file, 994304 bytes (971 KiB)-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-04-29 22:16:34.240 10262-10262/kim.hsl.a7_zip I/MainActivity: Items to compress: 2-04-29 22:16:34.240 10262-10262/kim.hsl.a7_zip I/MainActivity: Files read from disk: 1-04-29 22:16:34.240 10262-10262/kim.hsl.a7_zip I/MainActivity: Archive size: 308166 bytes (301 KiB)-04-29 22:16:34.240 10262-10262/kim.hsl.a7_zip I/MainActivity: Everything is Ok-04-29 22:16:34.240 10262-10262/kim.hsl.a7_zip I/MainActivity: 压缩文件 , 执行完毕 , exitValue = 0-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-04-29 22:16:34.246 10262-10262/kim.hsl.a7_zip I/MainActivity: 7-Zip (a) [64] 16.02 : Copyright (c) 1999- Igor Pavlov : -05-21-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)-04-29 22:16:34.246 10262-10262/kim.hsl.a7_zip I/MainActivity: Scanning the drive for archives:-04-29 22:16:34.246 10262-10262/kim.hsl.a7_zip I/MainActivity: 1 file, 308166 bytes (301 KiB)-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-04-29 22:16:34.275 10262-10262/kim.hsl.a7_zip I/MainActivity: ---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-04-29 22:16:34.275 10262-10262/kim.hsl.a7_zip I/MainActivity: Type = 7z-04-29 22:16:34.275 10262-10262/kim.hsl.a7_zip I/MainActivity: Physical Size = 308166-04-29 22:16:34.275 10262-10262/kim.hsl.a7_zip I/MainActivity: Headers Size = 168-04-29 22:16:34.275 10262-10262/kim.hsl.a7_zip I/MainActivity: Method = LZMA2:21-04-29 22:16:34.275 10262-10262/kim.hsl.a7_zip I/MainActivity: Solid = --04-29 22:16:34.275 10262-10262/kim.hsl.a7_zip I/MainActivity: Blocks = 1-04-29 22:16:34.275 10262-10262/kim.hsl.a7_zip I/MainActivity: Everything is Ok-04-29 22:16:34.275 10262-10262/kim.hsl.a7_zip I/MainActivity: Folders: 1-04-29 22:16:34.275 10262-10262/kim.hsl.a7_zip I/MainActivity: Files: 1-04-29 22:16:34.275 10262-10262/kim.hsl.a7_zip I/MainActivity: Size: 994304-04-29 22:16:34.275 10262-10262/kim.hsl.a7_zip I/MainActivity: Compressed: 308166-04-29 22:16:34.275 10262-10262/kim.hsl.a7_zip I/MainActivity: 解压缩文件 , 执行完毕 , exitValue = 0

三、参考资料

参考资料 :

7-Zip 官网 :https://www.7-/

Android NDK 编译构建脚本参考文档 :

ndk-build 脚本 :https://developer./ndk/guides/ndk-buildAndroid.mk 构建脚本: https://developer./ndk/guides/android_mkApplication.mk 构建脚本 :https://developer./ndk/guides/application_mk

博客资源 :源码 , 编译后的可执行文件, 在 7zip\p7zip_16.02\CPP\ANDROID\7zr\libs\ 目录下 ;

下载地址 :/download/han120/18215890GitHub 项目源码 :/han120/7-Zip博客源码快照 :/download/han120/18254613

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。