Android APK体积优化(瘦身)

这篇具有很好参考价值的文章主要介绍了Android APK体积优化(瘦身)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、基础知识:

1.1 apk结构

lib :存放so文件,对应不同的cpu架构
res :资源文件,layout、drawable等,经过aapt编译
assets :资源文件,不经过aapt编译
classes.dex :dx编译后的java文件,可执行文件,可以直接在Android系统中运行
resources.arsc :二进制资源文件,经过aapt打包res目录下的文件后生成的文件
META-INF :签名信息相关文件
CERT.RSA :签名文件,存放公钥和加密算法描述
CERT.SF :摘要加密,存放加密文件,是使用私钥对摘要明文加密后得到的密文信息,只有使用与私钥配对的公钥才能解密该文件
MANIFEST.MF :文件摘要,存放程序清单文件,包含包中所有文件的摘要明文
AndroidManifest.xml :清单文件,包含组件的声明和配置
kotlin :编译后的kotlin文件
Android APK体积优化(瘦身),android,apk,瘦身

1.2 apk打包流程

精简:资源文件、Java文件 > dex文件 > APK
Android APK体积优化(瘦身),android,apk,瘦身

2、优化方案

2.1 常规操作

2.1.1 图片体积压缩

1)tinypng压缩工具,在线压缩、AS插件
2)Webp格式,png格式转Webp格式,AS支持一键转换

Android APK体积优化(瘦身),android,apk,瘦身
3)图片着色器
针对相同图片不同颜色的处理,原本使用两个icon切换,可以使用android:tint=""代替

<ImageView
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:src="@drawable/img_fallback"
    android:tint="@color/color_000000_FFFFFF"/>

2.1.2 开启混淆

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
}

注意:minifyEnabled true 默认启用R8代码缩减功能,慎用R8,会忽略视图修改默认优化行为的所有ProGuard规则,如:-optimizations 和 -optimizationpasses

解决方案:开启混淆,但不启用R8

android.enableR8=false
android.enableR8.libraries=false

2.1.3 资源缩减

1)Lint检测工具

  • 检测无用的资源文件

AS Analyze -> Run Inspection by Name -> Unused resources

注意:这种方式不一定准确,如:有些图片,SDK有引用,但是在本地代码中检测不出来引用的地方。
Android APK体积优化(瘦身),android,apk,瘦身
Android APK体积优化(瘦身),android,apk,瘦身
检测结果:
Android APK体积优化(瘦身),android,apk,瘦身

  • 检测

2)资源文件缩减

假如一些资源文件不确实是否还在使用,或者不确定需求是否变更,不敢删除,先留着。这情况可以使用shrinkResources来缩减资源。

buildTypes {
    release {
        minifyEnabled true // 开启混淆
        shrinkResources true // 资源缩减
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
}

注意:要配合minifyEnabled一起使用,原理:先代码移除,然后引用的资源变成无用,才可以进一步缩减。

3)so文件缩减
一般集成第三方SDK时,会提供各种架构的so文件,可以做相应的剔除

  • 目前市面上手机cpu架构以arm架构为主,所以只保留arm的一种so文件即可,armeabi、armeabi-v7a的可直接删除
  • 如果需要模拟器调试,可以加上x86架构
android {
    defaultConfig {
        ndk {
            abiFilters 'armeabi-v7a'
        }
    }
}

4)移除未使用的备用资源

  • 多语言项目,配置支持的语言
defaultConfig {
    resConfigs("en", "zh", "zh-rCN")
}
  • 资源文件,限制使用的目录
defaultConfig {
    resConfigs("xxhdpi", "xxxhdpi")
}

2.2 进阶

2.2.1 resources资源混淆

资源混淆就是将原本冗长的资源路径变短,如:res/drawable/abc 变成 r/d/a。开源工具AndResGuard

2.2.2 ReDex

dex文件是打包中的产物,redex是facebook开源的分包优化方案。

2.2.3 so动态加载

so文件按需加载,利用插件化的思想。
注意:风险大,要考虑周全,如:下载时机、网络环境、加载失败后的策略。

2.2.4 插件化

按需加载

2.3 高级

2.3.1 图片网络化

将图片放到服务器,通过动态下载的方式减小apk体积。
弊端:首次加载图片,依赖网络环境
注意:如果比较在意流量、加载速度,需要权衡

2.3.2 原生 -> H5

如促销活动,需要加载大量图片,且原生不够动态化,可以使用H5来实现

2.3.3 修改第三方库,剔除不需要的代码

对于引用的第三方库,往往只是用到了其中某一两项功能,对于多余的功能,可以考虑剔除。

注意:版本升级的时候,要注意

2.3.4 DebugItem

DebugItem里主要包含两种信息:

  • 调试信息,函数的参数变量和所以的局部变量
  • 排查问题信息,所有的指令集行号和源文件行号的对应关系

注意:去除debug信息和行号信息,不是极致,不推荐

2.3.5 R Field内联

可以解决R文件过多导致MultiDex 65535的问题,进一步对代码瘦身,

参考:字节的shrink-r-plugin,滴滴的booster

2.3.6 减少ENUM使用

每减少一个ENUM,大约可以减少1-1.4kb的大小

3、总结

任重道远 …文章来源地址https://www.toymoban.com/news/detail-643634.html

到了这里,关于Android APK体积优化(瘦身)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android 10.0 开机启动时PMS扫描apk耗时相关功能优化

      在android10.0的系统rom定制化开发中,在系统中开发产品时,会根据客户要求内置第三方app,这时如果内置app过多,或者安装的app过多,在系统开机的过程中 在pms扫描安装app的时候,就会比较耗时,这时候就需要优化下pms扫描安装app这块的功能代码,用多线程来实现pms扫描安装

    2024年02月04日
    浏览(48)
  • 安卓apk修改(Android反编译apk)

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步: 反编译解包,修改, 重打包 , 修改签名等步骤。 1. 系统配置好Java JDK环境变量 2. 需要

    2024年02月01日
    浏览(34)
  • Android APK 签名打包原理分析(一)【APK结构分析】

    最近在看AOSP Apk安装的相关源码时,发现自己对这块知识一直停留到用的层面,并未有深入的了解,例如打包的具体过程、签名的具体过程、渠道打包,最重要的,自己这几年在做系统方面的应用时,也解决过很多apk 安装的问题,修改过部分的系统源码,可是没有把这块知识

    2024年02月02日
    浏览(40)
  • Android下载apk并安装apk(用于软件版本升级用途)

    软件版本更新是每个应用必不可少的功能,基本实现方案是请求服务器最新的版本号与本地的版本号对比,有新版本则下载apk并执行安装。请求服务器版本号与本地对比很容易,本文就不过多讲解,主要讲解下载apk到安装apk的内容。 (1)读写外部存储的权限需要动态申请,

    2024年02月01日
    浏览(59)
  • Android APK加固原理

    一、前言 Android作为开源框架,开放之余,所要面临的就是安全问题,世间之事,有正就有邪,有攻就有守,作为开发者虽然不需要进入专业安全领域,但还是需要掌握基本的安全常识和原理。 二、加壳 加壳最初用于windows平台可执行程序,后被Andriod平台采用用于apk加固,可

    2024年02月07日
    浏览(36)
  • Android apk逆向脱壳

    步骤一:下载逆向相关软件和apk 1、Android模拟器:雷电模拟器,我这Android系统是7.1.2【推荐使用模拟器,已经有Root权限】 2、下载安装Xposed框架 3、下载安装‘反射大师’apk 4、jadx反编译 5、配置Xposed    显示如下图即安装成功 模块选择反射大师     步骤二:脱壳 在模拟器中

    2024年02月14日
    浏览(33)
  • Android项目导出apk

    1.基本步骤如下。 第1步:选择“构建”,设置生成apk。 第2步:勾选apk。 第3步:点击生成一个新的密钥。 第4步:输入密钥的相关信息,随便输入。 第5步:上一步完成之后会自动填写如下图所示的内容。选中记住密码。 第6步:选择如下图所示的。 第7步:等一会可以生成一

    2024年02月11日
    浏览(30)
  • Android APK文件笔记

    APK文件其实是一个zip压缩包 APK的常见文件结构如下: AndroidManifest.xml 声明四大组件、权限等信息。解压是无法直接打开的,可以使用apktool等工具解密 lib 存放各种架构下的so文件的文件夹 存放的so文件可以使用IDA工具进行修改。 重打包手段:替换/data/app/packagename/lib下的so为你

    2024年02月15日
    浏览(25)
  • 【Android】使用Android Studio打包APK文件

    打包APK之前,首先需要新建项目,有基础的可以跳过。 无基础的可以参考:使用Android Studio运行Hello World项目 1.找到Build - Generate Signed Bundle or APK - 勾选APK 2.首次需要创建证书,后续可以使用已创建好的证书 3.填写证书信息 选择密钥库存放路径,并填写密码 填写密钥名称、密

    2024年02月19日
    浏览(42)
  • Android 对apk进行签名

    生成签名文件: 1.使用jarsigner(仅限V1签名): 2.使用apksigner(默认V1和V2签名),Android11以上不包含V2签名会装不上 Notice:    v1签名后再对齐,v2要签名前对齐。 对齐apk: 查看apk是否对齐: 1.查看apk是否签名(V1) 2.查看apk是否签名V1、V2、V3、V4 3.查看签名文件 

    2024年02月16日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包