应用包体积大小也是应用体验的一个重要指标,体积过大会严重影响应用下载安装体验,且会占用较大的设备空间,因此包体积过大的应用会有包体积优化的诉求。想要优化应用包体积首先要分析应用包体积大的原因,一般包体积大的原因可以分为文件重复、大文件两大类,其中文件重复Har重复和其他类型文件重复,大文件可以分为so文件大和其他类型文件大,针对不同的原因有针对性的优化方案。
分析应用包体积大的原因
app-check-tool
app-check-tool应用包扫描工具,可以扫描指定路径的HAP、HSP、App包内容并输出检测结果报告,为开发者优化包结构或排查问题提供数据支撑。目前扫描工具支持以下几种分析统计:
- 扫描重复文件。
- 扫描超出指定大小的文件。
- 统计分析各类型文件的总大小和占比。
使用app-check-tool扫描文件大小占比,找到占比大文件,看是否为so文件,是否为重复文件,如果是重复文件,进一步查看重复原因,是否HAR重复引用导致,通过这些判断基本可以初步是被应用包体积大的原因。
从应用工程模块依赖判断是否存在HAR包重复
HAR包重复问题还可以从工程模块依赖的维度来识别,应用方可以统计工程各目录的oh-package.json5中的依赖来判断是否存在HAR包重用的情况,如多个HAP或HSP依赖了同一个HAR。
文件重复
HAR包重复
HarmonyOS应用采用模块化开发,模块类型包含HAP,HSP,HAR三种类型:
HAR和HSP在APP包中的形态示意图:
从上图可以看到如果应用中的某个HAR包被多个HAP/HSP引用,那么HAR包会存在多分拷贝,会存在冗余代码和资源,而使用HSP来替换HAR可以共享一份代码和资源,从而降低应用程序体积。
其它类型文件重复
如果重复文件不是由于HAR重复引用导致的,且重复文件比较大,可以考虑重复文件是否必要,如果非必要可以删除,如果必要可以考虑压缩。
大文件
so文件大
配置so压缩打包。
如果通过扫描发现是包中的so文件较大,可以在HAP/HSP(HAR中不需要配置)模块的module.json5中配置compressNativeLibs字段为true来压缩HAP/HSP包中的so的体积:
// 模块的module.json5文件 { "module": { // ... "compressNativeLibs": true // 标识libs库以压缩存储方式打包 } }
so压缩效果。以DevEco Studio中C++默认库文件为例,压缩前后的文件大小对比如下:
<a name="table777211955317"></a>
<table><thead align="left"><tr id="row147724915531"><th class="cellrowborder" valign="top" width="33.33333333333333%" id="mcps1.1.4.1.1"><p id="p3777121819534"><a name="p3777121819534"></a><a name="p3777121819534"></a>文件名</p>
</th>
<th class="cellrowborder" valign="top" width="33.33333333333333%" id="mcps1.1.4.1.2"><p id="p977714186534"><a name="p977714186534"></a><a name="p977714186534"></a>原始大小</p>
</th>
<th class="cellrowborder" valign="top" width="33.33333333333333%" id="mcps1.1.4.1.3"><p id="p1777761845317"><a name="p1777761845317"></a><a name="p1777761845317"></a>压缩后大小</p>
</th>
</tr>
</thead>
<tbody><tr id="row1277213945311"><td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.1.4.1.1 "><p id="p1777191818536"><a name="p1777191818536"></a><a name="p1777191818536"></a>armeabi-v7a/libc++_shared.so</p>
</td>
<td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.1.4.1.2 "><p id="p37783185536"><a name="p37783185536"></a><a name="p37783185536"></a>1233k</p>
</td>
<td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.1.4.1.3 "><p id="p1778141812532"><a name="p1778141812532"></a><a name="p1778141812532"></a>436k</p>
</td>
</tr>
</tbody>
</table>
配置so压缩打包的压缩率等级。
在工程目录下的hvigor目录中的hvigor.json5中配置ohos.pack.compressLevel属性,可以改变so压缩打包的压缩率。
```
//工程目录下的hvigor目录下的hvigor.json5
{
// ..
"properties": {
"ohos.pack.compressLevel": "fast" //三种等级fast standard ultimate
}
}
```
<a name="table1459410167540"></a>
<table><thead align="left"><tr id="row12594216125412"><th class="cellrowborder" valign="top" width="50%" id="mcps1.1.3.1.1"><p id="p5205162917543"><a name="p5205162917543"></a><a name="p5205162917543"></a>压缩等级</p>
</th>
<th class="cellrowborder" valign="top" width="50%" id="mcps1.1.3.1.2"><p id="p1220519297546"><a name="p1220519297546"></a><a name="p1220519297546"></a>描述</p>
</th>
</tr>
</thead>
<tbody><tr id="row859412160545"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.1 "><p id="p22059299548"><a name="p22059299548"></a><a name="p22059299548"></a>fast(缺省默认值)</p>
</td>
<td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.2 "><p id="p5205162955420"><a name="p5205162955420"></a><a name="p5205162955420"></a>最低等级的压缩率,压缩速度最快。</p>
</td>
</tr>
<tr id="row1459451625418"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.1 "><p id="p19205202965420"><a name="p19205202965420"></a><a name="p19205202965420"></a>standard</p>
</td>
<td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.2 "><p id="p14205229185410"><a name="p14205229185410"></a><a name="p14205229185410"></a>适中等级的压缩率,压缩速度适中。</p>
</td>
</tr>
<tr id="row45941016115410"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.1 "><p id="p3205162910543"><a name="p3205162910543"></a><a name="p3205162910543"></a>ultimate</p>
</td>
<td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.2 "><p id="p9205172985410"><a name="p9205172985410"></a><a name="p9205172985410"></a>最高等级的压缩率,压缩速度最慢。</p>
</td>
</tr>
</tbody>
</table>
开启strip,去除debug信息。
so文件未执行strip时,会包含大量的debug信息,导致so体积大大超出预期, IDE新建模块会默认开启release模式下的strip,但是部分应用可能仍然会漏配strip导致so体积过大。so是否strip可以使用linux的file命令来查看,如果显示with debug\_info, not stripped说明so未strip,如果显示stripped说明so已strip。
![](/img/bVddmNa)
![](/img/bVddmNb)
可通过在HAP/HSP(HAR中不需要配置)模块的build-profile.json5中开启strip,来移除.so文件中的符号表、debug信息,从而可以大大降低so的体积。
```
{
// 模块的build-profile.json5
"buildOptionSet": [
{
"name": "release",
// ...
"nativeLib": {
"debugSymbol": {
"strip": true,
"exclude": []
}
}
},
{
"name": "debug",
// ...
"nativeLib": {
"debugSymbol": {
"strip": true,
"exclude": []
}
}
}
]
}
```
注:release模式和debug模式都可以开启strip。
以DevEco Studio中C++默认库文件为例,压不开strip和开启strip的so体积大小对比如下:
<a name="table78803396579"></a>
<table><thead align="left"><tr id="row10880173911572"><th class="cellrowborder" valign="top" width="33.33333333333333%" id="mcps1.1.4.1.1"><p id="p8406104510571"><a name="p8406104510571"></a><a name="p8406104510571"></a>文件名</p>
</th>
<th class="cellrowborder" valign="top" width="33.33333333333333%" id="mcps1.1.4.1.2"><p id="p140674519573"><a name="p140674519573"></a><a name="p140674519573"></a>原始大小</p>
</th>
<th class="cellrowborder" valign="top" width="33.33333333333333%" id="mcps1.1.4.1.3"><p id="p3406545175714"><a name="p3406545175714"></a><a name="p3406545175714"></a>strip后大小</p>
</th>
</tr>
</thead>
<tbody><tr id="row178801339165718"><td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.1.4.1.1 "><p id="p14406545195712"><a name="p14406545195712"></a><a name="p14406545195712"></a>armeabi-v7a/libentry.so</p>
</td>
<td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.1.4.1.2 "><p id="p1240674512579"><a name="p1240674512579"></a><a name="p1240674512579"></a>531k</p>
</td>
<td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.1.4.1.3 "><p id="p124063456576"><a name="p124063456576"></a><a name="p124063456576"></a>96k</p>
</td>
</tr>
</tbody>
</table>
其它类型文件大
其它类型的大文件根据业务实际情况看是否可以删除或压缩。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。