android的so文件
❶ Android对so体积优化的探索与实践
减小应用安装包的体积,对提升用户体验和下载转化率都大有益处。本文将结合美团平台的实践经验,分享 so 体积优化的思路、收益,以及工程实践中的注意事项。
1. 背景
应用安装包的体积影响着用户的下载时长、安装时长、磁盘占用空间等诸多方面,因此减小安装包的体积对于提升用户体验和下载转化率都大有益处。Android 应用安装包其实是一个 zip 文件,主要由 dex、assets、resource、so 等各类型文件压缩而成。目前业内常见的包体积优化方案大体分为以下几类:
随着动态化、端智能等技术的广泛应用,在采用上述优化手段后, so 在安装包体积中的比重依然很高,我们开始思索这部分体积是否能进一步优化。
经过一段时间的调研、分析和验证,我们逐渐摸索出一套可以将应用安装包中 so 体积进一步减小 30%~60% 的方案。该方案包含一系列纯技术优化手段,对业务侵入性低,通过简单的配置,可以快速部署生效,目前美团 App 已在线上部署使用。为让大家能知其然,也能知其所以然,本文将先从 so 文件格式讲起,结合文件格式分析哪些内容可以优化。
2. so 文件格式分析
so 即动态库,本质上是 ELF(Executable and Linkable Format)文件。可以从两个维度查看 so 文件的内部结构:链接视图(Linking View)和执行视图(Execution View)。链接视图将 so 主体看作多个 section 的组合,该视图体现的是 so 是如何组装的,是编译链接的视角。而执行视图将 so 主体看作多个 segment 的组合,该视图告诉动态链接器如何加载和执行该 so,是运行时的视角。鉴于对 so 优化更侧重于编译链接角度,并且通常一个 segment 包含多个 section(即链接视图对 so 的分解粒度更小),因此我们这里只讨论 so 的链接视图。
3. so 可优化内容分析
在讨论 so 可优化内容之前,我们先了解一下 Android 构建工具(Android Gradle Plugin,下文简称 AGP)对 so 体积做的 strip 优化(移除调试信息和符号表)。AGP 编译 so 时,首先产生的是带调试信息和符号表的 so(任务名为 externalNativeBuildRelease),之后对刚产生的带调试信息和符号表的 so 进行 strip,就得到了最终打包到 apk 或 aar 中的 so(任务名为 stripReleaseDebugSymbols)。
4. 优化方案介绍
我们对所有能控制最终 so 体积的方案都进行调研,并验证了其效果,最后总结出较为通用的可行方案。
5. 工程实践支持多种构建工具
美团有众多业务使用了 so,所使用的构建工具也不尽相同,除了上述常见的 CMake 和 ndk-build,也有项目在使用 Make、Automake、Ninja、GYP 和 GN 等各种构建工具。不同构建工具应用 so 优化方案的方式也不相同,尤其对大型工程而言,配置复杂性较高。
6. 方案收益
优化 so 对安装包体积和安装后占用的本地存储空间有直接收益,收益大小取决于原 so 冗余代码数量和导出符号数量等具体情况,下面是部分 so 优化前后占用安装包体积的对比:
下面是上述 so 优化前后占用本地存储空间的对比:
7. 总结与后续计划
对 so 体积进行优化不仅能够减小安装包体积,而且能获得以下收益:
我们对后续工作做了如下的规划:
❷ Android如何引入及调用第三方.so文件
APP开发时,可能会碰到引入第三方so文件的需求,可以根据以下步骤引入
一、新建jnilibs目录,或者直接放入libs目录
二、修改build.gradle文件,添加sourceSets jniLibs.srcDirs配置,如果放入libs,那么srcDirs应配置为libs
前两步已经说明如何引入so文件,那么如何调用.so文件里面的方法呢?拷贝或新建调用类,注意包名,在类中创建相应方法,假设C文件的方法为Java_a_b_c_JniUtils_test,需创建的类及方法:
❸ android so文件有什么用
android中用到的so文件是一个c++的函数库,在android的JNI中,是先将相应的C语言打包成so库导入到lib文件夹中调用的。
❹ android so文件是什么
so文件是unix的动态连接库,是二进制文件,作用相当于windows下的.dll文件。
补充:
在Android中调用动态库文件(*.so)都是通过jni的方式。
Android中加载so文件的提供的API:
void System.load(String pathName);
说明:pathName:文件名+文件路径;
❺ 安卓手机如何打开.so文件
安卓手机无法直接打开.so文件。
.so文件是Linux和Unix系统中的共享库文件,类似于Windows系统中的.dll文件。在Android系统中,.so文件通常用于存储编译后的C/C++代码,以供Java或Kotlin等语言通过JNI(Java Native Interface)调用。这些文件是二进制格式,因此无法直接在安卓手机上打开查看或编辑。
要在安卓手机上使用.so文件,你需要将其嵌入到你的Android应用程序中。这通常涉及到在Android项目的构建脚本(如build.gradle)中配置NDK(Native Development Kit)编译选项,以便在编译应用程序时包含.so文件。这样,当应用程序在安卓设备上运行时,它可以加载并使用这些.so文件中的本地代码。
需要注意的是,直接在安卓设备上查看或编辑.so文件是不可能的,因为它们是以二进制形式编译的,而不是以人类可读的文本形式存储的。如果你需要查看或编辑这些代码,你需要在开发环境中使用相应的工具,如C/C++编译器和调试器,来查看和编辑源代码,然后重新编译生成.so文件。
综上所述,安卓手机无法直接打开.so文件,但你可以通过将其嵌入到你的Android应用程序中来使用它们。如果你需要查看或编辑这些代码,你需要在开发环境中使用相应的工具来操作源代码。