腾讯TMQ在线沙龙|Android应用Dex分包之旅

Android应用Dex分包之旅

活动时间:2016年1月12日 QQ群视频交流

活动介绍:TMQ在线沙龙第十六期分享

本次分享的主题是Android应用Dex分包之旅。

共有42位测试小伙伴报名参加活动,在线观看视频人数18人~想知道活动分享了啥吗?往下看吧!

活动嘉宾

嘉宾简介

李金涛,腾讯高级测试工程师,负责过腾讯QQ浏览器专项测试及优化,目前主要负责腾讯应用宝专项测试及优化。有多年的后台开发和性能优化经验以及前端专项评测和优化经验。

分享主题

  • 什么是Dex?
  • 为什么要分Dex?
  • Dex分包的原理
  • Dex分包的方案
  • Dex分包的影响和测试关注

问答环节

1、提问:当apk中有jar包是混淆的时候是否可以进行dex分包,该jar无源码,如果可以dex分包我在分混淆的包时发生如下异常,应该如何解决

异常内容:java.io.IOException: Can't read [\build\intermediates\transforms\jarMerging\debug\jars\1\1f\combined.jar] (Can't process class [XXXXX.class] (Unknown verification type [73] in stack map frame))

答:当jar包是混淆包时,是可以进行dex分包的。理论上说,分包的过程不需要改变代码的编译和混淆的步骤,只需要在编译和混淆完成后,将.class文件拆分到不同目录(主、从dex的代码目录),然后对不同目录执行dx即可。至于你提到的异常,应该不是分包造成的,可能是将已经混淆过的jar包再次混淆造成的,建议参考一下Proguard相关的文档来解决。

2、提问:如果不使用dex分包,是否有其它的方法优化我们apk,比如给jar包进行瘦身

答:正如在分享中提到的那样,不使用dex分包,也是可以用缩减代码和方法数来优化dex的(给jar包瘦身也包含在内,因为第三方jar包最终也会被打包在dex文件中)。如果App的方法数或线性内存只是少量超标,这种方法是比较省时有效的,收益也较高。但是,在App的方法数或线性内存超标比较多的情况下,这种方法可能并不能完全解决问题,因为缩减代码和方法数一般是去掉冗余的代码,除非jar包或代码中有大量的冗余才能缩减得比较多。不过,从我们优化App的角度来说,即使不能完全解决问题,删除冗余代码或给jar包瘦身也是很有必要做的事情。

3、提问:使用dex分包需要考虑哪些可能会出现的问题

答:dex分包过程中可能出现的问题主要有NoClassDefFoundError、crash、启动耗时过长等。NoClassDefFoundError和crash一般都是某些依赖类找不到,可以通过调整这些依赖类的位置来解决;而启动耗时过长一般是从dex较大、加载过程较慢,可以通过调整从dex的大小或者优化启动过程来解决。具体说明可以参考分享PPT的内容。

4、提问:您提到在低版本构建工具上实现了分包,请问构建方案是Ant吗,能稍微介绍一下吗。我们这边修改Ant脚本调用高版本build tools上的分包相关脚本实现。

答:是的,我们也是用的ant,在ant任务里添加对分包工具和脚本的调用。我们分包并没有调整原来ant任务执行的顺序,而只是在其中插入了分包的步骤,主要的步骤包括:

1. 在Java代码编译完成后,插入扫描任务,扫描得到主dex应该包括的文件列表。

2. 在代码混淆完成后,插入拆分任务,根据主dex的文件列表将主、从dex的.class拆分到不同目录,然后用dx分别打出主、从dex。

5、提问:异步加载的坑能介绍下解决思路吗。

答:异步加载比同步加载要复杂一些,因为异步线程加载dex时,主线程还在继续执行,这就使得主dex的依赖类要比同步加载时多。如果有必要,可以适当做一些代码解耦。我们在做的过程中遇到的一些坑包括:

1. 主线程执行到某个阶段,需要的类在从dex中,但是从dex还没有加载完成,导致crash。这时可以在关键点加一个判断,判断异步线程加载是否完成,如果没完成,则等待加载完成后再继续执行。因为只有安装后首次启动App时才会有较大的加载耗时,所以加载可以放在启动页或欢迎页背后进行。

2. 如果App有外部调用入口,也要特别注意,防止外部调用时出现的加载问题。如果入口点太多,要想办法收敛。

获奖名单

ID:默言-游戏-自动化(576****67)

恭喜以上一位同学获得TMQ本次沙龙活动听众奖;

本次奖品是由TMQ 官方出品《移动APP性能评测与优化》新书哦

原文发布于微信公众号 - 腾讯移动品质中心TMQ(gh_2052d3e8c27d)

原文发表时间:2017-01-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏有趣的django

Flask构建微电影(一) 第一章、项目介绍第二章、环境搭建

27800
来自专栏求索之路

从零开始仿写一个抖音App——日志和埋点以及后端初步架构本项目的 github 地址:MyTikTok

拿 Java 来说:比如我们有两个服务 A、B 在两个服务器上,此时我们要在 A 上调用 B 的服务获取其上的数据 Foo。那么在 A 中可以写成 Foo f ...

57350
来自专栏Java技术分享

java系统高并发的解决方案

一个小型的网站,比如个人网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目录下,这样的网站对系统架构、性能的要求...

82480
来自专栏腾讯Bugly的专栏

《手Q Android线程死锁监控与自动化分析实践》

手Q每个版本上线以后研发同学都会收到各种问题反馈。在跟进手Q内部用户反馈的问题时,发现多例问题,其表象和原因如下:

1.1K80
来自专栏不止思考

数据库的这些性能优化,你做了吗?

我们可能会采取各种方式去优化,比如之前文章提到的缓存方案,SQL优化等等,除了这些方式以外,这里再分享几个针对数据库优化的常规手段:「数据读写分离」与「数据库S...

12320
来自专栏木可大大

漫谈计算机体系

人类为什么要发明计算机?一直以来,人类都有爱偷懒的习惯,而正是由于这个原因,促使了人类发明了计算机,从而提高生产力,那么人类有了更多空闲时间去娱乐了~~

1.4K240
来自专栏CDA数据分析师

案例分析:基于消息的分布式架构

美国计算机科学家,LaTex的作者Leslie Lamport说:“分布式系统就是这样一个系统,系统中一个你甚至都不知道的计算机出了故障,却可能导致你自己的计算...

31380
来自专栏铭毅天下

Elasticsearch大文件检索性能提升20倍实践(干货)

少废话,直接开始。 1、大文件是多大? ES建立索引完成全文检索的前提是将待检索的信息导入Elaticsearch。 项目中,有时候需要将一些扫描件、PDF文档...

41860
来自专栏Java技术分享

java系统高并发的解决方案

一个小型的网站,比如个人网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目录下,这样的网站对系统架构、性能的要...

1.1K90
来自专栏FreeBuf

一文了解安卓APP逆向分析与保护机制

3月17日,安卓巴士全球开发者论坛在重庆举办,网易资深安全工程师钟亚平出席交流活动,并做《安卓APP逆向与保护》的演讲。在分享中,他介绍了 Android Ap...

25730

扫码关注云+社区

领取腾讯云代金券