【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( jni 中 main 函数声明 | 命令行处理 | jni 调用 lib7zr.so 函数库处理压缩文件完整代码 )(二)

简介: 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( jni 中 main 函数声明 | 命令行处理 | jni 调用 lib7zr.so 函数库处理压缩文件完整代码 )(二)

2、完整 java 代码


package kim.hsl.a7_zip
import 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"
        init {
            System.loadLibrary("native-lib")
        }
    }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        copy7zr()
        compress7z()
        uncompress7z()
        compress7zJni()
    }
    /**
     * 将 7zr 文件拷贝到应用私有目录
     */
    fun copy7zr() {
        Log.i(TAG, "开始拷贝 7zr 文件")
        // /data/user/0/kim.hsl.a7_zip/files/7zr
        var 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/7zr
        var 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/7zr
        var exeFile = File(filesDir, "7zr")
        // 执行前赋予可执行权限
        exeFile.setExecutable(true)
        var file_7z = File("${filesDir.absolutePath}/files.7z")
        if(file_7z.exists()){
            file_7z.delete()
        }
        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
            }
        }
        reader.close()
        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/7zr
        var exeFile = File(filesDir, "7zr")
        // 执行前赋予可执行权限
        exeFile.setExecutable(true)
        // 删除解压目录
        var unzip_file = File("${filesDir.absolutePath}/unzip_file")
        if(unzip_file.exists()){
            recursionDeleteFile(unzip_file)
        }
        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
            }
        }
        reader.close()
        val exitValue = process.exitValue()
        Log.i(TAG, "解压缩文件 , 执行完毕 , exitValue = $exitValue")
    }
    /**
     * 递归删除文件
     */
    fun recursionDeleteFile(file: File) {
        if (file.isDirectory) {
            // 如果是目录 , 则递归删除
            file.listFiles().forEach {
                // ForEach 循环删除目录
                recursionDeleteFile(it)
            }
        } else {
            // 如果是文件直接删除
            file.delete()
        }
    }
    /**
     * 使用 7zr 进行压缩
     */
    fun compress7zJni() {
        // /data/user/0/kim.hsl.a7_zip/files/7zr
        var exeFile = File(filesDir, "7zr")
        // 执行前赋予可执行权限
        exeFile.setExecutable(true)
        // 删除原有的压缩文件, 如果存在
        var file_7z = File("${filesDir.absolutePath}/files_jni.7z")
        if(file_7z.exists()){
            file_7z.delete()
        }
        var cmd = "${exeFile.absolutePath} a ${filesDir.absolutePath}/files_jni.7z ${filesDir.absolutePath} -mx=9 -t7z"
        Log.i(TAG, "Jni 压缩命令 : $cmd")
        // 调用 jni 方法处理压缩文件
        executeCmd(cmd)
    }
    external fun executeCmd(cmd: String): Unit
}




3、执行结果


2021-05-07 13:32:12.520 31022-31022/kim.hsl.a7_zip I/MainActivity: 开始拷贝 7zr 文件
2021-05-07 13:32:12.524 31022-31022/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-05-07 13:32:12.525 31022-31022/kim.hsl.a7_zip I/MainActivity: 内置存储空间存在该 /data/user/0/kim.hsl.a7_zip/files/7zr 文件
2021-05-07 13:32:12.527 31022-31022/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-05-07 13:32:19.027 31022-31022/kim.hsl.a7_zip I/MainActivity: 7-Zip (a) [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21
2021-05-07 13:32:19.027 31022-31022/kim.hsl.a7_zip I/MainActivity: p7zip Version 16.02 (locale=utf8,Utf16=on,HugeFiles=on,64 bits,8 CPUs LE)
2021-05-07 13:32:19.027 31022-31022/kim.hsl.a7_zip I/MainActivity: Scanning the drive:
2021-05-07 13:32:19.027 31022-31022/kim.hsl.a7_zip I/MainActivity: 11 folders, 8 files, 7403414 bytes (7230 KiB)
2021-05-07 13:32:19.027 31022-31022/kim.hsl.a7_zip I/MainActivity: Creating archive: /data/user/0/kim.hsl.a7_zip/files/files.7z
2021-05-07 13:32:19.027 31022-31022/kim.hsl.a7_zip I/MainActivity: Items to compress: 19
2021-05-07 13:32:19.027 31022-31022/kim.hsl.a7_zip I/MainActivity: Files read from disk: 8
2021-05-07 13:32:19.027 31022-31022/kim.hsl.a7_zip I/MainActivity: Archive size: 941905 bytes (920 KiB)
2021-05-07 13:32:19.027 31022-31022/kim.hsl.a7_zip I/MainActivity: Everything is Ok
2021-05-07 13:32:19.028 31022-31022/kim.hsl.a7_zip I/MainActivity: 压缩文件 , 执行完毕 , exitValue = 0
2021-05-07 13:32:19.036 31022-31022/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-05-07 13:32:19.059 31022-31022/kim.hsl.a7_zip I/MainActivity: 7-Zip (a) [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21
2021-05-07 13:32:19.059 31022-31022/kim.hsl.a7_zip I/MainActivity: p7zip Version 16.02 (locale=utf8,Utf16=on,HugeFiles=on,64 bits,8 CPUs LE)
2021-05-07 13:32:19.059 31022-31022/kim.hsl.a7_zip I/MainActivity: Scanning the drive for archives:
2021-05-07 13:32:19.059 31022-31022/kim.hsl.a7_zip I/MainActivity: 1 file, 941905 bytes (920 KiB)
2021-05-07 13:32:19.059 31022-31022/kim.hsl.a7_zip I/MainActivity: Extracting archive: /data/user/0/kim.hsl.a7_zip/files/files.7z
2021-05-07 13:32:19.185 31022-31022/kim.hsl.a7_zip I/MainActivity: --
2021-05-07 13:32:19.185 31022-31022/kim.hsl.a7_zip I/MainActivity: Path = /data/user/0/kim.hsl.a7_zip/files/files.7z
2021-05-07 13:32:19.185 31022-31022/kim.hsl.a7_zip I/MainActivity: Type = 7z
2021-05-07 13:32:19.185 31022-31022/kim.hsl.a7_zip I/MainActivity: Physical Size = 941905
2021-05-07 13:32:19.185 31022-31022/kim.hsl.a7_zip I/MainActivity: Headers Size = 333
2021-05-07 13:32:19.185 31022-31022/kim.hsl.a7_zip I/MainActivity: Method = LZMA2:23
2021-05-07 13:32:19.186 31022-31022/kim.hsl.a7_zip I/MainActivity: Solid = +
2021-05-07 13:32:19.186 31022-31022/kim.hsl.a7_zip I/MainActivity: Blocks = 1
2021-05-07 13:32:19.186 31022-31022/kim.hsl.a7_zip I/MainActivity: Everything is Ok
2021-05-07 13:32:19.186 31022-31022/kim.hsl.a7_zip I/MainActivity: Folders: 11
2021-05-07 13:32:19.186 31022-31022/kim.hsl.a7_zip I/MainActivity: Files: 8
2021-05-07 13:32:19.186 31022-31022/kim.hsl.a7_zip I/MainActivity: Size:       7403414
2021-05-07 13:32:19.186 31022-31022/kim.hsl.a7_zip I/MainActivity: Compressed: 941905
2021-05-07 13:32:19.186 31022-31022/kim.hsl.a7_zip I/MainActivity: 解压缩文件 , 执行完毕 , exitValue = 0
2021-05-07 13:32:19.187 31022-31022/kim.hsl.a7_zip I/MainActivity: Jni 压缩命令 : /data/user/0/kim.hsl.a7_zip/files/7zr a /data/user/0/kim.hsl.a7_zip/files/files_jni.7z /data/user/0/kim.hsl.a7_zip/files -mx=9 -t7z
2021-05-07 13:32:19.188 31022-31022/kim.hsl.a7_zip I/octopus: jni 中处理压缩文件命令 : /data/user/0/kim.hsl.a7_zip/files/7zr a /data/user/0/kim.hsl.a7_zip/files/files_jni.7z /data/user/0/kim.hsl.a7_zip/files -mx=9 -t7z
2021-05-07 13:32:19.188 31022-31022/kim.hsl.a7_zip I/octopus: 0 . /data/user/0/kim.hsl.a7_zip/files/7zr
2021-05-07 13:32:19.188 31022-31022/kim.hsl.a7_zip I/octopus: 1 . a
2021-05-07 13:32:19.188 31022-31022/kim.hsl.a7_zip I/octopus: 2 . /data/user/0/kim.hsl.a7_zip/files/files_jni.7z
2021-05-07 13:32:19.188 31022-31022/kim.hsl.a7_zip I/octopus: 3 . /data/user/0/kim.hsl.a7_zip/files
2021-05-07 13:32:19.188 31022-31022/kim.hsl.a7_zip I/octopus: 4 . -mx=9
2021-05-07 13:32:19.188 31022-31022/kim.hsl.a7_zip I/octopus: 5 . -t7z
2021-05-07 13:32:26.301 31022-31022/kim.hsl.a7_zip I/octopus: 7zr 命令执行完毕 !





查询在 jni 层压缩的文件 :


C:\Users\octop>adb shell
walleye:/ $ su
walleye:/ # cd /data/user/0/kim.hsl.a7_zip/files/
walleye:/data/user/0/kim.hsl.a7_zip/files # ls -la
total 3028
drwxrwx--x 3 u0_a455 u0_a455    4096 2021-05-07 13:32 .
drwx------ 5 u0_a455 u0_a455    4096 2021-05-07 13:19 ..
-rwx------ 1 u0_a455 u0_a455  994304 2021-05-07 13:19 7zr
-rw------- 1 u0_a455 u0_a455  941905 2021-05-07 13:32 files.7z
-rw------- 1 u0_a455 u0_a455 1124135 2021-05-07 13:32 files_jni.7z
drwx------ 3 u0_a455 u0_a455    4096 2021-05-07 13:19 unzip_file
walleye:/data/user/0/kim.hsl.a7_zip/files #






四、参考资料


参考资料 :


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


目录
相关文章
|
2月前
|
存储 缓存 编解码
Android经典面试题之图片Bitmap怎么做优化
本文介绍了图片相关的内存优化方法,包括分辨率适配、图片压缩与缓存。文中详细讲解了如何根据不同分辨率放置图片资源,避免图片拉伸变形;并通过示例代码展示了使用`BitmapFactory.Options`进行图片压缩的具体步骤。此外,还介绍了Glide等第三方库如何利用LRU算法实现高效图片缓存。
67 20
Android经典面试题之图片Bitmap怎么做优化
|
1月前
|
调度 Android开发 开发者
构建高效Android应用:探究Kotlin多线程优化策略
【10月更文挑战第11天】本文探讨了如何在Kotlin中实现高效的多线程方案,特别是在Android应用开发中。通过介绍Kotlin协程的基础知识、异步数据加载的实际案例,以及合理使用不同调度器的方法,帮助开发者提升应用性能和用户体验。
49 4
|
21天前
|
安全 Android开发 iOS开发
深入探索iOS与Android系统的差异性及优化策略
在当今数字化时代,移动操作系统的竞争尤为激烈,其中iOS和Android作为市场上的两大巨头,各自拥有庞大的用户基础和独特的技术特点。本文旨在通过对比分析iOS与Android的核心差异,探讨各自的优势与局限,并提出针对性的优化策略,以期为用户提供更优质的使用体验和为开发者提供有价值的参考。
|
2月前
|
监控 算法 数据可视化
深入解析Android应用开发中的高效内存管理策略在移动应用开发领域,Android平台因其开放性和灵活性备受开发者青睐。然而,随之而来的是内存管理的复杂性,这对开发者提出了更高的要求。高效的内存管理不仅能够提升应用的性能,还能有效避免因内存泄漏导致的应用崩溃。本文将探讨Android应用开发中的内存管理问题,并提供一系列实用的优化策略,帮助开发者打造更稳定、更高效的应用。
在Android开发中,内存管理是一个绕不开的话题。良好的内存管理机制不仅可以提高应用的运行效率,还能有效预防内存泄漏和过度消耗,从而延长电池寿命并提升用户体验。本文从Android内存管理的基本原理出发,详细讨论了几种常见的内存管理技巧,包括内存泄漏的检测与修复、内存分配与回收的优化方法,以及如何通过合理的编程习惯减少内存开销。通过对这些内容的阐述,旨在为Android开发者提供一套系统化的内存优化指南,助力开发出更加流畅稳定的应用。
73 0
|
编译器 Android开发 C语言
【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 拷贝 lib7zr.so 动态库头文件到 Android 工程中 | 配置 CMakeLists.txt 构建脚本 )
【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 拷贝 lib7zr.so 动态库头文件到 Android 工程中 | 配置 CMakeLists.txt 构建脚本 )
152 0
【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 拷贝 lib7zr.so 动态库头文件到 Android 工程中 | 配置 CMakeLists.txt 构建脚本 )
|
Android开发 C++
【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 修改 7zr 交叉编译脚本 Android.mk | 交叉编译 lib7zr.so 动态库 )(二)
【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 修改 7zr 交叉编译脚本 Android.mk | 交叉编译 lib7zr.so 动态库 )(二)
169 0
【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 修改 7zr 交叉编译脚本 Android.mk | 交叉编译 lib7zr.so 动态库 )(二)
|
Java Android开发 C++
【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 测试 lib7zr.so 动态库调用 )
【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 测试 lib7zr.so 动态库调用 )
388 0
|
6天前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
11天前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
13天前
|
Android开发 Swift iOS开发
探索安卓与iOS开发的差异和挑战
【10月更文挑战第37天】在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统扮演着主角。它们各自拥有独特的特性、优势以及面临的开发挑战。本文将深入探讨这两个平台在开发过程中的主要差异,从编程语言到用户界面设计,再到市场分布的不同影响,旨在为开发者提供一个全面的视角,帮助他们更好地理解并应对在不同平台上进行应用开发时可能遇到的难题和机遇。