【Android 安装包优化】开启资源压缩 ( 资源压缩配置 | 启用严格模式的资源引用检查 | 自定义保留/移除资源配置 | 资源压缩效果 )

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 【Android 安装包优化】开启资源压缩 ( 资源压缩配置 | 启用严格模式的资源引用检查 | 自定义保留/移除资源配置 | 资源压缩效果 )

文章目录

一、开启资源压缩

二、启用严格模式的资源引用检查

三、自定义保留/移除资源配置

四、资源压缩效果

五、完整配置

1、keep.xml 配置

2、build.gradle 构建脚本

六、参考资料





一、开启资源压缩


缩减、混淆处理和优化应用 ( 官方文档 ) : https://developer.android.google.cn/studio/build/shrink-code



资源压缩 的前提是 代码压缩 必须开启 , 否则资源压缩无效 ;


代码压缩就是 混淆操作 , 参考 【Android 安装包优化】开启 ProGuard 混淆 ( 压缩 Shrink | 优化 Optimize | 混淆 Obfuscate | 预检 | 混淆文件编写 | 混淆前后对比 ) 博客 ;



编译打包时 , 先进行代码压缩混淆 , 删除不必要的代码 ; 然后使用资源压缩器移除不相关的资源 ; ( 先处理代码 , 再处理资源 )



资源压缩不是简单的将资源删除 , 而是将资源的文件保留 , 资源的实际内容替换掉 , 如 XML 文件资源 , 将其只保留一个根节点 ;



资源压缩配置是在 build.gradle 构建脚本中的 " android / buildTypes " 下的 debug / release 下配置 shrinkResources true 选项 ;



资源压缩 配置示例 :


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





二、启用严格模式的资源引用检查


资源压缩器 压缩资源时 , 默认使用比较保守的模式 , 通过动态 id 获取资源不会被移除 ;


动态 id 获取资源 , 参考 【Android 安装包优化】移除无用资源 ( 自动移除无用资源 | 直接引用资源 | 动态获取资源 id | Lint 检查资源 ) 二、直接引用资源与动态获取资源 2、动态获取资源 id 博客章节 ;



保守模式下进行资源压缩 , 没有任何效果 , 因此这里要启用严格模式 ;



在 " res/raw " 目录下创建 " keep.xml " 文件 , 文件内容如下 :


<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
    tools:shrinkMode="strict" />


这样就启用了应用资源的严格压缩模式 ;






三、自定义保留/移除资源配置


参考文档 : 自定义要保留的资源



如果开发者有想要特定保留或者必须移除的资源 , 可以进行自定义配置 ;


在 " res/raw " 目录下创建 " keep.xml " 文件中可以配置 保留 / 移除 的资源 ;


使用 tools:keep 属性指定要保留的资源 ; 如果保留多个资源使用逗号隔开 ;


使用 tools:discard 属性指定要移除的资源 ; 如果移除多个资源使用逗号隔开 ;


该设置支持 * 通配符 设置 ,



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


5





四、资源压缩效果


启动资源压缩后 , 压缩后的布局资源变成了如下内容 , 程序中没有引用该资源 , 在编译时 , 该资源自动替换成如下类型 ;



<?xml version="1.0" encoding="utf-8"?>
<x />


image.png






五、完整配置




1、keep.xml 配置


res/raw/keep.xml 配置文件 :
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
    tools:shrinkMode="strict" />




2、build.gradle 构建脚本


plugins {
    id 'com.android.application'
    id 'kotlin-android'
}
android {
    compileSdkVersion 30
    buildToolsVersion "30.0.3"
    defaultConfig {
        applicationId "kim.hsl.svg"
        minSdkVersion 18
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        // 生成 PNG 图片配置
        //generatedDensities = ['hdpi', 'mdpi', 'xhdpi',  'xxhdpi', 'xxxhdpi']
        // 使用 com.android.support:appcompat 支持库配置
        vectorDrawables.useSupportLibrary = true
        // 国际化资源配置, 只打包默认资源与英文资源
        resConfigs 'en'
    }
    buildTypes {
        debug {
            // 开启资源压缩
            shrinkResources true
            // 开启代码压缩
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
        release {
            // 开启资源压缩
            shrinkResources true
            // 开启代码压缩
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }
}
dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    implementation 'androidx.core:core-ktx:1.3.2'
    // 矢量图支持库 , 支持 5.0 以下版本手机使用矢量图 , 这个是创建应用时自带的配置
    implementation 'androidx.appcompat:appcompat:1.2.0'
    implementation 'com.google.android.material:material:1.3.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}






六、参考资料


参考官方文档 :


缩减、混淆处理和优化应用 : https://developer.android.google.cn/studio/build/shrink-code

参考之前的博客资源 :


【Android 安全】DEX 加密 ( ProGuard 混淆 | -keepclassmembers 混淆效果 | -keepclasseswithmembernames 混淆效果 )

【Android 安全】DEX 加密 ( Proguard 混淆 | 混淆后的报错信息 | Proguard 混淆映射文件 mapping.txt )

【Android 安全】DEX 加密 ( Proguard 混淆 | 将混淆后的报错信息转为原始报错信息 | retrace.bat 命令执行目录 | 暴露更少信息 )

【Android 安全】DEX 加密 ( Proguard 混淆 | 混淆后的报错信息 | Proguard 混淆映射文件 mapping.txt )


博客资源 :


GitHub 项目源码 : https://github.com/han1202012/SVG


下载地址 :


目录
相关文章
|
1月前
|
编译器 Android开发
配置环境变量,使CMakeLists.txt可直接使用Android NDK工具链编译项目
配置环境变量,使CMakeLists.txt可直接使用Android NDK工具链编译项目
|
1月前
|
Java Android开发 Windows
玩转安卓之配置gradle-8.2.1
为安卓开发配置Gradle 8.2.1,包括下载和解压Gradle、配置环境变量、修改配置文件以增加国内镜像,以及在Android Studio中配置Gradle和JDK的过程。
85 0
玩转安卓之配置gradle-8.2.1
|
3月前
|
Android开发
Android 配置蓝牙遥控器键值
本文详细介绍了Android系统中配置蓝牙遥控器键值的步骤,包括查看设备号、配置键位映射文件(kl文件)、部署kl文件以及调试过程,确保蓝牙遥控器的按键能正确映射到Android系统对应的按键功能。
155 1
|
3月前
|
搜索推荐 Android开发
学习AOSP安卓系统源代码,需要什么样的电脑?不同配置的电脑,其编译时间有多大差距?
本文分享了不同价位电脑配置对于编译AOSP安卓系统源代码的影响,提供了从6000元到更高价位的电脑配置实例,并比较了它们的编译时间,以供学习AOSP源代码时电脑配置选择的参考。
261 0
学习AOSP安卓系统源代码,需要什么样的电脑?不同配置的电脑,其编译时间有多大差距?
|
3月前
|
Ubuntu Android开发
安卓系统调试与优化:(一)bootchart 的配置和使用
本文介绍了如何在安卓系统中配置和使用bootchart工具来分析系统启动时间,包括安装工具、设备端启用bootchart、PC端解析数据及分析结果的详细步骤。
197 0
安卓系统调试与优化:(一)bootchart 的配置和使用
|
3月前
|
XML 安全 Android开发
Flutter配置Android和IOS允许http访问
Flutter配置Android和IOS允许http访问
122 3
|
3月前
|
监控 安全 API
Android项目架构设计问题之保证线上用户不会进入到本地配置页面如何解决
Android项目架构设计问题之保证线上用户不会进入到本地配置页面如何解决
32 0
|
3月前
|
JSON Android开发 数据格式
Android项目架构设计问题之在远端动态配置中添加相应配置如何解决
Android项目架构设计问题之在远端动态配置中添加相应配置如何解决
28 0
|
3月前
|
监控 Java 开发工具
### 绝招揭秘!Android平台GB28181设备接入端如何实现资源占用和性能消耗的极限瘦身?
【8月更文挑战第14天】本文介绍在Android平台优化GB28181标准下设备接入的性能方法,涵盖环境搭建、SDK集成与初始化。重点讲解内存管理技巧如软引用、按需加载资源,以及通过硬件加速解码视频数据和图像缩放来减轻CPU与GPU负担。同时采用线程池异步处理视频流,确保UI流畅性。这些策略有助于提高应用效率和用户体验。
47 0
|
3月前
|
移动开发 JavaScript Java
windows7下安装配置phonegap3.0 (cordavo)开发环境 (涉及android sdk配置)
windows7下安装配置phonegap3.0 (cordavo)开发环境 (涉及android sdk配置)
下一篇
无影云桌面