iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >Android开发中AsmClassVisitorFactory如何使用
  • 830
分享到

Android开发中AsmClassVisitorFactory如何使用

2023-07-02 11:07:42 830人浏览 八月长安
摘要

这篇文章主要讲解了“Android开发中AsmClassVisitorFactory如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android开发中AsmClassVisitorF

这篇文章主要讲解了“Android开发中AsmClassVisitorFactory如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android开发中AsmClassVisitorFactory如何使用”吧!

AsmClassVisitorFactory

@Incubatinginterface AsmClassVisitorFactory<ParametersT : InstrumentationParameters> : Serializable {        @get:Nested    val parameters: Property<ParametersT>        @get:Nested    val instrumentationContext: InstrumentationContext        fun createClassVisitor(        classContext: ClassContext,        nextClassVisitor: ClassVisitor    ): ClassVisitor        fun isInstrumentable(classData: ClassData): Boolean}

简单的分析下这个接口,我们要做的就是在createClassVisitor这个方法中返回一个ClassVisitor,正常我们在构造ClassVisitor实例的时候是需要传入下一个ClassVisitor实例的,所以我们之后在new的时候传入nextClassVisitor就行了。

另外就是isInstrumentable,这个方法是判断当前类是否要进行扫描,因为如果所有类都要通过ClassVisitor进行扫描还是太耗时了,我们可以通过这个方法过滤掉很多我们不需要扫描的类。

@Incubatinginterface ClassData {        val className: String        val classAnnotations: List<String>        val interfaces: List<String>        val superClasses: List<String>}

ClassData并不是asm的api,所以其中包含的内容相对来说比较少,但是应该也勉强够用了。这部分大家简单看看就行了,就不多做介绍了呢。

新的Extension

AGP版本升级之后,应该是为了区分新旧版的Extension,所以在AppExtension的基础上,新增了一个AndroidComponentsExtension出来。

我们的transfORMClassesWith就需要注册在这个上面。这个需要考虑到变种,和之前的Transform还是有比较大的区别的,这样我们就可以基于不同的变种增加对应的适配工作了。

        val androidComponents = project.extensions.getByType(AndroidComponentsExtension::class.java)        androidComponents.onVariants { variant ->            variant.transformClassesWith(PrivacyClassVisitorFactory::class.java,                    InstrumentationScope.ALL) {}            variant.setAsmFramesComputationMode(FramesComputationMode.COPY_FRAMES)        }

实战

这次还是在之前的敏感权限api替换的字节码替换工具的基础上进行测试开发。

ClassVisitor

看看我们正常是如何写一个简单的ClassVisitor的。

ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS);ClassVisitor methodFilterCV = new ClassFilterVisitor(classWriter);ClassReader cr = new ClassReader(srcClass);cr.accept(methodFilterCV, ClassReader.SKIP_DEBUG);return classWriter.toByteArray();

首先我们会构造好一个空的ClassWriter,接着会构造一个ClassVisitor实例,然后传入这个ClassWriter。然后我们构造一个ClassReader实例,然后将byte数组传入,之后调用classReader.accept方法,之后我们就能在visitor中逐个访问数据了。

那么其实我们的类信息,方法啥的都是通过ClassReader读入的,然后由当前的ClassVisitor访问完之后交给我们最后一个ClassWriter

其中ClassWriter也是一个ClassVisitor对象,他复杂重新将修改过的类转化成byte数据。可以看得出来ClassVisitor就有一个非常简单的链表结构,之后逐层向下访问。

介绍完了这个哦,我们做个大胆的假设,如果我们这个ClassVisitor链表前插入几个不同的ClassVisitor,那么我们是不是就可以让asm修改逐个生效,然后也不需要多余的io操作了呢。这就是新的asm api 的设计思路了,也是我们这边大佬的字节码框架大佬的设计。另外bytex内的设计思路也是如此。

tips Classnode 因为是先生成的语法树,所以和一般的ClassVisitor有点小区别,需要在visitEnd方法内调用accept(next)

实际代码分析

接下来我们上实战咯。我将之前的代码套用到这次的逻辑上来。

demo地址

abstract class PrivacyClassVisitorFactory : AsmClassVisitorFactory<InstrumentationParameters.None> {    override fun createClassVisitor(classContext: ClassContext, nextClassVisitor: ClassVisitor): ClassVisitor {        return PrivacyClassNode(nextClassVisitor)    }    override fun isInstrumentable(classData: ClassData): Boolean {        return true    }}

我在isInstrumentable都返回的是true,其实我可以将扫描规则限定在特定包名内,这样就可以加快构建速度了。

class PrivacyClassNode(private val nextVisitor: ClassVisitor) : ClassNode(Opcodes.ASM5) {    override fun visitEnd() {        super.visitEnd()        PrivacyHelper.whiteList.let {            val result = it.firstOrNull { whiteName ->                name.contains(whiteName, true)            }            result        }.apply {            if (this == null) {                //   println("filter: $name")            }        }        PrivacyHelper.whiteList.firstOrNull {            name.contains(it, true)        }?.apply {            val iterator: Iterator<MethodNode> = methods.iterator()            while (iterator.hasNext()) {                val method = iterator.next()                method.instructions?.iterator()?.forEach {                    if (it is MethodInsnNode) {                        it.isPrivacy()?.apply {                            println("privacy transform classNodeName: ${name@this}")                            it.opcode = code                            it.owner = owner                            it.name = name                            it.desc = desc                        }                    }                }            }        }        accept(nextVisitor)    }}private fun MethodInsnNode.isPrivacy(): PrivacyAsmEntity? {    val pair = PrivacyHelper.privacyList.firstOrNull {        val first = it.first        first.owner == owner && first.code == opcode && first.name == name && first.desc == desc    }    return pair?.second}

这部分比较简单,把逻辑抽象定义在类ClassNode内,然后在visitEnd方法的时候调用我之前说的accept(nextVisitor)方法。

感谢各位的阅读,以上就是“Android开发中AsmClassVisitorFactory如何使用”的内容了,经过本文的学习后,相信大家对Android开发中AsmClassVisitorFactory如何使用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: Android开发中AsmClassVisitorFactory如何使用

本文链接: http://www.lsjlt.com/news/341637.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android开发中AsmClassVisitorFactory如何使用
    这篇文章主要讲解了“Android开发中AsmClassVisitorFactory如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android开发中AsmClassVisitorF...
    99+
    2023-07-02
  • Android开发AsmClassVisitorFactory使用详解
    目录前言AsmClassVisitorFactory新的Extension实战ClassVisitor实际代码分析个人观点前言 之前就和大家介绍过AGP(Android Gradle...
    99+
    2024-04-02
  • AppWidget如何在Android开发中使用
    这期内容当中小编将会给大家带来有关AppWidget如何在Android开发中使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。什么是AppWidgetAppWidget 即桌面小部件,也叫桌面控件,就是...
    99+
    2023-05-31
    android appwidget pp
  • Shell如何在Android 开发中使用
    本篇文章为大家展示了Shell如何在Android 开发中使用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Shell核心代码import java.io.BufferedReader;i...
    99+
    2023-05-31
    android roi shell
  • PopupWindow如何在Android开发中使用
    这篇文章给大家介绍PopupWindow如何在Android开发中使用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。在Android中有很多级别的Window,不同级别的Window按照z-index方向分布。下面看看...
    99+
    2023-05-31
    android popupwindow roi
  • golang如何使用gomobile进行Android开发
    目录一、安装二、编译gomobile三、初始化四、bind 生成arr包和jar包五、在android项目中导入.arr包和jar包六、总结总结一、安装 go get golang....
    99+
    2023-01-28
    golang 安卓开发 golang gomobile
  • 如何使用Kotlin开发一个Android应用
    如何使用Kotlin开发一个Android应用?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。第一步:为AndroidStudio安装Kotlin插件在线安装步骤...
    99+
    2023-05-30
    android kotlin
  • 使用Android Studio开发Android APP
    写在前面 本节将介绍如何使用Android Studio开发Android APP,和前面Eclipse + ADT + SDK搭建Android开发环境一样,本节也只是介绍一些基本东西,深入的,比如快捷键,小技巧等会再另一篇文章中详细...
    99+
    2023-09-29
    android android studio ide
  • Android开发中LayoutParams怎么使用
    LayoutParams是用于控制视图在布局中的位置和大小的类。下面是使用LayoutParams的一些示例代码:1. 设置视图的宽...
    99+
    2023-09-04
    Android LayoutParams
  • Android开发中synchronized怎么使用
    今天小编给大家分享一下Android开发中synchronized怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。sy...
    99+
    2023-07-06
  • Android开发中AlarmManager怎么使用
    在Android开发中,AlarmManager是一个用于在指定时间执行操作的类。以下是使用AlarmManager的步骤:1. 获...
    99+
    2023-09-14
    Android
  • Android开发中如何实现调用Camera
    Android开发中如何实现调用Camera?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。xml:<LinearLayout xmlns:android="ht...
    99+
    2023-05-31
    android camera roi
  • Android开发如何使用WebView打造web app
    这篇文章主要为大家展示了“Android开发如何使用WebView打造web app”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Android开发如何使用WebView打造web&n...
    99+
    2023-06-29
  • Android开发中如何生成excel
    这篇文章主要介绍了Android开发中如何生成excel,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。在android中生成excel表并存到本地。先看下生成后的效果图:初始...
    99+
    2023-05-30
    android excel
  • redis开发中如何使用
    在Redis开发中,可以使用Redis的命令和数据结构来进行操作和存储数据。下面是一些常用的Redis开发用法:1. 字符串操作:-...
    99+
    2023-08-24
    redis
  • Android开发中amera2 Preview使用详解
    目录前言一、Camera2 Preview需要用到哪些模块二、各个模块的功能和之间的关系2.1 SurfaceTexture之SurfaceTextureListener2.1.1 ...
    99+
    2024-04-02
  • 如何在Android开发中使用DatePicker与TimePicke监听时间
    如何在Android开发中使用DatePicker与TimePicke监听时间?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。DatePicker和TimePic...
    99+
    2023-05-31
    android datepicker timepicke
  • 使用Kotlin如何实现开发一个Android应用
    今天就跟大家聊聊有关使用Kotlin如何实现开发一个Android应用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。配置项目gradle文件apply plugin: 'co...
    99+
    2023-05-31
    kotlin android roi
  • Android开发RelativeLayout.LayoutParams的使用
    RelativeLayout.LayoutParams是用于RelativeLayout布局中的一个LayoutParams子类,用...
    99+
    2023-09-14
    Android
  • Android开发中如何模拟输入
    目录input 指令模拟输入textkeyeventtapswipe主要思路是使用 adb shell input指令来模拟按键及触摸输入。 但是前提是需要root,且华为手机出于安...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作