gradle插件分享-手把手教你写gradle插件

2023-05-13  本文已影响0人  tinyvampirepudg

写在前面:

整体目标:hook应用内所有的手势,还原成操作手势事件,交由服务端进行轨迹还原等操作。

核心任务拆分

核心任务聚焦:拿到应用内所有手势事件的MotionEvent

关键节点:

事件分发-何处hook
字节码基础-如何修改
apk构建过程-何时修改
使用gradle-如何开发插件
MotionEvent处理:自行将原始的MotionEvent合并成为我们常用的事件序列。

事件分发-何处hook

hook点:activity的时机比较合适

最终做到的如下所示:


@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    TouchEventDispatcher.dispatchTouchEvent(MainActivity.this, ev);
    return super.dispatchTouchEvent(ev);
}

适配不同版本的Activity

v7_AppCompat_Activity: "android/support/v7/app/AppCompatActivity";
androidx_AppCompat_Activity: "androidx/appcompat/app/AppCompatActivity";

字节码基础-如何修改

111.png

apk构建过程-何时修改

使用gradle-如何开发插件

444.png

MotionEvent处理:自行将原始的MotionEvent合并成为我们常用的事件序列。

项目

项目地址

tinyvampirepudge/hook-touch-event

效果:

gradle插件优势:

555.png

插件兼容性

666.png

项目架构图

777.png

插件代码

目标:修改字节码,将所有经过Activity的MotionEvent都给我们的TouchEventDispatcher发送一份。

整体目录:

888.png

找到目标class

修改目标class

ff99c3fa-eca6-42da-85ab-8d86da4408da.png c2db6edc-e49f-467e-833a-6b6462bf818f.png 7821aadb-5279-42c8-ae11-37e36c0caf5a.png 54bf134c-9131-4338-8cff-c596ff86bfd5.png

事件处理的sdk:

TouchEventDispatcher:事件分发的入口。事件接收、校验

TouchEventCollector:采集原始的事件序列。

TouchEventClassification:事件序列归类。

TouchEventReporter:事件上报。具体如何上报到服务器,自行实现

如何查看日志:

开发或者构建过程中,在Run/Build下查看日志输出:

17f9d244-b391-4d20-ba92-c2f4fb2eb8e7.png 61360cc7-daaa-4c85-b44c-e8cb00e4a52e.png

项目运行起来后,在logcat中查看:

搜索TouchEventDispatcher、TouchEventCollector、TouchEventClassification、TouchEventReporter等关键字,即可查看对应的日志

b50227c4-5dda-49c6-abfa-09ea24c1e407.png

README:更多细节,请看README

https://github.com/tinyvampirepudge/hook-touch-event#readme

FAQ:

gradle版本从v4切换到v7后,修改了gradle版本和jdk版本之后,执行gradle命令发布仓库到本地,依旧报jdk version的错误。

392a88e5-1759-4dde-ae1e-af300ec49de8.png

./gradlew clean touch-event-gradle-plugin-v7:publishToLocalRepoPublicationToMavenRepository

从报错信息可以看出,在gradle命令行的环境下,jdk版本依旧不是期望的11。我们通过./gradlew -v来查看下:

(base) tinytongtong@tinytonongdembp hook-touch-event % ./gradlew -v  

------------------------------------------------------------
Gradle 7.3.3
------------------------------------------------------------

Build time:   2021-12-22 12:37:54 UTC
Revision:     6f556c80f945dc54b50e0be633da6c62dbe8dc71

Kotlin:       1.5.31
Groovy:       3.0.9
Ant:          Apache Ant(TM) version 1.10.11 compiled on July 10 2021
JVM:          1.8.0_261 (Oracle Corporation 25.261-b12)
OS:           Mac OS X 10.16 x86_64

A:

2ec1fadb-8363-401b-aa8f-48c19cc450ed.png

Q: Could not find tools.jar. Please check that /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home contains a valid JDK installation.

c86d4ba9-1750-4b16-aef4-8e13d6e1fb0b.png

A: https://blog.csdn.net/gongsunjinqian/article/details/121228000

Q:

A:

参考:

一张图看懂Android编译流程

Build Workflow

transform + asm资料

Chapter 4. The class File Format

JVM指令集:Chapter 6. The Java Virtual Machine Instruction Set

一文读懂Android View事件分发机制

Android中点击事件的来源

上一篇 下一篇

猜你喜欢

热点阅读