eleme / lancet

A lightweight and fast AOP framework for Android App and SDK developers
2.13k stars 335 forks source link

Lancet如何织入@hide的类 #61

Open ZouYongpeng opened 2 years ago

ZouYongpeng commented 2 years ago

如android原生View存在以下方法:

/** {@hide} */
@CallSuper
protected void encodeProperties(@NonNull ViewHierarchyEncoder stream) {
    // ......
}

其传入参数 ViewHierarchyEncoder 也存在@hide注解

而我写了以下方法均不生效

@Insert(value = "encodeProperties")
@TargetClass(value = "android.view.View")
protected void _encodeProperties(ViewHierarchyEncoder stream) {
    Log.d(TAG, "_encodeProperties_1: android.view.View.encodeProperties(ViewHierarchyEncoder stream)");
    Origin.callVoid();
}

   @Insert(value = "encodeProperties")
//    @Proxy("encodeProperties")
  @TargetClass(value = "android.view.View", scope = Scope.ALL)
  protected void _encodeProperties(@ClassOf("android.view.ViewHierarchyEncoder") Object stream) {
      Log.d(TAG, "_encodeProperties_2: android.view.View.encodeProperties(ViewHierarchyEncoder stream)");
      Origin.callVoid();
  }

我的理解是@hide会使得类或者方法不参与编译,这种情况是不是就不能使用lancet进行代码织入了呢?

Knight-ZXW commented 2 years ago

跟是否hide无关, 因为Insert的方式 是直接修改目标类, 因此 对于 jdk 和android sdk的代码,因为它们并不参与apk的构建,并不会并打包到你的APK中,所以你的修改是无效的