【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 文件 ;
三、参考资料
参考资料 :
- 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\ 目录下 ;
相关文章
- android studio不能输入中文_Android模拟器
- android onresume方法,非静态方法’onResume’Android Studio
- android系统开机画面_Android开机画面
- android布局文件详解
- android 模拟器 haxm,Android模拟器不使用HAXM
- android sdk manager安装,Android SDK Manager安装过程
- android toast 自定义时间,Android 自定义 Toast 显示时间「建议收藏」
- Android preference_android studio preview
- android r文件丢失_读取文件
- 【Android】Android对于Activity的运用以及ViewGroup和 用户界面组件在项目中的运用
- android 获取设备信息
- Android studio更新后出现警告:Warning:The `android.dexOptions.incremental` property is deprecated and it has
- 【Android Gradle】安卓应用构建流程 ( 资源文件编译 )
- 【错误记录】Android Studio 编译报错 ( Could not find com.android.tools.build:gradle:4.2.1. )
- 【IOC 控制反转】Android 事件依赖注入 ( 事件依赖注入代码示例 )
- 【Android 逆向】ELF 文件格式 ( 安装 010 Editor 二进制查看工具的 ELF.bt 插件模板 | 安装 ELF.bt 模板 | 打开 ELF 文件 )
- 【Android 逆向】Dalvik 函数抽取加壳 ① ( Dalvik 下的函数指令抽取与恢复 | dex 函数指令恢复时机点 | 类加载流程 : 加载、链接、初始化 )
- 【Android Gradle 插件】Module 目录下 build.gradle 配置文件 ( android 闭包块配置 | AppExtension 扩展类型参考文档 )
- 【错误记录】Android 应用安装后出现两个启动图标 ( 排查应用及依赖库中配置了 android.intent.category.LAUNCHER 的 Activity )
- 【Android Gradle 插件】ProductFlavor 配置 ( ProductFlavor#manifestPlaceholders 清单文件占位符配置 )
- 【错误记录】编译 Android 版本的 ijkplayer 报错 ( ./init-android.sh: 第 37 行: cd: android/contrib/: 没有那个文件或目录 )
- 【错误记录】Android Studio 编译时 lint 检查报错 ( WARNING: DSL element ‘android.dataBinding.enabled‘ is obsolet )
- 【错误记录】Android Studio 集成 ARoute 编译报错 ( 兼容 support 库和 androidx 库 | add ‘tools:replace=“android:appCo )
- Android MVP 代码自动生成插件开发
- [android] 上传文件到服务器详解手机开发
- 阿里巴巴旗下平头哥将 Android 10 移植运行在 RISC-V 处理器上
- android开发教程之日历项目实践(二)
- android开发基础教程—文件存储功能实现
- android图像绘制(三)画布刷屏问题记录
- Android中Root权限获取的简单代码
- 用于cocos2d-x引擎(ndk)中为android项目生成编译文件列表
- android工程下不能运行javamain程序的解决方法