LSPosed / LSPlant

A hook framework for Android Runtime (ART)
https://lsposed.org/LSPlant/
GNU Lesser General Public License v3.0
861 stars 210 forks source link

Might there be Java/Kotlin API (core or module) support in the future? #1

Closed chachako closed 2 years ago

chachako commented 2 years ago

很棒的项目!(也许这个应该放到讨论中,但这个仓库没开🤐) 我有一个项目,内部使用 d8 来实现 java method hook,但最近有一些系统 runtime 方面的 hook 需求 d8 无法实现,因此发现了这个项目给我很大的惊喜,但目前似乎没有提供 java/kotlin 的 api? 请问有提供的打算吗?如果没有的话是否愿意接受 kotlin api 的贡献?(因为我发现几乎全部 lsp 项目都是用 java 编写的,kotlin 可能不受宠 😰)

我的项目内部使用着一套自己设计的不算太完善的 hook api,它是由 Kotlin 编译器和 IDE 实现的基于声明式和强类型理念的 api...大概 因此如果可以我很乐意补充这个项目缺少的易用 api . 如果有讨论区或者你们对此感兴趣,我可以提交一些设计细节,我可以随时开始 pr(我承认我是lsp的粉丝!😇

它目前大概长这样

class MainActivity : Suannai<Activity>(primaryHook = "com.example.main.MainActivity".type) {
  // 反射名为 viewBinding 的字段
  val Activity.viewBinding: ViewBinding = field()

  fun init() = hookConstructor(
    head = {
      require(arguments.isEmpty())
      ...
    },
    tail = {
      require(returns == Void)
      ...
    }
  )

  // Hook: 'public boolean isShowBottomNavigation(boolean show)'
  fun changeBottomNavigationState(isShow: Boolean) = hook(
    name = "isShowBottomNavigation",
    body = {
      // 替换传参
      isShow = false
      val activity: Activity = thiz
      activity.viewBinding.apply {
        if (activity.isFaild) { 
          activity.recreate()
          callOriginal(isShow)
        }
        bottomNavigationView.alpha = 0f
        return(false)
      }
    }
  )

  class ViewBinding : InstanceMock(actual = "com.example.databinding.ActivityMainBinding".type) {
    val bottomNavigationView = field<View>(type = "com.example.views.ThemeBottomNavigationView")
  }
}
yujincheng08 commented 2 years ago

因为需要用户提供 native hook 和 elf parser 所以无法提供纯 java/kt 接口,也因而直接放弃了提供 java/kt 接口了。不过我们的接口除了 Init 以外都能非常轻松就能封装到 Java/kt 上,所以其实没什么由库封装的必要?

chachako commented 2 years ago

原来是这样,实际上我对art hook的原理并不熟悉,刚开始看test时我还以为jni里面都是可以copy重用的样板代码

不过我们的接口除了 Init 以外都能非常轻松就能封装到 Java/kt 上,所以其实没什么由库封装的必要?

这么一说也有道理🥳,也许我应该将其作为一个额外的utils库而不是集成到core中