首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

dex分包变形记

当方法数量过多导致超出缓冲区大小时,也会造成dexopt崩溃。...编译、打包,并没有像预期那样生成多个 dex,而是只生成了一个 classes.dex: ? 生成的 apk 包跟 dex 分包前一样。为什么会这样?...3.安装运行 我们把分包后的 apk 在 Android 4.3的手机上进行安装。没有问题,顺利安装上了! 没想到的是,启动时没出现任何页面,直接 crash。Crash 的 log 如下: ?...答案是,我们需要统一混淆后再做拆分。因为如果拆分后各自混淆,则必然会造成混淆后主、从 dex 引用类名的不一致,从而导致应用无法正常运行。...这两者的区别就是 PathClassLoader 不能主动从 zip 包中释放出 dex,因此只支持直接操作 dex 格式文件,或者已经安装的 apk(因为已经安装的 apk 在 cache 中存在缓存的

1.7K110

【新技能get】让App像Web一样发布新版本

好,该方案基于第二个拆分dex的方案,方案实现如果懂拆分dex的原理的话,大家应该很快就会实现该方案,如果没有拆分dex的项目的话,可以参考一下谷歌的multidex方案实现。...ActivityManager在patch.dex中 结果发生了错误。 这里有个问题,拆分dex的很多类都不是在同一个dex内的,怎么没有问题?...让我们搜索一下抛出错误的代码所在,嘿咻嘿咻,找到了一下代码: ? 从代码上来看,如果两个相关联的类在不同的dex中就会报错,但是拆分dex没有报错这是为什么,原来这个校验的前提是: ?...空间使用的是在字节码插入代码,而不是源代码插入,使用的是javaassist库来进行字节码插入的。...但是在大项目中拆分dex的问题已经比较严重,很多类都没有被打上这个标志。 如何打包补丁包: 1.空间在正式版本发布的时候,会生成一份缓存文件,里面记录了所有class文件的md5。

663130
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Android 增量更新之文件的拆分和合并

    前言 正常一个项目的版本更新,很多情况下是进行apk包的新版本发布,让用户下载更新,但是有个弊端就是如果包体很大,这样就耗时又费流量。...针对的是功能模块层级面 增量更新 增量更新是针对新旧Apk文件对比,拆分出(.patch)的更新文件,(.patch)文件包含的是新包相对旧包没有的内容,然后由客户端进行合并成新的Apk。...可执行文件.png 文件的拆分 Apk的文件拆分,将新版本的apk和旧版本的apk,差异的内容进行分解出来,生成.patch文件 使用现成的可执行文件进行拆分 ?...(这边是没有做下载,直接向文件放置到外置存储卡) 如果要将(.patch)文件和旧版本APK合成新版本的Apk,那么问题来了,旧的apk去哪里获取?...结语 以上就是一个简单的增量更新过程:主要的内容是在服务端对apk文件进行拆分出(.patch)文件,然后再客户端将旧版本apk和服务端下载下来(.patch)进行合并出新版本apk,进行新版本安装更新

    2K61

    得物App安卓冷启动优化-Application篇

    1.1 任务拆分a. provider预加载WebViewFactoryProvider是用于和webview渲染进程交互的接口类,webview初始化的第一步就是加载系统webview的apk文件,构建出...1.崩溃防护由于启动阶段执行的任务都是重要的基础库初始化,因此发生崩溃时将异常识别并吃掉的意义不大,因为大概率会导致后续崩溃或功能异常,因此我们主要的防护工作都是发生问题之后的止血。...这种情况下只能清空App缓存或者卸载重装,会造成非常严重的用户流失。...所以在拆分任务时不仅需要考虑是否会和与其并发的任务竞争资源,还需要考虑启动各个阶段以及启动后一段时间内的功能稳定性和性能是否会受之影响,并且需要在高中低端机器上都验证下,至少要确保都没有劣化的表现。...例如两次启动做trace对比时,其中一次因为遇到IO阻塞导致某次读文件的操作都明显变慢,而另一次IO正常,这就会误导开发者去分析这些正常的代码,而实际导致劣化的代码可能因为波动正好被掩盖。

    92430

    ERROR: Conflicting configuration : arm64-v8a in ndk abiFilters cannot be present when split...

    在这里记录一下这个错误,防止自己以后再犯 ^ _ ^ 优化ApK大小之ABI Filters 和 APK split 想要打出的 apk 包含多个架构的 so库 需要下面的配置: android {...,才能启用ABI拆分机制在打包时根据架构生成不同的apk文件 universalApk false // If true, 构建支持所有平台abi类型,构建一个包,包含多个架构的...exclude "x86" // 设置所有不要支持的abi类型 } } } 这种配置是没有办法让打出的 apk 只包含自己想要的多种架构的~!...ABI 拆分当中的 include 是和 ndk abiFilters 互斥的操作!!...总结 如果两种方式分开配置都可以运行; 两种方式一起配置在不报错的情况下(ABI拆分注调include),ABI 拆分不生效;

    2.8K10

    Nuwa学习笔记

    return null; } 一个ClassLoader可以包含多个dex文件,每个dex文件是一个Element,多个dex文件排列成一个有序的数组dexElements,当找类的时候,会按顺序遍历dex...ActivityManager在patch.dex中 结果发生了错误。 这里有个问题,拆分dex的很多类都不是在同一个dex内的,怎么没有问题?...让我们搜索一下抛出错误的代码所在,嘿咻嘿咻,找到了一下代码: ? 从代码上来看,如果两个相关联的类在不同的dex中就会报错,但是拆分dex没有报错这是为什么,原来这个校验的前提是: ?...空间使用的是在字节码插入代码,而不是源代码插入,使用的是javaassist库来进行字节码插入的。...但是在大项目中拆分dex的问题已经比较严重,很多类都没有被打上这个标志。 如何打包补丁包: 1.空间在正式版本发布的时候,会生成一份缓存文件,里面记录了所有class文件的md5。

    92020

    MultiDex(一)之源码解析

    Multidex在构建打包阶段将Class拆分到多个Dex,使之不超过单Dex最大方法数的限制;这样打包就不会失败了。...而正是因为这个数组,使我们有机会将Dex包装成的Element对象扩展到其中。这样ClassLoader加载Class的时候就也会遍历调用到加进来的Dex,从而找到需要的Class。...①INSTALL_FAILED_DEXOPT;在部分机型会出现无法安装的问题没有解决。...当方法数量过多导致超出缓冲区大小时,会造成dexopt崩溃。 也就是说,即便是方法数不超标,也不能保证一定能安装成功,因为DexOpt过程可能因为LinearAlloc的限制而失败。...②ANR的问题:从以上MultiDex的工作流程可以看到:MultiDex工作在主线程,而Dex的提取与DexOpt的过程都是耗时的操作,所以ANR的问题是必然存在;而且业务量越大,拆分出来的Dex越多

    82720

    资深程序员带你解锁Android性能优化五大误区和两大疑点!(附333页性能优化PDF宝典)

    误区二:Getters 和 Setters 方法更耗时 因为担心性能下降,有些开发者会选择在类中直接使用 public 修饰字段,而不去写 getter 和 setter 方法,如下面这段代码,这里的...,我们甚至发现结果速度可能会慢 100% 的例子,这是因为 runtime 在 debug 模式下时对代码几乎没有优化,因此与用户在生产设备上运行的代码有很大不同。...为了测试多个 dex 文件对性能的影响,我们使用了计算器应用,默认情况下,它只包含单个 dex 文件,我们可以根据其程序包边界将其拆分为五个 dex 文件,来根据功能部件模拟拆分。...首先,测试启动应用的性能,结果如下: image.png 因此,拆分 dex 文件对此处并没有影响,对于其他应用,可能会因为某些因素而产生轻微的开销:应用程序的大小以及拆分方式。...接下来是 APK 的大小和内存消耗: image.png image.png 如图所示,APK 大小和应用的运行时内存占用量都略有增加,这是因为将应用程序拆分为多个 dex 文件时,每个 dex 文件都会有一些符号表和缓存表中的重复数据

    81322

    MySQL大表优化技术,你都会了吗?

    当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑、部署、运维的各种复杂度,一般以整型值为主的表在千万级以下...,字符串为主的表在五百万以下是没有太大问题的。...支持事务 支持外键 支持崩溃后的安全恢复 不支持全文索引 总体来讲,MyISAM适合SELECT密集型的表,而InnoDB适合INSERT和UPDATE密集型的表 系统调优参数 可以使用下面几个工具来做基准测试...垂直分表是对数据表进行垂直拆分的一种方式,常见的是把一个多字段的大表按常用字段和非常用字段进行拆分,每个表里面的数据记录数一般情况下是相同的,只是字段不一样,使用主键关联 比如原始的用户表是: ?...总体上来说,分片的选择是取决于最频繁的查询SQL的条件,因为不带任何Where语句的查询SQL,会遍历所有的分片,性能相对最差,因此这种SQL越多,对系统的影响越大,所以我们要尽量避免这种SQL的产生。

    60350

    可能是全网最好的MySQL重要知识点面试题总结

    大多数时候我们使用的都是 InnoDB 存储引擎,但是在某些情况下使用 MyISAM 也是合适的比如读密集的情况下。(如果你不介意 MyISAM 崩溃回复问题的话)。...一般情况下我们选择 InnoDB 都是没有问题的,但是某事情况下你并不在乎可扩展能力和并发能力,也不需要事务支持,也不在乎崩溃后的安全恢复问题的话,选择MyISAM也是一个不错的选择。...万一在这两个操作之间突然出现错误比如银行系统崩溃,导致小明余额减少而小红的余额没有增加,这样就不对了。事务就是保证这两个关键操作要么都成功,要么都要失败。 事物的四大特性(ACID) ?...因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是“脏数据”,依据“脏数据”所做的操作可能是不正确的。...《Java工程师修炼之道》的作者推荐 尽量不要对数据进行分片,因为拆分会带来逻辑、部署、运维的各种复杂度 ,一般的数据表在优化得当的情况下支撑千万以下的数据量是没有太大问题的。

    42120

    MySQL知识点总结

    大多数时候我们使用的都是 InnoDB 存储引擎,但是在某些情况下使用 MyISAM 也是合适的比如读密集的情况下。(如果你不介意 MyISAM 崩溃回复问题的话)。...一般情况下我们选择 InnoDB 都是没有问题的,但是某事情况下你并不在乎可扩展能力和并发能力,也不需要事务支持,也不在乎崩溃后的安全恢复问题的话,选择MyISAM也是一个不错的选择。...万一在这两个操作之间突然出现错误比如银行系统崩溃,导致小明余额减少而小红的余额没有增加,这样就不对了。事务就是保证这两个关键操作要么都成功,要么都要失败。 事务的四大特性(ACID) ?...因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是“脏数据”,依据“脏数据”所做的操作可能是不正确的。...《Java工程师修炼之道》的作者推荐 尽量不要对数据进行分片,因为拆分会带来逻辑、部署、运维的各种复杂度 ,一般的数据表在优化得当的情况下支撑千万以下的数据量是没有太大问题的。

    88520

    MySQL知识点总结

    大多数时候我们使用的都是 InnoDB 存储引擎,但是在某些情况下使用 MyISAM 也是合适的比如读密集的情况下。(如果你不介意 MyISAM 崩溃回复问题的话)。...一般情况下我们选择 InnoDB 都是没有问题的,但是某事情况下你并不在乎可扩展能力和并发能力,也不需要事务支持,也不在乎崩溃后的安全恢复问题的话,选择MyISAM也是一个不错的选择。...万一在这两个操作之间突然出现错误比如银行系统崩溃,导致小明余额减少而小红的余额没有增加,这样就不对了。事务就是保证这两个关键操作要么都成功,要么都要失败。 事物的四大特性(ACID) ?...因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是“脏数据”,依据“脏数据”所做的操作可能是不正确的。...《Java工程师修炼之道》的作者推荐 尽量不要对数据进行分片,因为拆分会带来逻辑、部署、运维的各种复杂度 ,一般的数据表在优化得当的情况下支撑千万以下的数据量是没有太大问题的。

    48640

    Android动态化框架App Bundles

    Split Apks split apks是Android 5.0开始提供多apk构建机制,借助split apks可以将一个apk基于ABI和屏幕密度两个维度拆分城多个apk,这样可以有效减少apk体积...当用户下载应用程序安装包时,只会包含对应平台的so和资源。因为需要google play支持,所以国内就没戏了。...拆分成多个apk,按需加载(包括加载C/C++ libraries),这样开发者可以随时按需交付功能,而不是仅限在安装过程中。...AAB并不是一个插件化框架,它利用的是Android Framework提供的split apks技术来完成的,而所有安装split apk工作均是通过IPC交由google play完成。...从aab文件内容,可知其包含base和feature的代码、资源、so等,同时还有BundleConfig.pb这一配置文件,该配置文件是google play用于拆分apk。

    1.6K40

    APK安装流程详解9——PackageParser解析APK(上)

    的时候首先会解析APK,而解析APK则需要用到一个工具类,这个工具类就是PackageParser 为了让咱们更好的理解谷歌的安卓团队对PackageParser的定位,我们来看下PackageParser...APK,即一个应用只有一个APK文件,而Google Play 还允许你为一个应用中发布不同的APK文件,这些APK文件适用于不同的设备,例如:你现在有一个APP叫DEMO1,但是目前由于APK的体积太大或者其他因素导致不能同时适用于手机和平板...,此时你就可以将原先的DEMO.apk,拆分为Demo_phone和Demo_tablet分别用于运行在android手机和Android平板,只要保存两者拥有相同的包名,并用相同key进行签名就可以在发布...一个包由一个"基础"APK和多个"拆分"APK构成。 这个类其实就是通过解析APK而对应的一个"包"的类,这个包代表一个磁盘上的APK安装包。...它自动会检测安装包的模式的是单一APK或者集群APK模式。 这样就可以对"集群APK"的安装包进行理性的检查,比如会检查"base APK"和"拆分APK"是否具有相同的包名和版本号。

    5.9K10

    安卓 App 热补丁动态修复技术介绍

    )中去,然后把这个dex插入到Elements的最前面,如下图: [image.jpg] 好,该方案基于第二个拆分dex的方案,方案实现如果懂拆分dex的原理的话,大家应该很快就会实现该方案,如果没有拆分...这里有个问题,拆分dex的很多类都不是在同一个dex内的,怎么没有问题?...,会被永远的打上找不到的标志) 其中: [image.jpg] 之所以选择构造函数是因为他不增加方法数,一个类即使没有显式的构造函数,也会有一个隐式的默认构造函数。...空间使用的是在字节码插入代码,而不是源代码插入,使用的是javaassist库来进行字节码插入的。...这里我们会做一下更加详细的性能测试.但是在大项目中拆分dex的问题已经比较严重,很多类都没有被打上这个标志。

    3.3K10

    MySQL千万级别大表,你要如何优化?

    当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑、部署、运维的各种复杂度,一般以整型值为主的表在千万级以下...,字符串为主的表在五百万以下是没有太大问题的。...支持事务 支持外键 支持崩溃后的安全恢复 不支持全文索引 总体来讲,MyISAM适合SELECT密集型的表,而InnoDB适合INSERT和UPDATE密集型的表 系统调优参数 可以使用下面几个工具来做基准测试...垂直分表是对数据表进行垂直拆分的一种方式,常见的是把一个多字段的大表按常用字段和非常用字段进行拆分,每个表里面的数据记录数一般情况下是相同的,只是字段不一样,使用主键关联 比如原始的用户表是: 垂直拆分的优点是...分片原则 能不分就不分,参考单表优化 分片数量尽量少,分片尽量均匀分布在多个数据结点上,因为一个查询SQL跨分片越多,则总体性能越差,虽然要好于所有数据在一个分片的结果,只在必要的时候进行扩容,增加分片数量

    1.3K10

    对MySQL分库分表的一些理解

    然而,这样的分区行为存在一定的弊端: 首先,在使用分区表的时候,SQL需要遵循一定的规则,否则容易造成全表锁,导致分区的性能比较低下; 其次,如果数据量越来越多,在分区表上执行一个关联查询,那么性能会相当低下...在实际线上的大库大表进行分库分表的时候,一般分为水平拆分和垂直拆分两种方法: 01 垂直拆分 一般情况下,在进行拆分表的时候,优先考虑垂直拆分,垂直拆分理解起来就像业务层面的拆分一样: 1、在数据库层面...在这种情况下,如果数据量过大,对数据库的备份的时候,往往会占用很多的磁盘IO资源和网络IO资源,其次,过大数据量的表在进行DDL操作的时候,可能会导致锁全表,这个时间很长,业务一般不能接受。...3、安全性和可用性的考虑 分库分表的时候,如果其中一台机器出了故障,那么我们可以保证至少不影响全局,如果将所有的库表都保存在一台服务器上,因为某些不可抗拒的因素导致了服务器崩溃,这是很可怕的。...例如有两个业务a和b,a的访问量比较高,对服务器的压力很大,那么很有可能造成服务器崩溃的时候殃及b业务,那么在这种情况下,还是建议分库分表,确保业务之间不会互相干扰。

    57930

    MySQL 大表优化方案

    单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑、部署、运维的各种复杂度,一般以整型值为主的表在 千万级以下,字符串为主的表在 五百万以下是没有太大问题的。...,考虑在 WHERE和 ORDER BY命令上涉及的列建立索引,可根据 EXPLAIN来查看是否用了索引还是全表扫描 应尽量避免在 WHERE子句中对字段进行 NULL值判断,否则将导致引擎放弃使用索引而进行全表扫描...支持事务 支持外键 支持崩溃后的安全恢复 不支持全文索引 总体来讲,MyISAM适合 SELECT密集型的表,而InnoDB适合 INSERT和 UPDATE密集型的表 系统调优参数 可以使用下面几个工具来做基准测试...同时目前很多拆分的解决方案同时也兼顾考虑了读写分离 缓存 缓存可以发生在这些层次: MySQL内部:在系统调优参数介绍了相关设置 数据访问层:比如MyBatis针对SQL语句做缓存,而Hibernate...垂直分表是对数据表进行垂直拆分的一种方式,常见的是把一个多字段的大表按常用字段和非常用字段进行拆分,每个表里面的数据记录数一般情况下是相同的,只是字段不一样,使用主键关联 比如原始的用户表是: 垂直拆分后是

    1.7K40
    领券