APK优化小结

news/2024/5/20 3:06:05 标签: java, android, gradle

APK瘦身

减少apk大小主要从代码、图片、so库、其他资源等方面进行优化;

  • 首先我们可以通过Gradle配置

    • 开启代码混淆(minifyEnabled)和资源压缩(shrinkResources)功能;这个配置可以在打包时将项目中无用的代码和资源删除,所谓的删除不是真正的删除,而是将资源内容清空

    • 然后可以将不需要的平台so库以及语言资源通过配置不打进apk包中

      • ndk{ abiFilters “armeabi-v7a”}

      • resConfigs “en”

      • splits:打特定包

  • 在图片方面:

    • 我们可以使用占用空间更小的图片格式,比如webp、svg等

    • 非必要的图片不要内置app,而是通过网络下载到本地后再显示

    • 对于不同屏幕分辨率的设备,只适配主流分辨率

  • so库我们也可以通过远程下载到本地再进行动态加载

    • so库动态加载方案主要有两种,一种是像Tinker那样启动时优先加载so库下载目录,如果不存在才去加载apk内的;另一种是通过反射修改DexClassLoader中的DexPathList的属性中存放so路径的List,将下载的so路径添加到列表最前面

APK打包流程

AndroidStudio作为UI工具->通过Gradle命令执行打包流程->Gradle通过build-tool等各种命令进行打包

  • 使用aapt命令打包资源文件并生成生成R.java文件

  • 使用aidl命令将aidl文件转成java文件

  • 使用javac命令将所有java文件编译成class文件

  • 使用dex命令将所有class文件打包成dex文件

  • 使用apkBuilder命令将所有资源文件打包成apk文件

  • 使用jarsign命令对apk文件进行签名

  • 使用zipalign命令对apk文件进行4k对其

APK签名

了解各个版本APK签名原理的意义在于往apk中写入渠道信息,完成批量多渠道打包任务

  • V1:对apk里的的每一个文件记录它的唯一值(SHA-256)防止被修改,并保存到MEFT-INFO文件夹下的签名信息文件(MANIFEST.MF)中,但是验证签名时对于MEFT-INFO文件夹下的文件却不会校验;所以可以批量打包时往apk文件的MEFT-INFO文件夹下添加渠道信息文件

  • V2:在V2版本中,为了避免V1中存在的问题,它对整个apk包进行校验,并把校验信息存放到存放压缩包信息的地方,开辟了一块空间;这块空间时以键值对的形式存放数据;所以我们也可以通过读取这块区域信息,以键值对的形式插入我们的渠道信息

  • V3:整体方案还是跟V2一样,它支持在修改签名文件后也能覆盖安装旧版app;实现原理就是签名信息里会存放旧版的签名信息,只要apk安装时检测到旧版签名信息跟v3里记录的旧版签名信息一致就可以覆盖安装


http://www.niftyadmin.cn/n/187899.html

相关文章

Linux /proc/version 文件解析

/proc/version文件里面的内容: Linux version 4.14.180-perf (oe-user@oe-host) (clang version 10.0.5 for Android NDK, GNU ld (GNU Binutils) 2.29.1.20180115) #1 SMP PREEMPT Wed Mar 29 18:55:02 CST 2023 /proc/version文件里面记录了如下内容: 1、Linux kernel的…

一文了解:什么是销售云?概念、价值、选型

从Salesforce推出世界上第一个销售云产品开始,经过20多年的发展,销售云的功能以销售能力自动化为核心,已经拓展到全面记录客户信息和行为轨迹,构建360客户画像,从线索商机到合同报价有销售自动化(SFA&#…

【Linux】初见“which命令”,“find命令”以及linux执行命令优先级

文章目录1.which命令1.1 whereis命令1.2 locate命令1.3 搜索文件命令总结2.find命令2.1 find之exec用法2.2 管道符之xargs用法3 Linux常用命令4.命令执行优先级1.which命令 查找命令文件存放目录 搜索范围由环境变量PATH决定(echo $PATH) which命令格式&#xff1…

面向对象练习题(6)

目录 第一题 第二题 第三题 第一题 思路分析: 1.这题充分的使用到了我们继承的知识,首先我们知道,我们要创建一父类也是员工类,在类中会有一些属性,和构造器,方法等 2.因为经理类会有一个特有的属性&#…

我跟GPT合作写了一个genbank文件处理的脚本

事情起因是这样子,我有个genbank文件,里面记录的是线粒体的注释的坐标信息。由于这个注释是来源同源注释,可能存在错误,因此还需要后续的手动修改。我没去找到专门的工具,只是根据分析结果,手动改了里面一些…

Vue中computed和watch的区别

Vue中computed和watch的区别(1)computed(2)watchwatch和computed都是以Vue的依赖追踪机制为基础的,它们都试图处理这样一件事情:当某一个或多个数据(称它们为依赖数据)发生变化的时候…

动力节点王鹤SpringBoot3学习笔记——JDK新特性

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、JDK关注的新特性 1.1 搭建学习环境 1.2 有用的新特性 1.2.1 Java Record 1.2.1.1 看看Record怎么用 IDEA新建Class,选择类Record 1.2.1.3 …

c语言进阶学习笔记——文件操作

目录文件操作1. 为什么使用文件2. 什么是文件程序文件数据文件文件名3. 文件的打开和关闭文件指针文件的打开和关闭4.文件的顺序读写fputc 写文件fgetc 读文件fputs 写一行数据fget 读一行数据fprintf 格式化的写数据fscanf 格式化的读数据流fwrite 二进制的写文件fread 二进制…