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

Android热更新方案Robust开源,新增自动化补丁工具

举些例子来说,ProGuard会把类中的get、set方法作用的字段直接访问性修改为public,然后删除get和set方法;删除无用的方法;以及最令人头疼的内联问题等等。...补丁的生成过程步骤繁杂,与此同时,自动化补丁处理代码风格迥异,需要对Java的各种语法提供支持,无论是泛型、内部类还是Lambda表达式,同时还需要提供对ProGuard的混淆、优化、内联支持,这些极大的增加自动化补丁的难度...Java编译器的优化 Java编译器的优化工作包括Java编译器会自动生成一些桥方法以及移动代码的位置等,比较典型的就是泛型方法、内部类和Lambda表达式。...Lambda表达式也与此类似,编译器把Lambda表达式的内容,移到了一个新的方法(Java编译器为我们生成的access开头的方法)里面去,而且我们还无法给Lambda表达式加上注解。...为了解决上述的问题,自动化提供了一个静态方法(Robust.modify()),支持在泛型或者Lambda表达式里面调用这个静态方法,自动化扫描所有的方法调用,检测到这个静态方法的调用就就可以找到找到需要制作补丁的方法

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

Python 函数:定义、调用、参数、递归和 Lambda 函数详解

创建函数在Python中,使用def关键字定义函数:示例def my_function(): print("Hello from a function")调用函数要调用函数,请使用函数名称后跟括号:示例...参数是在调用函数时发送到函数的值。参数数量默认情况下,必须使用正确数量的参数来调用函数。这意味着,如果函数需要2个参数,您必须使用2个参数来调用函数,不能多,也不能少。...函数Lambda函数是一种小型的匿名函数。...Lambda函数可以接受任意数量的参数,但只能有一个表达式。语法lambda 参数 : 表达式该表达式将被执行,并返回结果。...示例# 将10添加到参数a,并返回结果:x = lambda a : a + 10print(x(5))Lambda函数可以接受任意数量的参数:示例# 将参数a与参数b相乘并返回结果:x = lambda

22820

APK体积优化有感

5.遍历完整个字节码之后进行统一删除 删除无用代码 一.使用proguard 的 -assumenosideeffects配置消除无副作用的函数调用 当方法不会修改堆上某个对象或者栈上方法参数的值时,...二.手动分析起始指令和终止指令删除 终止指令:就是方法调用指令 1.找到要删除的目标方法调用指令, 2.再根据方法的返回值类型确定是否要包含其后的 pop 或 pop2 指令 3.如果方法有返回值后面是...) 4.直到操作数栈变为0,代表该方法回到最开始还没有执行指令的地方,删除这个地方到终止指令地方的指令 消除成功 优点: 无用方法的调用在这种情况下不仅仅会删除方法调用指令,连其涉及到的指令都会一并删除...删除set方法,找到调用set指令的地方修改为set指令字节码 Proguard 缺点: 对内联层级过高以及像 builder 方法这种情况支持的不好 无法配置哪些方法内联 语言层面:Java无法配置内联方法...kotlin提出inline可能最主要的问题是基于Lambda无法实现像Java那样运行时替换的方法,只能创建匿名类实现,嵌套过多的Lambda又会导致性能降低创建过多无用实例对象,可能是被迫提出的inline

61130

EasyCVR调用批量删除接口出现错误排查及解决

同时EasyCVR开放了很多接口供大家调用,比如批量添加通道或者批量删除通道,都可以借助接口更便捷地完成操作。...image.png 我们在调用EasyCVR中批量删除接口时,发现返回了错误信息“删除中出现错误”,返回内容如下: image.png 针对该问题我们进行了排查,排查发现设备中已经没有ID为168、167...的通道了,调用批量删除后实际通道已经删除。...image.png 测试发现,删除不再存在的通道也是一样的报错信息,但无论删除成功或者失败都无法知道是否操作成功,对运维人员来说这种反馈不够清晰明了,因此我们需要进行修改。...找到软件下的批量删除接口添加如下代码,当如果删除有失败的通道,返回失败的ID,告知用户那些通道删除失败。如果是成功就直接返回成功。

52320

AndroidJava 混淆中使用-assumenosideeffects删除日志代码遇到的问题

com.excelsecu.driver.util.LogUtil {    public *;} 我使用了assumenosideeffects,并尝试将所有com.excelsecu.driver.util.LogUtil的调用删除...(简单来说就是删掉也不会影响程序运行),然后proguard会帮你删掉这些方法的调用。...官方例子:http://proguard.sourceforge.net/manual/examples.html#logging 需要注意的是:他只会删除这个方法的调用,但是你如何构建你的日志内容(表现形式为...(因为这个调用没有返回值,proguard认为是没有边界效应的) 综合来说,我觉得依然是个bug,因为无论如何它不应该把LogUtil之外的方法也删掉。...那么问题来了,为什么不是LogUtil.wait()这样的调用才会被删除,而是EsLock.wait()的方法也会被删除

4.1K10

Kotlin 1.4-M1 现已发布!

如果您调用了将两个 SAM 接口作为参数的 Java 方法,两个参数需要都为 lambda 或常规对象。不可以将一个参数作为 lambda 而另一个参数作为对象来传递。...lambda 中最后一个表达式的智能转换 在 Kotlin 1.3 中,lambda 中的最后一个表达式不是智能转换,除非您指定预期的类型。...更出色的可调用引用推理 现在,可以更方便地使用包含默认参数值的函数的可调用引用。...Kotlin 反射的 Proguard 配置 从 1.4-M1 开始,我们为 kotlin-reflect.jar 中的 Kotlin 反射嵌入了 Proguard/R8 配置。...当前,不支持在多个生成的工件之间删除重复或拆分代码。您可以期待 produceExecutable() 的此行为在后续里程碑中发生变化。此选项的命名还与未来的变更有关。

3.4K20

「万物生长」一个APK从诞生到活跃在Android手机上

调用AAPT2进行编译时,每次调用都应传递一个资源文件作为输入。然后,AAPT2 会解析该文件并生成一个扩展名为.flat的中间二进制文件。...ProGuard会根据Configuration Roots开始标记, 同时根据Roots为入口开始发散。标记完成以后, 删除未被标记的类或成员。最终得到的是精简的ClassPool。...Q2:删除的是那些代码? A2: 其实删除的内容就是在全局范围内并没有调用点并且没有用keep去保留的方法或者类。...具体内容详见于 ProGuard 初探[5] D8 是Dex的替代产品 这一解析器的引入非常重要的目的是为了适应Java 8上新概念Lambda。...所以Android做的事情就是间接支持,将Lambda变化为可以解析的语法然后执行。

92420

安卓应用安全指南 4.8 输出到 LogCat

如果应用用于发布,这两种方法将被自动删除。在此示例代码中,ProGuard 用于自动删除调用Log.d()/v()的代码块。...ProGuard 会自动删除不需要的代码,如未使用的方法。...通过指定Log.d()/ v()作为-assumenosideeffects选项的参数,Log.d(),Log.v()`的调用被视为不必要的代码,并且这些代码将被删除。...4.8.3.4 从汇编中移除敏感信息 如果为了删除Log.d()方法而使用 ProGuard 构建以下代码,有必要记住,ProGuard会保留为日志信息构造字符串的语句(代码的第一行),即使它删除了 Log.d...实际上,没有Log.d()调用过程,但你可以看到字符串一致性定义,例如Sensitive information1,和String#format()方法的调用过程,不会被删除并仍然存在。

39110

Eclipse与Android源码中ProGuard工具的使用

具体来说,使用ProGuard工具,可以达到下面两个目的: 删除了源文件中没有调用的那部分代码,最大化的精简了字节码文件,使得最终生成的apk文件更小。...( Lists the classes and members that are not obfuscated ) usage.txt : 列出congapk中删除的代码。...里面的类名、方法和变量等,都变成了简单的a、b、c、d等毫无含义的字母,这样就达到了混淆的目的: 但在实际使用过程中,我们会发现当前apk中的有些方法和类,是要供外部使用的,而此时混淆了名称,外部调用就会报错了...android中默认是将代码混淆ProGuard关闭的,在alps/build/core/proguard.flags中有下面一句,意指将默认不混淆,不需要代码删除,我们将这一句注释起来,就起到代码混淆编译的作用...中的有些方法和类,是要供外部使用的,而此时混淆了名称,外部调用就会报错了,那么怎么解决这个问题?

1.3K90

通过Gradle为APK瘦身

ProGuard ProGuard 是一个Java 工具,其不仅可以缩减APK 文件大小,还可以在编译期优化、混淆和预校验你的代码。其通过你应用的所有代码路径,来找到未被使用的代码,并将其删除。...task 会被执行,并调用ProGuard。...为了解决这个问题,你可以定义ProGuard 规则,排除那些被删除或混淆的类。我们可以使用proguardFiles 属性来定义包含ProGuard 规则的文件。...缩减资源 当给App 打包时,Gradle 和Gradle 的Android 插件可以在构建期间删除所有未使用的资源。如果你有旧的资源忘记删除,那么这个功能可能非常有用。...使用此功能有一个要求,即必须同时启动ProGuard。这是因为缩减资源的工作方式是,直到代码引用这些资源被删除之前,Android 构建工具不能指出哪些资源没有被用到。

71120

android 混淆规则作用,Android代码混淆详解

不仅仅是代码,没有被调用的资源同样也会被移除掉,因此minifyEnabled除了混淆代码之外,还可以起到压缩APK包的作用。...开启混淆后也可添加shrinkResources,表示开启删除无用资源。 (2)shrinkResources shrinkResources为true用来开启删除无用资源。...(3)避免被误删除 若配置minifyEnable true && shrinkResources true,防止避免误删除的文件,可以配置如下: 在res/raw/keep.xml(避免被误删除)写了配置的...(4)proguard-android.txt和proguard-rules.pro proguard-android.txt:代表系统默认的混淆规则配置文件,该文件在/tools/proguard下,...(5)proguard文件夹 代码混淆生成apk之后,项目下面会多出来一个proguard文件夹,proguard文件夹中四个文件的作用。

1.6K30

android开发笔记之 Android代码混淆打包

二, 我们代码依赖于系统的接口,比如被系统代码调用的回调方法,这种情况最复杂。 三, 是我们的java 元素名称是在配置文件中配置好的。...Android系统组件,系统组件有固定的方法被系统调用。 被Android Resource 文件引用到的。名字已经固定,也不能混淆,比如自定义的View 。...:proguard-project.txt”这行前的“#”删除即可; 2.修改混淆配置文件:找到项目根目录下的proguard-project.txt文件,修 改其中代码,这部分是最关键; 3.保存相关文件供以后出错时使用...”这行前的“#”删除,最后导出即可 实现对代码的混淆,即使我们没有去编写proguard-project.txt中的内容。...} 2.打包反编译之后: 分析上面的代码我们会发现,自定义的方法名都被替换成无特殊意义的短 字母,而activity的onCreate()方法却没变;最后一个testError()方法由于 我们没有调用也被剔除掉了

72120
领券