All Projects → Leifzhang → Androidautotrack

Leifzhang / Androidautotrack

Android Asm 插桩 教学

Programming Languages

kotlin
9241 projects

Projects that are alternatives of or similar to Androidautotrack

Androidanimationexercise
Android 动画各种实现,包括帧动画、补间动画和属性动画的总结分享
Stars: ✭ 1,254 (+231.75%)
Mutual labels:  gradle, gradle-plugin, asm
Laziertracker
本项目通过Android字节码插桩插件实现Android端无埋点(或自动埋点),并且支持根据配置文件实现业务数据的自动采集。
Stars: ✭ 485 (+28.31%)
Mutual labels:  gradle, gradle-plugin, asm
Bytex
ByteX is a bytecode plugin platform based on Android Gradle Transform API and ASM. 字节码插件开发平台
Stars: ✭ 2,140 (+466.14%)
Mutual labels:  gradle, gradle-plugin, asm
Hunter
A fast, incremental, concurrent framework to develop compile plugin for android project to manipulate bytecode
Stars: ✭ 999 (+164.29%)
Mutual labels:  gradle, gradle-plugin, asm
Click Debounce
Using ASM to handle Android's click debounce, specially a quick double click.
Stars: ✭ 175 (-53.7%)
Mutual labels:  gradle, gradle-plugin, asm
RocketXPlugin
🔥🔥 android 端编译加速插件🚀 自动识别未改动 module 并在编译流程中替换为 aar ,只编译改动模块,加速 Android apk 的编译速度。
Stars: ✭ 408 (+7.94%)
Mutual labels:  gradle, gradle-plugin
gradle-libraries-plugin
No description or website provided.
Stars: ✭ 29 (-92.33%)
Mutual labels:  gradle, gradle-plugin
jooq-plugin
Plugin for generating jOOQ classes using dockerized databases
Stars: ✭ 55 (-85.45%)
Mutual labels:  gradle, gradle-plugin
schema-registry-plugin
Gradle plugin to interact with Confluent Schema-Registry.
Stars: ✭ 60 (-84.13%)
Mutual labels:  gradle, gradle-plugin
gradle-helm-plugin
A Gradle plugin for building, publishing and managing Helm charts.
Stars: ✭ 42 (-88.89%)
Mutual labels:  gradle, gradle-plugin
gradle-console-reporter
Gradle plugin to report various kinds of summaries to console.
Stars: ✭ 49 (-87.04%)
Mutual labels:  gradle, gradle-plugin
Calces Gradle Plugin
Android构建工具集:包含快速实现组件化构建脚本,快速实现屏幕最小宽度适配脚本
Stars: ✭ 366 (-3.17%)
Mutual labels:  gradle, gradle-plugin
Gradle Android Command Plugin
Handy commands for testing Android on CI
Stars: ✭ 349 (-7.67%)
Mutual labels:  gradle, gradle-plugin
sonatype-publish-plugin
Gradle Plugin for publishing artifacts to Sonatype and Nexus
Stars: ✭ 17 (-95.5%)
Mutual labels:  gradle, gradle-plugin
plugin-yml
A Gradle plugin that generates plugin.yml for Bukkit/BungeeCord/Nukkit plugins based on the Gradle project
Stars: ✭ 42 (-88.89%)
Mutual labels:  gradle, gradle-plugin
SetupBuilder
Gradle plugin for building setups for different platforms.
Stars: ✭ 75 (-80.16%)
Mutual labels:  gradle, gradle-plugin
change-tracker-plugin
A Gradle plugin to help analyse the dependency between modules and run tasks only on modules impacted by specific set of changes.
Stars: ✭ 103 (-72.75%)
Mutual labels:  gradle, gradle-plugin
Gradle Unused Resources Remover Plugin
Gradle Plugin that removes unused resources in Android projects.
Stars: ✭ 282 (-25.4%)
Mutual labels:  gradle, gradle-plugin
Gradle Aws Plugin
Gradle plugin to manage Amazon Web Services
Stars: ✭ 269 (-28.84%)
Mutual labels:  gradle, gradle-plugin
Gradle Code Quality Tools Plugin
Gradle plugin that generates ErrorProne, Findbugs, Checkstyle, PMD, CPD, Lint, Detekt & Ktlint Tasks for every subproject.
Stars: ✭ 282 (-25.4%)
Mutual labels:  gradle, gradle-plugin

AndroidAutoTrack

State-of-the-art Shitcode

本项目主要就是给大家一个参考学习的demo而已,主要是打算简化学习gradle插件的成本,以及对于android transform的一次抽象,将增量更新等等进行一次抽象,以方便大家学习开发。

buildSrc 优化

之前通过buildSrc形式重构项目,不需要本地推aar,同时module可以被同一个buildSrc关联上,方便调试和代码上传。

ComposeBuilding 优化

通过项目组合编译的方式重构,同样不需要本地推aar,保留了上述所有的优点的同时,由于buildSrc是一个优先编译的工程,所以无法使用项目内的build.gradle,而ComposeBuild则由于是一个独立Project,所以可以使用当前下面的所有共用属性。

协程 路由 组件化 1+1+1>3 | 掘金年度征文,文章内有对ComposeBuilding的更详细的介绍和使用。

Tips 小贴士

直接编译你的项目,观察项目下的build/imtermediates/transform/ 文件夹下面,因为class类android studio已经帮你完成了转化,所以无需担心看不懂的问题。

最好各位可以安装一个ASM ByteCode Viewer插件,可以辅助大家快速阅读对应代码。

仔细观察编译前java代码和编译后class文件的差别。如果有插入的代码那么代表该插件已经编织代码成功。

dejavu x

这次牛逼了,通过最简单的serviceloader机制,把多个plugin通过DI的形式收拢到一起,方便多插件组合接入。

class MultiPlugin : Plugin<Project> {

    override fun apply(project: Project) {
        // 菜虾版本byteX beta版本
        val providers = ServiceLoader.load(PluginProvider::class.java).toList()
        providers.forEach {
            project.plugins.apply(it.getPlugin())
        }
    }
}

只要把不同的插件的classpath 加载进来,之后在主工程下声明你的合并插件即可直接使用。

依赖任务

这次通过有向图的方式重新计算了下plugin之间的依赖关系,这样就可以指定transform的执行顺序了。

实现参考了gradle的CachingDirectedGraphWalker,有兴趣的大佬可以自行阅读,这部分说实话,算法我不是特别熟悉。

AutoTrackPlugin 安卓无痕埋点Demo

以前使用的是ClassVisitor,由于无痕埋点相关其实有上下文以及传输数据等等的要求,所以该方案废弃了。

当前通过ClassNode方式实现,ClassNode是类似Ast语法树的一种ClassVisitor的实现类,可以通过主动访问的方式,去对当前你需要变更的类进行快速访问逻辑判断,同时由于在外层判断逻辑,所以可以更方便的添加代码组合等,让asm操作更简化。

通过编译时检索代码中是否实现了View.OnClickListener接口,然后在onClick方法尾部插入代码打点代码。

如何将参数传递给打点代码

通过标识注解的方式可以将外部的参数直接传输给埋点事件,这样就可以更丰富简单的拓展无痕埋点系统。

View.OnClickListener listener=new View.OnClickListener() {
            @Test
            private Entity mdata;

            @Override
            public void onClick(View v) {
                mdata = new Entity();
                Log.i("MainActivity", v.toString());
                Intent intent = new Intent();
                intent.setClass(MainActivity.this, SecondActivity.class);
                startActivity(intent);
            }
        });

完成Fragment hidden开发

后续会补充上给fragment activity 生命周期方法补充增强

double tap plugin 双击优化

新增功能

可以让当前双击保护只作用于Module下面,而不是App下面,让同学可以热拔插这部分代码,因为双击保护其实更针对模块开发同学,所以可以直接使用该插件,同时该插件也会对上传AAr生效,放心使用。

原理和无痕埋点相似,当前还是保留以前开发无痕埋点的visitor形式。

通过ClassVisitor的机制访问所有View.OnClickListener的子类,然后插入双击优化的代码块。但是插入的是一个类,所以有一部分逻辑代码,织入操作更为复杂,可以使用gradle插件去更好的学习。

InitBlockVisitor 这个类MethodVisitor会给当前类的init 添加一个成员变量。DoubleTapCheck doubleTap = new DoubleTapCheck(); 然后在onClick 方法前添加一个逻辑判断。

使用原则

根目录build 添加插件

buildscript {
   
   repositories {
       maven {
           url "file://${rootDir.absolutePath}/.repo"
       }
       google()
       jcenter()

   }
   dependencies {
       classpath 'com.kronos.doubleTap:double_tap_plugin:0.1.3'
   }
}

app 运行工程下引入插件 同时将你需要插入的代码的className 和functionname 标记在Extension中

apply plugin: 'doubleTap'

doubleTab {
   injectClassName = "com.a.doubleclickplugin.DoubleTapCheck"
   injectFunctionName = "isNotDoubleTap"
}

Thread Hook plugin 线程hook更换

通过字节码访问,查找项目内的线程池构造等,发现之后替换成自定义的线程构造。

方法

通过ASM的ClassNode 的方式读取了当前类的所有构造函数,然后判断当前的执行内容是否是需要变魔改的类,如果是则替换他的desc owner name相关。

class ThreadAsmHelper : AsmHelper {
    @Throws(IOException::class)
    override fun modifyClass(srcClass: ByteArray): ByteArray {
        val classNode = ClassNode(Opcodes.ASM5)
        val classReader = ClassReader(srcClass)
        //1 将读入的字节转为classNode
        classReader.accept(classNode, 0)
        //2 对classNode的处理逻辑
        val iterator: Iterator<MethodNode> =
            classNode.methods.iterator()
        while (iterator.hasNext()) {
            val method = iterator.next()
            method.instructions?.iterator()?.forEach {
                if (it.opcode == Opcodes.INVOKESTATIC) {
                    if (it is MethodInsnNode) {
                        it.hookExecutors(classNode, method)
                    }
                }
            }
        }
        val classWriter = ClassWriter(0)
        //3  将classNode转为字节数组
        classNode.accept(classWriter)
        return classWriter.toByteArray()
    }

    private fun MethodInsnNode.hookExecutors(classNode: ClassNode, methodNode: MethodNode) {
        when (this.owner) {
            EXECUTORS_OWNER -> {
                info("owner:${this.owner}  name:${this.name} ")
                ThreadPoolCreator.poolList.forEach {
                    if (it.name == this.name && this.name == it.name && this.owner == it.owner) {
                        this.owner = Owner
                        this.name = it.methodName
                        this.desc = it.replaceDesc()
                        info("owner:${this.owner}  name:${this.name} desc:${this.desc} ")
                    }
                }

            }
        }
    }
}

最后在编译阶段该类就会被替换成我们想要的类,举个例子Executors.newSingleThreadExecutor();变更成TestIOThreadExecutor.getThreadPool();

升级更新

多线程操作字节码

base plugin 代码升级,使用多线程优化,讲字节码操作执行在线程中,之后在主函数等待所有task执行完成之后在结束。

base plugin 主要是辅助后续有兴趣的同学可以快速的进行transform开发学习,在当前类基础上,可以无视繁琐的增量编译和额外的文件拷贝操作,只专注于Asm的学习。

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].