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

Redex 初探与 Interdex:Andorid 冷启动优化

D.SynthPass 翻译不能,官方例子,内部类B访问外部类A的private static变量,compile后其实是通过生成额外的acces方法来帮助内部类访问外部类私有成员。...这样会导致的问题是: redex在做优化时可能会把手Q部分方法移除,如果插件刚好引用了这个方法,就出现NoSuchMethodError了。...Release构建中会做混淆,很多类名都会变化,而我们优化时用的类加载序列是原始类名,所以在release构建时不能正确的调整顺序。...这会导致Interdex优化失效,而系统做pre-verify是为了提升性能,再结合Interdex的实现,综合来看interdex真正的优化原理就比较明显了: 将启动时加载的类放到主dex,提升了这些类的聚...去掉启动类排序逻辑后再次验证,确实仍有明显优化效果) 而插桩会导致所有类必然不能打上pre-verify,所以不管怎么调整类分布,都没用。

3.3K61

Android热修复技术总结

这也是Android性能优化建议Handler使用静态内部类,防止外部类Activity不能被回收导致造成OOM。...在Android虚拟机下解释dex文件中的lamda表达式:则是在优化成dex文件的时候就生成了这个具体类。 热部署解决方案 新增lamada表达式会导致部类新增一个辅助方法。...加载补丁dex得到dexFile对象作为参数构建一个Element对象插入到dexElement数组最前面。 Tinker提供差量包,整体替换dex的方案。...将patch.dex与应用的class.dex合并生成一个完整的dex,加载完整的dex得到dexFile对象为参数构建一个Element对象替换dexElements数组。...资源修复 在Android热修复的过程中,不仅需要对错误的代码进行修复,还需要对资源文件进行修复。目前市面上的资源热修复方案基本上都是参考Instant Run的实现。

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

Android热修复技术总结

这也是Android性能优化建议Handler使用静态内部类,防止外部类Activity不能被回收导致造成OOM。...在Android虚拟机下解释dex文件中的lamda表达式:则是在优化成dex文件的时候就生成了这个具体类。 热部署解决方案 新增lamada表达式会导致部类新增一个辅助方法。...加载补丁dex得到dexFile对象作为参数构建一个Element对象插入到dexElement数组最前面。 Tinker提供差量包,整体替换dex的方案。...将patch.dex与应用的class.dex合并生成一个完整的dex,加载完整的dex得到dexFile对象为参数构建一个Element对象替换dexElements数组。...资源修复 在Android热修复的过程中,不仅需要对错误的代码进行修复,还需要对资源文件进行修复。目前市面上的资源热修复方案基本上都是参考Instant Run的实现。

1.5K70

全面了解Android热修复技术

代码热修复 代码热修复是最常见,也是热修复中最重要的部分,因为程序错误往往都是代码逻辑的错误。最初的热修复方案也仅支持代码热修复。...代码热修复分两个流派,即腾讯系的类加载方案和阿里系的底层替换方案,前者需要重启应用但却能修复大部分错误,后者及时生效却只能作方法的修改。下面详细介绍。...● 在Dalvik虚拟机,APP在安装的时候会被执行dexopt操作,同一个dex文件的Class会被打上CLASS_ISPREVERIFIED标志,而补丁包中的类并没有打上此标志,因此抛出异常。...不安全的代码 加载了补丁包的程序本质还是未编译的程序,只是两个已编译程序的结合体,由于Java的编译过程对于我们是透明,所以我们一不小心就会引入错误,而且这种错误十分隐蔽。...比如,Java在编译匿名内部类时会编译成顶级类,命名方式为ClassName$n,其中n为匿名内部类出现的顺序,所以在第i个匿名内部类前面添加匿名内部类就会导致ClassName$i#methodName

68920

全面了解 Android 热修复技术

代码热修复 代码热修复是最常见,也是热修复中最重要的部分,因为程序错误往往都是代码逻辑的错误。最初的热修复方案也仅支持代码热修复。...代码热修复分两个流派,即腾讯系的类加载方案和阿里系的底层替换方案,前者需要重启应用但却能修复大部分错误,后者及时生效却只能作方法的修改。下面详细介绍。...● 在Dalvik虚拟机,APP在安装的时候会被执行dexopt操作,同一个dex文件的Class会被打上CLASS_ISPREVERIFIED标志,而补丁包中的类并没有打上此标志,因此抛出异常。...,而且这种错误十分隐蔽。...比如,Java在编译匿名内部类时会编译成顶级类,命名方式为ClassName$n,其中n为匿名内部类出现的顺序,所以在第i个匿名内部类前面添加匿名内部类就会导致ClassName$i#methodName

1.1K30

打通Android Gradle编译过程的任督二脉

主要工作流程 Gradle构建过程包括三个阶段: 初始化阶段 读取根工程中的setting.gradle中的include信息,确定有多少工程加入构建并创建project实例,每个工程中的build.gradle...(2) TaskManager负责管理task的创建和执行 (3) AndroidBuilder负责具体执行Android构建的一些命令,如编译aidl,aapt,class转dex等。...->processFileBytes->processClass等函数,如果我们的maindex_list.txt过大导致dex放不下,在processClass函数里面就会调用createDexFile...函数生成新dex,然而在processAllfiles函数的最后阶段如果发现主dex放不下就会抛出异常,导致编译失败(不同dx版本略有不同,这里参考的是build-tools 19.1.0版本)。...我们知道在初始化载入主dex当中一些类的时候,会去加载所有的静态内部类和匿名内部类以及校验所有的方法,如果对应的类所在的dex还未加载进来,就会进行指令替换从而在真正运行到该类代码的时候发生NoClassDefError

6K112

Art of Android Development Reading Notes 13

的bug,可能导致使用multidex的应用无法在Android 4.0以前的手机上运行。...为了更好地对多插件进行支持,需要合理地去管理各个插件的DexClassLoader,这样同一个插件就可以采用同一个ClassLoader去加载类,从而避免了多个ClassLoader加载同一个类时所引起的类型转换错误...如果5s没有响应屏幕触摸事件或者键盘输入事件就会ANR,而BroadcastReceiver如果10s没有执行完操作也会出现ANR。...来修饰; 3.使用一些Android特有的数据结构,比如SparseArray和Pair等,他们都具有更好的性能; 4.适当使用软引用和弱引用; 5.采用内存缓存和磁盘缓存; 6.尽量采用静态内部类...,这样可以避免潜在的由于内部类导致的内存泄露。

52220

APK体积优化有感

具有引用关系的class优先存放在同一个dex文件中 方法内联 access方法内联 access方法是JVM为了保证让内部类可以访问外部类的私有成员所生成的。...有两种方式:可以构建map保存classname-get/setfiled和对应code结构体;也可以不保存直接替换。...相比来说第二种更好,但是扩展性更低如果set方法还进行了其他操作不仅是简单的set那么久会有风险 第一种 扩展性更好,但是相对于复杂 第二种简单,但其作用范围仅适用于单纯的set,get。...kotlin提出inline可能最主要的问题是基于Lambda无法实现像Java那样运行时替换的方法,只能创建匿名类实现,嵌套过多的Lambda又会导致性能降低创建过多无用实例对象,可能是被迫提出的inline...多个 DEX导致 DEX 中的复用数据变少,从而进一步提升了包体积的膨胀。因此我们对于 R 的优化,在 DEX 层面上也会有很大的收益。 处理 R文件Field消除

60630

Android开发导入项目报错Ignoring InnerClasses attribute for an anonymous inner class的解决办法

在安卓开发导入项目过程中,出现错误再所难免。最近导入项目就遇到如下错误,具体如下图所示。 ? 出现如上错误,最初设想先看下项目能不能运行。...在proguard-rules.pro文件中添加如下代码(解释:忽略内部类的一些属性)。 -keepattributes EnclosingMethod 再次重新构建项目,运行发现然并卵。...再次查找相关资料,资料显示每个项目的Dex都有方法数的限制(上限65536,超过上限号称应用爆棚),由此猜想会不会是Dex的方法数超过上限呢?...由此项目可以在Windows上无错误运行,再次将项目导入Mac上,完美运行。...下面做下简单的小结: (1) 第一考虑是不是可以直接忽略第三方的属性的错误警告,由此层层递进发现问题。

73210

Android微信客户端是如何支持R8构建的?

一些keep规则导致包大小无法达到最优; 随着AGP的升级,将默认采用Google的R8来构建以获取更优的Apk性能; ---- R8的优势 相对于Proguard,R8的优势在于: 能力支持:R8对Kotlin...; AutoDex确保将前后构建的dalvik字节码分布在相同的dex序列中,为了生成尽可能小的tinker patch; 2....field/*规则,但R8并不理解这一行为,导致图中的NAME的access被优化成了public(如下图),导致业务通过getField反射获取字段出现错误的返回,解决的办法可以通过-allowaccessmodification...Out-Of-Line 优化导致无法Tinker Patch」 「分析:」如果多个类如果存在相同实现的方法,那么out-of-line优化目的就是复用同一个方法,由于微信启动时存在一些loader类再dex...文件中的 type_ids、field_ids、method_ids 等索引数量不允许超过 65535 个,任何一个达到上限的时候,就会触发分 dex 条件把 class 分到下一个 dex 中,并且每次构建不能保证在代码发生变化之后

1.8K160

Android Study 之学(kao)习(bei)官方关于64k异常处理 ^_^

前言 随着APP的一次又一次迭代,APP的体积也越来越大,这时候,会引发这么一个问题,早期的错误异常如下: ? 较新版本的 Android 构建系统虽然显示的错误不同,但指示的是同一问题: ?...这些错误状况都会显示下面这个数字:65536。这个数字很重要,因为它代表的是单个 Dalvik Executable (DEX) 字节码文件的代码可调用的引用总数。...Dalvik Executable 规范将可在单个 DEX 文件可引用的方法总数限制在 65,536,其中包括 Android 框架方法、库方法以及代码中的方法。...DEX 文件的过程相当复杂,如果辅助 DEX 文件较大,可能会导致应用无响应 (ANR) 错误。...还可以构建其他变体,包括 prodDebug 变体构建,该变体虽然构建时间更长,但可用于开发以外的测试。在所示配置,prodRelease 变体将是最终测试和发布版本。

79610

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

误区三:Lambda 比内部类慢 Lambda(尤其是在引入 Stream API 的情况下)是一种非常方便的语法,可实现非常简洁的代码。...在 debug 模式下进行性能分析的结果是可能会误导优化方向,导致浪费时间来优化不需要优化的内容。...dex 文件,并帮助我们避免常见的错误,最大程度地减少依赖关系,如创建的 dex 文件数量不会超过指定的数量,并且不会将所有启动类都放置在主文件中。...有几种类型的代码可能无法剖析: 错误处理代码,希望它不会执行太多。 兼容性代码,并非在所有设备上都执行的代码,尤其是 Android 5 以上版本的设备。 不常用功能的代码。...设计模式、数据结构、算法) 2、程序性能优化(启动速度与执行效率优化、布局检测与优化、内存优化、耗电优化、网络传输与数据存储优化、APK 大小优化) 3、开发效率优化(分布式版本控制系统 Git、自动化构建系统

76922

Android性能优化(十)之App瘦身攻略

移除无用代码以及无用功能,有助于减少代码量,直接体现就是Dex的体积会变小。 备注:根据经验,不用的代码在项目中存在属于一个普遍现象,相当于僵尸代码,而且这类代码过多也会导致Dex文件过大。...而缩减方法数,除了上面写到的普遍方法:移除无用方法、库、使用较小的SDK之外还有: 避免在内部类中访问外部类的私有方法、变量。...挡在Java内部类(包含匿名内部类)中访问外部类的私有方法、变量的时候,编译器会生成额外的方法,会增加方法数; 避免调用派生类中的未被覆写的方法,避免在派生类中调用未覆写的基类的方法;避免用派生类的对象调用派生类中未覆盖的基类的方法...有使用错误的地方欢迎指正! 4.2 Drawable目录只保留一份资源 这条开发者中讨论的比较多,确实Google强烈建议根据不同屏幕密度准备多套切图资源来做适配的。...备注:需要注意的是在Android构建流程中AAPT会使用内置的压缩算法来优化res/drawable/目录下的PNG图片,但也可能会导致本来已经优化过的图片体积变大,可以通过在build.gradle

1.6K30

Kotlin开发指南

示例(使用高阶函数实现回调): CatchF38A(07-28-14-43-13).jpg 用高阶函数实现的代码和之前的代码有两个不同: 一是没有了接口定义 二是没有了匿名内部类 这样的好处是显而易见的...,因为少了匿名内部类的使用,在程序运行过程中是提高了性能的 2、协程(Kotlin coroutines) 它能干什么?     ...六、编译效率        Java在clean构建比Kotlin稍快,但这些情况很少。 对于大多数开发人员来说,更常见的情况是部分构建,其中增量编译进行了大量改进。...在工程已经使用multidex对dex进行分片处理的情况下,仍出现了这个错误,实在令人费解。...怀疑在引进kotlin后,因为这个库导致没有对kotlin编译的dex没作分片导致Kotlin的方法ID超出了[0, 0xffff]的范畴。

2.1K40

Android面试大纲(集合)

导致Activity无法释放 解决: Handler内部持有外部Activity的弱引用 Handler改为静态内部类 Handler.removeCallback() 7 AsyncTask面试题...,导致Activity无法释放 解决: AsyncTask内部持有外部Activity的弱引用 AsyncTask改为静态内部类 AsyncTask.cancel() 5、AsyncTask生命周期...3、ListView的优化 重用convertView 使用ViewHolder 图片三级缓存 监听滑动事件 少用透明View 开启硬件加速 12 Android项目构建面试题 1、android构建流程...,那么就会出现卡顿现象 2、UI卡顿的原因分析 在UI线程中做轻微的耗时操作,导致UI线程卡顿 布局Layout过于复杂,无法在16ms完成渲染 同一时间动画执行的次数过多,导致CPU和GPU负载过重...频繁的触发GC操作导致线程暂停,会使得安卓系统在16ms无法完成绘制 冗余资源及逻辑等导致加载和执行缓慢 ANR 3、UI卡顿的优化 布局优化 使用include、ViewStub、merge

1.1K20

Android 开发艺术探索笔记三

解决方法: Google提供multidex方案专门解决这个问题,通过将一个dex文件拆分为多个dex避免单个dex文件方法数越界。...采用以上方法,如果越界,Gradle就会在apk中打包2个或多个dex文件。 产生的问题: 应用启动速度会降低。由于应用启动会加载额外的dex文件,导致启动速度降低。要避免生成较大的dex文件。...保持一致,导致activity对象无法及时释放 避免属性动画导致的内存泄漏。...常量请使用static final修饰 使用一些Android特有的数据结构,比如SparseArray和Pair等,它们具有更好的性能 适当使用软引用与弱引用 采用内存缓存和磁盘缓存 尽量采用静态内部类...,避免潜在的由于内部类导致的内存泄漏

53910

有赞 Android 编译优化方案 Savitar 2.0

在日常的开发中,平均在 15s 即可完成编译加载运行。 在开发维护方面,得益于动态下发的机制,Savitar 实现了问题快速修复,功能无感更新的能力,维护性更强,体验更好。...为了解决这个选择困扰,Savitar AS 插件实现了构建一键化支持:无需使用原有 AS 运行按钮,只点击 Savitar 运行按钮就行。...Savitar 会根据本地构建配置自动识别是否可以进行加速编译,如果不行,就自动执行现有 AS 运行配置(支持 Flavor 切换),达到无缝切换。...例如: // 原始函数 public void sayHello() // 修改后函数 public String sayHello() 返回值从 void变为 String并不会导致编译错误,但是在运行时会导致...如果能再次编译依赖方,加入到最终产物中就可以避免这样的错误。 解决这个问题有两个关键点:文件改动分析与改动文件的直接依赖方定位。

1.2K20
领券