【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 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 安装包优化】开启资源压缩 ( 资源压缩配置 | 启用严格模式的资源引用检查 | 自定义保留/移除资源配置 | 资源压缩效果 )相关推荐
- Android 安装包优化开启资源压缩
1,概述 为了尽可能减小应用的大小,您应在发布 build 中启用缩减功能来移除不使用的代码和资源.启用缩减功能后,您还会受益于两项功能,一项是混淆处理功能,该功能会缩短应用的类和成员的名称:另一项是 ...
- 【Android 安装包优化】资源混淆 ( AAPT2 资源编译工具 | resources.arsc 资源映射表 工作机制 )
文章目录 一.AAPT2 资源编译工具 二.resources.arsc 资源映射表 工作机制 三.参考资料 一.AAPT2 资源编译工具 资源的编译 , 生成 R.java 文件 , 都是通过 AA ...
- 【Android 安装包优化】资源混淆 ( resources.arsc 资源映射表文件格式 | 头文件 数据格式 | 全局字符串池 数据格式 | 包数据 数据格式 | 包头 数据格式 )
文章目录 一.resources.arsc 资源映射表文件格式 二.头文件 数据格式 三.全局字符串池 数据格式 四.包数据 数据格式 1.包头 数据格式 2.资源类型字符串池 数据格式 3.资源名称 ...
- 【Android 安装包优化】资源混淆 ( resources.arsc 资源映射表混淆 | resources.arsc 资源映射表二进制格式分析 | 混淆全局字符串池和资源名称字符串池 )
文章目录 一.resources.arsc 资源映射表 混淆 二.resources.arsc 资源映射表二进制格式分析 三.参考资料 资源混淆时 , 需要修改混淆 resources.arsc 资源 ...
- 【Android 安装包优化】Android 应用中 7zr 可执行程序准备 ( Android Studio 导入可执行 7zr 程序 | 从 Assets 资源文件拷贝 7zr 到内置存储 )
文章目录 一.Android Studio 导入可执行 7zr 程序 二.从 Assets 资源文件拷贝 7zr 到内置存储空间 三.参考资料 一.Android Studio 导入可执行 7zr 程 ...
- 【Android 安装包优化】使用 lib7zr.a 静态库处理压缩文件 ( 交叉编译 lib7zr.a 静态库 | 安卓工程导入静态库 | 配置 CMakeLists.txt 构建脚本 )
文章目录 一.修改 7zr 交叉编译脚本 Android.mk 二.完整的 7zr 交叉编译脚本 Android.mk 三.交叉编译 lib7zr.a 静态库 四.Android Studio 导入 ...
- 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( jni 中 main 函数声明 | 命令行处理 | jni 调用 lib7zr.so 函数库处理压缩文件完整代码 )
文章目录 一.JNI 中 main 函数声明 二.命令字符串切割并传入 main 函数 三.完整代码示例 1.完整 jni 代码 2.完整 java 代码 3.执行结果 四.参考资料 前置博客 : [ ...
- 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 测试 lib7zr.so 动态库调用 )
文章目录 一.拷贝 p7zip 源码中的头文件到 Android Studio 项目中 二.完整代码示例 1.Java 层代码 2.JNI 层代码 3.日志头文件 4.执行结果 四.参考资料 前置博客 ...
- 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 拷贝 lib7zr.so 动态库头文件到 Android 工程中 | 配置 CMakeLists.txt 构建脚本 )
文章目录 一.拷贝 p7zip 源码中的头文件到 Android Studio 项目中 二.配置 CMakeLists.txt 构建脚本 1.导入动态库 2.导入头文件 三.完整 CMakeLists ...
最新文章
- Android 标签 (FlexboxLayout实现标签)
- 禅修笔记——硅谷最受欢迎的情商课
- Intel 公开安全新特性:CET
- Educational Codeforces Round 75 (Rated for Div. 2)
- 复现经典:《统计学习方法》第 6 章 逻辑斯谛回归
- [ASP.NET 控件实作 Day14] 继承 CompositeControl 实作 Toolbar 控件
- 【bzoj2761】【JLOI2011】【不反复数字】【平衡树】
- 神经网络入门概念和框架理解(YOLOv1v2v3改进分析)
- Python socket UDP
- python open r w r+ w+ a的区别
- 教学设计的理念与方法【2】
- sql查询将字段值转换成汉字
- idm下载器怎么下载网页视频?如何用idm自动下载网站文件?
- android viewholder静态,使用内部viewHolder时声明为static的原因
- 七十首绝对好听的冷门歌曲(转)
- 写不成书,只寄得相思一点
- tcp发送窗口(滑动窗口)、拥塞窗口
- IT公司、软件公司资质(转)
- unity中让Rigidbody移动的方式
- 免费发短信软件有黑幕