zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

【Android 安装包优化】Android 应用中 7zr 可执行程序准备 ( Android Studio 导入可执行 7zr 程序 | 从 Assets 资源文件拷贝 7zr 到内置存储 )

2023-06-13 09:17:49 时间

文章目录

一、Android Studio 导入可执行 7zr 程序


上一篇博客 【Android 安装包优化】p7zip 源码交叉编译 Android 平台可执行程序 ( 下载 p7zip 源码 | 交叉编译 Android 中使用 7z 可执行程序 ) 编译了可以在 Android 平台执行的 7zr 可执行程序 ;

这是编译出的 4 种 CPU 架构的 7zr 可执行程序,

将编译出的整个 libs 目录 , 拷贝到 Android 应用的 assets 目录下 ,

该项目 GitHub 地址 : https://github.com/han1202012/7-Zip

二、从 Assets 资源文件拷贝 7zr 到内置存储空间


将 Assets 目录下的可执行 7zr 文件 " libs/arm64-v8a/7zr " , 拷贝到 " /data/user/0/kim.hsl.a7_zip/files/ " 目录下 ;

根据不同的 CPU 架构拷贝不同目录下的可执行文件 ;

        // 不同 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")
        }

完整代码示例 :

package kim.hsl.a7_zip

import android.os.Build
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import java.io.File
import java.io.FileOutputStream
import java.io.InputStream

class MainActivity : AppCompatActivity() {
    companion object{
        val TAG = "MainActivity"
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        copy7zr()
    }

    /**
     * 将 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)
            return
        }else{
            Log.i(TAG, "")
        }

        // 如果不存在 , 拷贝文件
        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 文件结束")
    }
}

日志打印结果 :

2021-04-29 20:20:43.790 22172-22172/kim.hsl.a7_zip I/MainActivity: 开始拷贝 7zr 文件
2021-04-29 20:20:43.791 22172-22172/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 20:20:43.791 22172-22172/kim.hsl.a7_zip I/MainActivity: 内置存储空间不存在 7zr 可执行文件 , 开始拷贝文件
2021-04-29 20:20:43.792 22172-22172/kim.hsl.a7_zip I/MainActivity: Build.CPU_ABI = arm64-v8a
2021-04-29 20:20:43.819 22172-22172/kim.hsl.a7_zip I/MainActivity: 拷贝 7zr 文件结束

拷贝结果 : 在命令行查看 /data/user/0/kim.hsl.a7_zip/files/7zr 文件 ;

三、参考资料


参考资料 :

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

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