文章目录

  • 一、开启资源压缩
  • 二、启用严格模式的资源引用检查
  • 三、自定义保留/移除资源配置
  • 四、资源压缩效果
  • 五、完整配置
    • 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 trueminifyEnabled trueproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}release {shrinkResources true minifyEnabled trueproguardFiles 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" />

四、资源压缩效果


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

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

五、完整配置


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 30buildToolsVersion "30.0.3"defaultConfig {applicationId "kim.hsl.svg"minSdkVersion 18targetSdkVersion 30versionCode 1versionName "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 trueproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}release {// 开启资源压缩shrinkResources true// 开启代码压缩minifyEnabled trueproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}compileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility 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

  • 下载地址 :

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

  1. Android 安装包优化开启资源压缩

    1,概述 为了尽可能减小应用的大小,您应在发布 build 中启用缩减功能来移除不使用的代码和资源.启用缩减功能后,您还会受益于两项功能,一项是混淆处理功能,该功能会缩短应用的类和成员的名称:另一项是 ...

  2. 【Android 安装包优化】资源混淆 ( AAPT2 资源编译工具 | resources.arsc 资源映射表 工作机制 )

    文章目录 一.AAPT2 资源编译工具 二.resources.arsc 资源映射表 工作机制 三.参考资料 一.AAPT2 资源编译工具 资源的编译 , 生成 R.java 文件 , 都是通过 AA ...

  3. 【Android 安装包优化】资源混淆 ( resources.arsc 资源映射表文件格式 | 头文件 数据格式 | 全局字符串池 数据格式 | 包数据 数据格式 | 包头 数据格式 )

    文章目录 一.resources.arsc 资源映射表文件格式 二.头文件 数据格式 三.全局字符串池 数据格式 四.包数据 数据格式 1.包头 数据格式 2.资源类型字符串池 数据格式 3.资源名称 ...

  4. 【Android 安装包优化】资源混淆 ( resources.arsc 资源映射表混淆 | resources.arsc 资源映射表二进制格式分析 | 混淆全局字符串池和资源名称字符串池 )

    文章目录 一.resources.arsc 资源映射表 混淆 二.resources.arsc 资源映射表二进制格式分析 三.参考资料 资源混淆时 , 需要修改混淆 resources.arsc 资源 ...

  5. 【Android 安装包优化】Android 应用中 7zr 可执行程序准备 ( Android Studio 导入可执行 7zr 程序 | 从 Assets 资源文件拷贝 7zr 到内置存储 )

    文章目录 一.Android Studio 导入可执行 7zr 程序 二.从 Assets 资源文件拷贝 7zr 到内置存储空间 三.参考资料 一.Android Studio 导入可执行 7zr 程 ...

  6. 【Android 安装包优化】使用 lib7zr.a 静态库处理压缩文件 ( 交叉编译 lib7zr.a 静态库 | 安卓工程导入静态库 | 配置 CMakeLists.txt 构建脚本 )

    文章目录 一.修改 7zr 交叉编译脚本 Android.mk 二.完整的 7zr 交叉编译脚本 Android.mk 三.交叉编译 lib7zr.a 静态库 四.Android Studio 导入 ...

  7. 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( jni 中 main 函数声明 | 命令行处理 | jni 调用 lib7zr.so 函数库处理压缩文件完整代码 )

    文章目录 一.JNI 中 main 函数声明 二.命令字符串切割并传入 main 函数 三.完整代码示例 1.完整 jni 代码 2.完整 java 代码 3.执行结果 四.参考资料 前置博客 : [ ...

  8. 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 测试 lib7zr.so 动态库调用 )

    文章目录 一.拷贝 p7zip 源码中的头文件到 Android Studio 项目中 二.完整代码示例 1.Java 层代码 2.JNI 层代码 3.日志头文件 4.执行结果 四.参考资料 前置博客 ...

  9. 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 拷贝 lib7zr.so 动态库头文件到 Android 工程中 | 配置 CMakeLists.txt 构建脚本 )

    文章目录 一.拷贝 p7zip 源码中的头文件到 Android Studio 项目中 二.配置 CMakeLists.txt 构建脚本 1.导入动态库 2.导入头文件 三.完整 CMakeLists ...

最新文章

  1. Android 标签 (FlexboxLayout实现标签)
  2. 禅修笔记——硅谷最受欢迎的情商课
  3. Intel 公开安全新特性:CET
  4. Educational Codeforces Round 75 (Rated for Div. 2)
  5. 复现经典:《统计学习方法》第 6 章 逻辑斯谛回归
  6. [ASP.NET 控件实作 Day14] 继承 CompositeControl 实作 Toolbar 控件
  7. 【bzoj2761】【JLOI2011】【不反复数字】【平衡树】
  8. 神经网络入门概念和框架理解(YOLOv1v2v3改进分析)
  9. Python socket UDP
  10. python open r w r+ w+ a的区别
  11. 教学设计的理念与方法【2】
  12. sql查询将字段值转换成汉字
  13. idm下载器怎么下载网页视频?如何用idm自动下载网站文件?
  14. android viewholder静态,使用内部viewHolder时声明为static的原因
  15. 七十首绝对好听的冷门歌曲(转)
  16. 写不成书,只寄得相思一点
  17. tcp发送窗口(滑动窗口)、拥塞窗口
  18. IT公司、软件公司资质(转)
  19. unity中让Rigidbody移动的方式
  20. 免费发短信软件有黑幕

热门文章

  1. dhcp 中继代理配置方法
  2. 解决Jenkins Email Extension Plugin发送邮件失败
  3. 关于 IE的文档模式的指定
  4. 求伯君:向暴雪学习 金山不求一夜暴富
  5. JZ2440开发笔记(4)——设置静态IP
  6. 软件工程学习笔记——软件工程基本原理
  7. ARM非对齐操作异常解决过程
  8. linux设置外接显示器的分辨率
  9. css考核点整理(十一)-响应式开发经验,响应式页面的三种核心技术是什么
  10. Java Daemon线程