Android---APK 瘦身

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

在 APP 开发过程中,随着业务迭代,apk 体积逐渐变大。项目中累积的无用资源,未压缩的图片资源等,都为 apk 带来了不必要的体积增加。而 APK 的大小会影响应用加载速度、使用的内存量以及消耗的电量。

APK 结构

APK 文件由一个 Zip 压缩文件组成,其中包含构成应用的所有文件。这些文件包含 Java 类文件、资源文件和包含已编译资源的文件。

APK 包含以下目录:

  a. META_INF/: 包含 CERT.SF 和 CERT.RSA 签名文件,以及 MANIFEST.MF 清单文件。

  b. assets/: 包含应用的资源;应用可以使用 AssetManager 对象检索这些资源。

  c. res/: 包含未编译到 resource.arsc 中的资源(图片、音视频等)。

  d. lib/: 包含特定于处理器软件层的已编译代码。此目录包含每种平台类型的子目录,如 armeabi、armeabi-v7a、arm64-v8a、x86、x86_64 和 mips。

APK 还包含以下文件。在这些文件中,只有 AndroidManifest.xml 是必须的。

  a. resource.arsc: 包含已编译的资源。此文件包含 res/values/ 文件夹的所有配置中的 XML 内容。打包工具会提取此 XML 内容,将其编译为二进制文件形式,并压缩内容。此内容包括语言字符串和样式,以及未直接包含在 resources.arsc 文件中的内容(例如布局文件和图片)的路径。

  b. classes.dex: 包含以 Dalvik/ART 虚拟机可理解的 DEX 文件格式编译的类。

  c. AndroidManifest.xml: 包含核心 Android 清单文件。此文件列出了应用的名称、版本、访问权限和引用的库文件。该文件使用 Android 的二进制 XML 格式。

Android Size Analyzer 

Android Size Analyzer 工具可以轻松的发现和实施多种缩减应用大小的策略。

在 Android Studio 中插件市场下载安装 Android Size Analyzer。安装插件后,从菜单栏中依次选择 Analyze --> Analyze App Size,对当前项目运行应用大小分析。分析了项目后,系统会显示一个工具窗口,其中包含有关如何缩减应用大小的建议。

步骤1:下载安装插件。File --> Settings --> Plugins 然后搜索 Android Size Analyzer 插件,点击右侧的 Install 进行安装。

Android---APK 瘦身

 步骤2:安装好插件后,对需要分析的项目使用该插件。

启用资源缩减(不打包)

如果在应用的 build.gradle 文件中启用了资源缩减:shrinkResouces,则 Gradle 在打包 APK 时可以自动忽略未使用资源。资源缩减只有在写代码缩减:minifyEnabled 配合使用时才能发挥作用。在代码缩减移除所有不使用的代码后,资源缩减器便可确定应用仍要使用的资源。

android {
    // Other settings
    buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

Android---APK 瘦身

 注意:为了能更好的对比资源缩减效果,这里分别是在 debug 和 release 两种模式下生成的 APK。AS 左下角点击build variants 就可以进行 debug/release 模式的选择,选择release 后 make project  就可以打 release 包

Android---APK 瘦身

可以发现选择 release 后在 build 的 apk 目录下也会多一个release 目录,平常我们默认都是在 debug 模式下进行的。 

Android---APK 瘦身

 文章来源地址https://www.toymoban.com/news/detail-457933.html

 

使用 Lint 分析器(物理删除)

lint 工具是 Android Studio 中附带的静态代码分析器,可检测到 res/ 文件夹中未被代码引用的资源。

步骤:将鼠标放在代码区 --> 右键 --> Analyze --> Inspect Code --> 界面选择你要检测的模块 -- > 点击确认开始检测,如下图:

Android---APK 瘦身

Android---APK 瘦身

Android---APK 瘦身

lint 工具不会扫描 assets/ 文件夹、通过反射引用的资源或已链接至应用的库文件。此外,它也不会移除资源,只会提醒它们存在。与资源缩减不同,这里点击删除,那就是把文件删除了。

自定义要保留的资源

如果有要特别声明需要保留或舍弃的特定资源,在项目中创建一个包含 <resources> 标记的 XML 文件,并在 tools:keep 属性中指定每个要保留的资源,在 tools:discard 属性中指定每个要舍弃的资源。这两个属性都接受以逗号分隔的资源名称列表。还可以将星号字符用作通配符。

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
    tools:keep="@layout/l_used*_c,@layout/l_used_a,@layout/l_used_b*"
    tools:discard="@layout/unused2" />

将该文件保存在项目资源文件中,例如,保存在 res/raw/keep.xml 中。构建系统不会将此文件打包到 APK 中。

一键删除无用资源

Android Studio 给我们提供了一键移除所有无用的资源。鼠标光标放在项目名上右键 --> Refactor -->  Remove Unused Resources,但是这种方式不建议使用,因为如果某资源仅存在动态获取资源 id 的方式,那么这个资源会被认为没有使用过,从而会直接被删除。

Android---APK 瘦身

动态库打包配置

目前 Android 打包可以支持4种 CPU 架构:armeabi-v7a、arm64-v8a、x86、x86-64

so 文件是由 NDK 编译出来的动态库,是 C/C++ 写的,所以不是跨平台的。ABI 是应用程序二进制接口简称(Application Binary Interface),定义了二进制文件(尤其是 .so 文件)如何运行在相应的系统平台上,从使用的指令集,内存对齐到可用的系统函数库。在 Android 系统中,每一个 CPU 架构对应一个 ABI,目前支持的有:armeabi-v7a, arm64-v8a, x86, x86_64。目前市面上手机设备基本上都是 arm 架构armeabi-v7a 几乎能兼容所有设备。因此可用配置:

android{
    defaultConfig{
        ndk{
            abiFilters "armeabi-v7a"
        }
    }
}

Android---APK 瘦身

对于第三方服务,如百度地图,Bugly 等会提供全平台的 cpu 架构。进行了上面的配置之后,表示只会把 armeabi-v7a 打包进入 APK。从而减少 APK 大小。

对于 arm64 架构的设备,如果使用 armeabi-v7a 也能够兼容,但是不如使用 arm64 性能。因此现在部分应用市场会根据设备提供不同架构的 APK 安装。此时我们需要打包出针对 arm64 的 apk 与 armv7a 的 apk,可用使用 productFlavor

flavorDimensions "default"
    productFlavors{
        arm32{
            dimension "default"
        ndk{
            abiFilters "armeabi-v7a"
        }
    }

        arm64{
            dimension "default"
        ndk{
            abiFilters "arm64-v8a"
        }
    }
}

或者使用:

splits {
    abi {
        enable true
        reset()
        include 'arm64-v8a','armeabi-v7a'
        // exclude 'armeabi'
        universalApk true //是否打包一个包含所有so的apk
    }
}

使用矢量图

APK 中图片应该算是占用空间最多的资源。我们可以使用 webp 减少 png、jpg 图片占用空间的大小。对于小图标也可以使用矢量图。

矢量图可以创建与分辨率无关的图标和其他可伸缩媒体。使用这些图形可以极大的减少 APK 占用的空间。矢量图在 Android 中以 VectorDrawable 对象的形式表示。借助 VectorDrawable 对象,100 字节的文件可以生成与屏幕大小相同的清晰图片。

不过,系统渲染每个 VectorDrawable 对象需要花费大量时间,而较大的图片则需要更长的时间才能显示在屏幕上。因此,建议仅在显示小图片时使用这些矢量图

重复使用矢量图

现在我们有一个矢量图

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24"
    android:viewportHeight="24"
    android:tint="?attr/colorControlNormal">
        <path
            android:fillColor="@android:color/white"
            android:pathData="M10,20v-6h4v6h5v-8h3L12,3 2,12h3v8z"/>
</vector>

显示的效果为

Android---APK 瘦身

 如果我们需要让矢量图显示为红色(或其它颜色)怎么办?这种情况,我们不需要再去创建一个新的矢量图。可以直接给 ImageView 设置 android:tint 属性来完成颜色的修改。

<ImageView
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:tint="@color/colorAccent"
    android:src="@drawable/tabbar_home_vector" />

选择器

如果需要让矢量图实现触摸变色,只需要创建 selector,设置给 Tint 即可。

<!-- tabbar_home_tint_selector -->
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/colorPrimary" android:state_pressed="true" />
    <item android:color="@color/colorAccent" />
</selector>

        <ImageView
            android:clickable="true"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:src="@drawable/tabbar_home_vector"
            android:tint="@color/tabbar_home_tint_selector" />

Android---APK 瘦身

 

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

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

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

相关文章

  • 【flutter电子木鱼】flutter 打包 android apk,记录配置签名的过程/调试的过程及flutter build apk放到手机上用。

    【flutter电子木鱼】flutter 打包 android apk,记录配置签名的过程/调试的过程及flutter build apk放到手机上用。

    目标通过这篇blog记录一下flutter打包android apk的过程,项目是参考以下链接的git仓库,然后自己重新创建了一个project。安卓应用市场的木鱼充斥着广告和付费体验极差,自己做一个还可以根据喜好做适应性调整,不用担心被偷后台也不用烦广告和一些奇怪的布局,干净清爽,

    2024年02月10日
    浏览(11)
  • Android开发 APP代码安装APK安装包

     在Android 项目上架后,需要迭代更新,一般更新方式有:手动下载apk包手动安装、通过浏览器下载手动安装、 APP内部下载内部安装 。本文章就只讲解APP内部下载内部安装这个APP 更新方式。虽然网上关于APP内部apk安装的代码和文章很多,但太过于绝对,没有考虑一些特殊情况

    2023年04月08日
    浏览(11)
  • flutter开发实战-打包应用apk签名及Android studio没有generate signed bundle/apk问题修改

    flutter开发实战-打包应用apk签名及Android studio没有generate signed bundle/apk问题修改

    flutter开发实战-打包应用apk签名及Android studio没有generate signed bundle/apk问题修改 最近使用flutter开发项目,需要将打包应用时候apk进行签名,我这边开发使用的是Android studio,发现在Android studio的build没有generate signed bundle/apk。这里记录一下问题修改,以及生产签名文件及gradle配置

    2024年02月08日
    浏览(10)
  • 数据驱动开发模式将软件开发过程改造成一个公式化的迭代模式,可以提升软件开发效率,缩短开发周期,降低开发成本。

    作者:禅与计算机程序设计艺术 随着云计算、大数据等新兴技术的应用,软件开发领域迎来了蓬勃发展的时期。各种编程语言、框架、工具不断涌现,协同工作的强烈需求已经成为当今社会的一个主要挑战。这就需要一种新的开发方式来适应这种复杂多变的环境。传统的瀑布

    2024年02月06日
    浏览(41)
  • unity开发Android,unity直接打开其他apk,并传参数;以及接收参数的方法

    一,获取参数 要在Unity中实现Android端打开另一个应用程序并传递参数,你可以使用Android的Intent机制。  在需要启动另一个应用程序的地方调用这个方法。例如,你可以在按钮点击事件中调用它: 二,unity c#获取参数 Unity中开发的应用程序被Android的另一个应用程序传递参数时

    2024年01月21日
    浏览(10)
  • Android开发环境配置(内有完整过程配图)

    Android开发环境配置(内有完整过程配图)

    因为计算机操作系统的大作业选择了做Android的系统,所以需要配置一下开发环境。跟着其他大佬一步一步往下,也没出现什么问题,那接下来就跟我一起来配置一下吧! 首先我们需要安装JDK。JDK是Java语言的软件开发工具包。JDK是整个Java开发的核心,包含了Java的运行环境(

    2023年04月17日
    浏览(6)
  • apk反编译、修改、重新打包、签名全过程

    工具简介 dex2jar ,将可运行文件classes.dex反编译为jar源码文件 jd-gui ,查看jar源码文件 反编译

    2024年02月16日
    浏览(12)
  • 解决 Android 开发过程中 出现 Duplicate class(包冲突)

    解决 Android 开发过程中 出现 Duplicate class(包冲突)

    1、现在大部分的项目都是支持 Androidx 的,所以出现 Duplicate 的时候 先把 gradle.properties 文件中添加参数,支持使用AndroidX 2、有些 *.jar/*.aar 不支持 AndroidX 的时候,将上面的禁用 然后再排除 AndroidX 的引用   有很多,搜索一下 androidx 就能找到 3、排除了Androidx 的冲突后,包还有

    2023年04月09日
    浏览(9)
  • 马尔科夫决策过程-策略迭代与值迭代(基于动态规划)

    马尔科夫决策过程-策略迭代与值迭代(基于动态规划)

    强化学习入门笔记,基于easy RL RL基础 强化学习(reinforcement learning,RL):智能体可以在与复杂且不确定的环境进行交互时,尝试使所获得的奖励最大化的算法。 动作(action): 环境接收到的智能体基于当前状态的输出。 状态(state):智能体从环境中获取的状态。 奖

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

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

    2024年02月01日
    浏览(10)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包