使用ClassyShark压缩你的项目
- 原文链接 : Shrinking Your Build With No Rules
and do it with Class(yShark)- 原文作者 : Roberto Orgiu
- 译文出自 : 开发技术前线 www.devtf.cn
- 转载声明: 本译文已授权开发人员头条享有独家转载权,未经同意,不得转载!
- 译者 : XWZack
- 校对者: Mr.Simple
- 状态 : 校对中 `
近期,我们的项目中用到了一个重要的框架。它为我们的产品提供了一个非常关键的功能。
你能够想象一下,这个框架的SDK是相当巨大的,它包括45K的方法:这足以使我们的项目(已经用到了Support Library和Play Services)产生使用MultiDex分包的冲动。
深入引用库
去掉引用库中不须要的部分是相当简单的,可是理解怎样修剪上面提到的框架又是另外一回事了:该框架须要作为我们项目的子模块被引入,从而使4个.so文件和3个.jar包被正确关联。在特定平台上构建的本地库带有一个.so拓展文件,这个文件通常放置在与系统架构,诸如x86或armeabi有关的文件夹中。
如今唯一的选择就是让这个框架脱离ProGuard的混淆范围,可是这样一来,即便不用MultiDex分包。至少终于APK的大小也会达到将近50MB。也就是说,这样做的效果肯定不理想:每当我们公布更新,全部用户必须下载整个APK,之后APK被解压。并在每一个设备上占用很多其它的空间。而这些空间我们本不须要占用。
曾经的处理方法
假设放在几个星期前,我们可能会这样处理:用ApkTool反编译每一个引用库。手动查找全部的引用,然后用Atom或者Sublime Text浏览每一个文件。假设真的这么做了,可能会浪费大量的时间:由于在反编译APK的时候,ApkTool是一个非常棒的工具。但对于这样的特殊情况。我们须要一个更灵活。可能也更有帮助的工具。
ClassyShark介绍
幸运的是,有这样一个工具:ClassyShark。
这个软件是正是我们所须要的:通过简单地打开菜单根文件夹的.jar。我们能够非常easy地跟踪每一个被我们调用的方法的依赖关系。差点儿就像是用IDE浏览源码。

比如,通过双击反编译库中声明的类型,就能够轻松地打开了这个类,并跟踪相关的依赖列表。
此外,假设你由于某种原因无法找到想要的文件。通过窗体顶部的大写和小写敏感的输入框你总能搜到你想要的类。
在ClassyShark的帮助下,我们能够“轻松地”获取我们须要保存的全部依赖。并在非常短的时间内为ProGuard加入正确的规则,使我们从令人头疼的手动跟踪依赖链接,甚至编译一遍仅仅是想看看少了哪些引用中挽救出来。
结语
不幸的是,我们无法摆脱MultiDex库,但我们的确缩小了我们的项目。而且我们发行版本号的APK大小。如今大概13 MB。相比于初始大小降低了约75%。
就算没有完美解决,也算得上是功德圆满了。
感谢我的同事 Giuseppe和我的朋友 Boris, Mario 和 Sebastiano校对这篇文章。
使用ClassyShark压缩你的项目的更多相关文章
- webpack压缩图片之项目资源优化
webpack打包时,会根据webpack.config.js 中url-loader中设置的limit大小来对图片进行处理,小于limit的图片转化成base64格式,其余的不做操作.对于比较大的图 ...
- JS项目快速压缩(windows平台)
问题 当下JS项目都有node_modules,从而项目文件多,容量大. 如何快速压缩一个JS项目? 方法 首先对JS项目安装生产环境的依赖npm install --production. 这时不要 ...
- 【C#公共帮助类】WinRarHelper帮助类,实现文件或文件夹压缩和解压,实战干货
关于本文档的说明 本文档使用WinRAR方式来进行简单的压缩和解压动作,纯干货,实际项目这种压缩方式用的少一点,一般我会使用第三方的压缩dll来实现,就如同我上一个压缩类博客,压缩的是zip文件htt ...
- Alpha阶段项目Postmortem
以下对成员名字的简称: 陈鸿超 = 陈1 陈彦吉 = 陈2 石浩然 = 石 韩青长 = 韩 1. 设想和目标 1.1 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? ...
- [转]Android开源项目第二篇——工具库篇
本文为那些不错的Android开源项目第二篇--开发工具库篇,主要介绍常用的开发库,包括依赖注入框架.图片缓存.网络相关.数据库ORM建模.Android公共库.Android 高版本向低版本兼容.多 ...
- Android开源项目分类汇总
目前包括: Android开源项目第一篇——个性化控件(View)篇 包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView. ...
- Android开源项目(二)
第二部分 工具库 主要包括那些不错的开发库,包括依赖注入框架.图片缓存.网络相关.数据库ORM建模.Android公共库.Android 高版本向低版本兼容.多媒体相关及其他. 一.依赖注入DI 通过 ...
- GitHub上史上最全的Android开源项目分类汇总 (转)
GitHub上史上最全的Android开源项目分类汇总 标签: github android 开源 | 发表时间:2014-11-23 23:00 | 作者:u013149325 分享到: 出处:ht ...
- 【Android】Android开源项目分类汇总
第一部分 个性化控件(View) 主要介绍那些不错个性化的View,包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.Pro ...
随机推荐
- 使用h5 <a>标签 href='url' download 下载踩过的坑
用户点击下载多媒体文件(图片/视频等),最简单的方式: <a href='url' download="filename.ext">下载</a> 如果url ...
- Solr 定义
福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号: 大数据躺过的坑 Java从入门到架构师 人工智能躺过的坑 Java全栈大联盟 ...
- element-ui一些注意点:
1.change ($event,“你要传递的其他值”),使用el-select组件时,想传递多个值. 或者 在el-option上的value属性上传递对象 eg: :value="{'c ...
- WHU 1470 Join in tasks 水题
http://acm.whu.edu.cn/land/problem/detail?problem_id=1470 大概是给你一个队列,每次移动队头的数到队尾并减1,如果本身这个数为1就删去. 然后a ...
- ZJOI2005沼泽鳄鱼
矩阵优化dp ** 注意:矩阵乘法没有交换律 ** 思路:类比P2151hh去散步 代码特点在一维的答案矩阵 1.矩阵优化两点间方案数不必赘述 2.注意2,3,4可以办到以他们的lcm为周期,正是因为 ...
- 【Django】AJAX
目录 JSON 序列化 stringify 反序列化 parse JSON与XML对比 AJAX简介 AJAX常见应用场景 jQuery实现AJAX JS实现AJAX AJAX请求设置csrf_tok ...
- 微信小程序从零开始开发步骤(六)4种页面跳转的方法
用法:用于页面跳转,相当于html里面的<a></a>标签. API教程:https://mp.weixin.qq.com/debug/wxadoc/dev/component ...
- Android ImageView设置图片原理(上)
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 首先关于图片加载到ImageView上,我们来讨论几个问题: 如下: imageView.setIm ...
- ArcGIS “Error HRESULT E_FAIL has been returned from a call to a COM component.” 异常的解决
错误提示内容: {System.Runtime.InteropServices.COMException (0x80004005): Error HRESULT E_FAIL has been ret ...
- Exchanging Partitions and Subpartitions with Tables--官方文档
原文地址:https://dev.mysql.com/doc/refman/5.6/en/partitioning-management-exchange.html In MySQL 5.6, it ...