Meituan-Dianping / Robust

Robust is an Android HotFix solution with high compatibility and high stability. Robust can fix bugs immediately without a reboot.
Apache License 2.0
4.4k stars 806 forks source link

Robust Lambda表达式的支持 #357

Closed RyanHuen closed 4 years ago

RyanHuen commented 4 years ago

异常类型:编译异常

Robust版本:0.4.90

Gradle版本:4.4

系统:如:Mac

情况如下: 由于我们的工程迁移使用lambda并没有使用me.tatarka.retrolambda这个插件 因此导致在auto-patch的时候,无法识别lambda表达式的修改,导致无法针对lambda函数进行热更新

跟踪问题过程: https://github.com/Meituan-Dianping/Robust/issues/252

我前面有看上述的issue,对方也存在相同的问题,我猜测对方可能也是因为没有使用me.tatarka.retrolambda插件

因为我使用过官方Demo,把你们的Demo中的me.tatarka.retrolambda插件去掉以后,auto-patch的过程中也不能识别lambda表达式的修改

因此我在想,是否有办法避免这个问题?

//@warn 这部分代码请重点review一下,判断条件写错会要命 //这部分代码请重点review一下,判断条件写错会要命 // synthetic 方法暂时不aop 比如AsyncTask 会生成一些同名 synthetic方法,对synthetic 以及private的方法也插入的代码,主要是针对lambda表达式 if (((access & Opcodes.ACC_SYNTHETIC) != 0) && ((access & Opcodes.ACC_PRIVATE) == 0)) { return false; }

在你们的源码中,我有看到针对私有的lambda表达式函数进行判断,但是在Java8上的lambda表达式,似乎已经不再是ACC_PRIVATE形式了,所以我猜测这可能是去掉me.tatarka.retrolambda插件后,无法识别lambda表达式的原因之一。

我有尝试过去除上面图片中的校验,发现auto-patch确实可以将lambda的修改识别,但是却不能正常生成patch,所以希望能有大神帮忙指点下迷津,谢谢

我最后在官方Demo的修改碰到的问题如下:

`> Task :app:transformClassesWithAutoPatchTransformForRelease FAILED ================autoPatch start================ autopatch read all class file cost 0.014 second check all class cost 0.074 second, class count: 2866 new add methods list is key is com.meituan.sample.SecondActivity.getArray()

new add classes list is

patchMethodSignatureSet is printed below key is com.meituan.sample.SecondActivity.lambda$onCreate$0$SecondActivity(android.view.View)

Warning: getObscuredMemberName class name java.util.WeakHashMap member name is void () robust can not find in mapping!!! Warning: getObscuredMemberName class name com.meituan.robust.patch.SecondActivityPatchControl member name is keyToValueRelation robust can not find in mapping!!! Warning: getObscuredMemberName class name java.lang.Object member name is void () robust can not find in mapping!!! Warning: getObscuredMemberName class name java.lang.Byte member name is byte byteValue() robust can not find in mapping!!! Warning: getObscuredMemberName class name java.lang.Boolean member name is void (boolean) robust can not find in mapping!!! Warning: getObscuredMemberName class name java.lang.String member name is java.lang.String split(java.lang.String) robust can not find in mapping!!! Warning: getObscuredMemberName class name java.lang.String member name is boolean equals(java.lang.Object) robust can not find in mapping!!! Warning: getObscuredMemberName class name com.meituan.robust.patch.SecondActivityPatchControl member name is keyToValueRelation robust can not find in mapping!!! Warning: getObscuredMemberName class name java.util.Map member name is java.lang.Object get(java.lang.Object) robust can not find in mapping!!! Warning: getObscuredMemberName class name com.meituan.robust.patch.SecondActivityPatch member name is void (java.lang.Object) robust can not find in mapping!!! Warning: getObscuredMemberName class name com.meituan.robust.patch.SecondActivityPatchControl member name is keyToValueRelation robust can not find in mapping!!! Warning: getObscuredMemberName class name java.util.Map member name is java.lang.Object put(java.lang.Object,java.lang.Object) robust can not find in mapping!!! Warning: getObscuredMemberName class name java.lang.String member name is java.lang.String split(java.lang.String) robust can not find in mapping!!! Warning: getObscuredMemberName class name java.lang.String member name is boolean equals(java.lang.Object) robust can not find in mapping!!! Warning: getObscuredMemberName class name com.meituan.robust.patch.SecondActivityPatch member name is void lambda$onCreate$0$SecondActivity(android.view.View) robust can not find in mapping!!! Warning: getObscuredMemberName class name com.meituan.robust.patch.SecondActivityPatchControl member name is keyToValueRelation robust can not find in mapping!!! Warning: getObscuredMemberName class name java.util.Map member name is java.lang.Object get(java.lang.Object) robust can not find in mapping!!! Warning: getObscuredMemberName class name com.meituan.robust.patch.SecondActivityPatch member name is void (java.lang.Object) robust can not find in mapping!!! Warning: getObscuredMemberName class name java.lang.Throwable member name is void printStackTrace() robust can not find in mapping!!! Warning: getObscuredMemberName class name com.meituan.robust.patch.SecondActivityPatch member name is void (java.lang.Object) robust can not find in mapping!!! Warning: getObscuredMemberName class name java.lang.String member name is java.lang.String split(java.lang.String) robust can not find in mapping!!! Warning: getObscuredMemberName class name java.lang.StringBuffer member name is void () robust can not find in mapping!!! Warning: getObscuredMemberName class name java.lang.StringBuffer member name is java.lang.StringBuffer append(java.lang.String) robust can not find in mapping!!! Warning: getObscuredMemberName class name java.lang.StringBuffer member name is java.lang.StringBuffer append(java.lang.String) robust can not find in mapping!!! Warning: getObscuredMemberName class name java.lang.StringBuffer member name is java.lang.StringBuffer append(java.lang.String) robust can not find in mapping!!! Warning: getObscuredMemberName class name java.lang.StringBuffer member name is java.lang.String toString() robust can not find in mapping!!! Warning: getObscuredMemberName class name java.lang.String member name is boolean contains(java.lang.CharSequence) robust can not find in mapping!!! Warning: getObscuredMemberName class name java.lang.Object member name is void () robust can not find in mapping!!! Warning: getObscuredMemberName class name java.util.ArrayList member name is void () robust can not find in mapping!!! Warning: getObscuredMemberName class name java.util.List member name is boolean add(java.lang.Object) robust can not find in mapping!!! Warning: getObscuredMemberName class name java.lang.Object member name is void () robust can not find in mapping!!! Warning: getObscuredMemberName class name com.meituan.robust.patch.SecondActivityPatch member name is originClass robust can not find in mapping!!! Warning: getObscuredMemberName class name com.meituan.robust.patch.SecondActivityPatch member name is java.lang.Object getRealParameter(java.lang.Object[]) robust can not find in mapping!!! Warning: getObscuredMemberName class name com.meituan.robust.patch.SecondActivityPatch member name is originClass robust can not find in mapping!!!

FAILURE: Build failed with an exception.

jjlan commented 4 years ago

直接把它源码中关于synthetic方法去掉算了,java8中很多lambda表达式都是包级权限的,对synthetic方法也插桩的话,就能正常修复,就是包体积会大一点

RyanHuen commented 4 years ago

方法

直接砍掉synthetic的话,会导致auto patch脚本跑的时候 出现问题,还在研究是为什么

jjlan commented 4 years ago

直接砍掉synthetic有什么问题,我这边倒是没发现什么问题

CNCoderX commented 3 years ago

你好,我现在遇到同样的问题,修改包含lambda表达式的方法无法生成补丁。请问你解决了吗?