一. 压缩图片
国外的网址:无损压缩
https://www.tinypng.com/
缺点:上传任何未发布产品的内容到外部网络,都有可能引起数据泄漏,
二.使用Android Lint分析去除无用资源
备注:删除的如果是有用到的,Studio会提示
删除的一些无用的,有时候也会导致问题,xml不报错,编译的时候会报错
1. Analyze - -> Run Inspection by Name --> 输入 unused resource 之后敲下回车Android Lint就会开始分析项目中哪里存在着无用资源
2. 根据Android Lint给出的分析结果,确认资源的使用情况,确认为无用资源后(一般来说全局搜索下资源名,除了在R.Java中外其他地方都没引用就是无用资源)删除即可
APK包结构如下:
1. lib/:包含特定于处理器软件层的编译代码。该目录包含了每种平台的子目录,像armeabi,armeabi-v7a, arm64-v8a,x86,x86_64,和mips。大多数情况下我们可以只用一种armeabi-v7a,后面会讲到原因。
2. assets/:包含应用可以使用AssetManager对象检索的应用资源。
3. res/:包含未编译到的资源 resources.arsc,主要有图片资源文件。
4. META-INF/:包含CERT.SF和 CERT.RSA签名文件以及MANIFEST.MF 清单文件。
5. resources.arsc:包含已编译的资源。该文件包含res/values/ 文件夹所有配置中的XML内容。打包工具提取此XML内容,将其编译为二进制格式,并将内容归档。此内容包括语言字符串和样式,以及直接包含在resources.arsc文件中的内容路径 ,例如布局文件和图像。
6. classes.dex:包含以Dalvik / ART虚拟机可理解的DEX文件格式编译的类。
7. AndroidManifest.xml:包含核心Android清单文件。该文件列出应用程序的名称,版本,访问权限和引用的库文件。该文件使用Android的二进制XML格式。
(简单说下图中的Raw File Size(磁盘解压后的大小)和DownLoad Size(从应用商店下载的大小),如果想了解更多关于Analyaer分析的知识,可以参考这篇文章使用APK Analyzer分析你的APK),分析了包结构组成之后,我们可以开始瘦身操作了。
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2017/0504/7909.html
三:开启minifyEnabled混淆代码
buildTypes {
release {
//是否进行混淆
minifyEnabled true
// 移除无用的resource文件g
shrinkResources true
//混淆规则文件
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
debug {
// buildConfigField 自定义配置默认值
signingConfig signingConfigs.debug
debuggable true
}
}
四:在gradle使用shrinkResources去除无用资源,效果非常好。
buildTypes {
release {
//是否进行混淆
minifyEnabled true
// 移除无用的resource文件g
shrinkResources true
//混淆规则文件
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
五:用极限压缩工具
或者:使用AndResGuard
AndResGuard是微信开源出来的一个打包工具
原理:
1. 资源(png, xml, jpg等)名称混淆,资源路径名称混淆以及名称长度压缩;
2. 原来以STORED形式存储到zip中的png文件被改成了DEFLATED(普通压缩存储)方式;
3. 意外发现resources.arsc, META-INF/*.SF 以及 META-INF/*.MF变小了,而且是解压之后的文件大小也变小了。
六:使用SVG图片格式
用 SVG 的优势在于:
1.SVG 可被非常多的工具读取和修改(比如记事本),由于使用xml格式定义,所以可以直接被当作文本文件打开,看里面的数据;
2.SVG 与 JPEG 和 GIF 图像比起来,尺寸更小,且可压缩性更强,SVG 图就相当于保存了关键的数据点,比如要显示一个圆,需要知道圆心和半径,那么SVG 就只保存圆心坐标和半径数据,而平常我们用的位图都是以像素点的形式根据图片大小保存对应个数的像素点,因而SVG尺寸更小;
3.SVG 是可伸缩的,平常使用的位图拉伸会发虚,压缩会变形,而SVG格式图片保存数据进行运算展示,不管多大多少,可以不失真显示;
4.SVG 图像可在任何的分辨率下被高质量地打印;
5.SVG 可在图像质量不下降的情况下被放大;
6.SVG 图像中的文本是可选的,同时也是可搜索的(很适合制作地图);
7.SVG 可以与 Java 技术一起运行;
8.SVG 是开放的标准;
9.SVG 文件是纯粹的 XML;
七:支持插件化
插件化:支持动态的加载代码和动态的加载资源,把APP的一部分分离出来了,对于业务庞大的项目来说非常有用,极大的分解了APP大小。因为插件化技术需要一定的技术保障和服务端系统支持
360 插件化方案解决: https://github.com/Qihoo360/RePlugin
腾讯资源混淆方案:https://mp.weixin.qq.com/s?__biz=MzAwNDY1ODY2OQ==&mid=208135658&idx=1&sn=ac9bd6b4927e9e82f9fa14e396183a8f#rd