IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 字节码打桩插入代码块|IOC框架之对象注入~研究 -> 正文阅读

[移动开发]字节码打桩插入代码块|IOC框架之对象注入~研究

在这里插入图片描述

在尝试使用’org.javassist:javassist:3.27.0-GA’进行自定义gradle插件时,

遇到报错

FileSystemException

当前报错的项目工程中
gradle插件是:classpath 'com.android.tools.build:gradle:3.4.2'
gradle版本是 :distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip

Caused by: java.util.concurrent.ExecutionException: 
java.nio.file.FileSystemException: 
D:\android-studio\包名\build\intermediates\runtime_library_classes\debug\classes.jar: 
另一个程序正在使用此文件,进程无法访问。

解决方案

删除(终止)占用该classes.jar文件的进程。报错时,在任务管理页面截图的详细信息中java.exe进程有三个。然后全部删除,并重新构建工程,构建成功后显示两个java.exe进程。
在这里插入图片描述

在IOC框架研究使用DI(依赖注入),Hilt 进行对象注入时。

IOC框架下有三种注入方式:
view注入: 如ButterKnife
参数注入: 如Arouter
对象注入: 如Dagger2,Hilt

Hilt NoClassDefFoundError

当前报错的项目工程中
gradle插件是:classpath 'com.android.tools.build:gradle:3.4.2'
gradle版本是 :distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip

2022-05-18 09:40:42.941 27105-27105/? E/AndroidRuntime: FATAL EXCEPTION: main
    Process: 包名, PID: 27105
    java.lang.NoClassDefFoundError: Failed resolution of: Lorg/包名/MainActivity_GeneratedInjector;
        at 包名.Hilt_MainActivity.inject(Hilt_MainActivity.java:53)
        包名.Hilt_MainActivity.onCreate(Hilt_MainActivity.java:28)
        at 包名.MainActivity.onCreate(MainActivity.java:32)

解决方案

本地修改当前gradle版本号到distributionUrl=file:///C:/Users/Administrator/.gradle/wrapper/dists/gradle-6.4.1-all.zip
(这个报错出现在gradle未下载完全导致)或者使用vpn执行构建下载distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip

然后请确认以下自己AS下Settings和Project Structure的配置,
在这里插入图片描述
在这里插入图片描述

GradleException: ‘buildSrc’

* Exception is:
org.gradle.api.GradleException: 'buildSrc' cannot be used as a project name as it is a reserved name
	at org.gradle.initialization.DefaultSettingsLoader.lambda$validate$0(DefaultSettingsLoader.java:146)
	at org.gradle.initialization.DefaultSettingsLoader.validate(DefaultSettingsLoader.java:142)
	at org.gradle.initialization.DefaultSettingsLoader.findSettingsAndLoadIfAppropriate

解决方案

在创建buildSrc该module时,ide会自动将该module引入到setttings.gradle中,因此会报上面错误。在settings.gradle中删除include ':buildSrc’即可。

Groovy语言与Java相较

Groovy语言是基于JVM虚拟机的动态语言,Java是静态语言,Groovy完全兼容Java。
Groovy def关键字,def关键字用于定义Groovy中的无类型变量或动态返回类型的函数。
Groovy语法上分号不是必须的(该特点和kotlin一样),Java分号是必须的。
Groovy语法上单引号和双引号都能定义一个字符串,单引号不能对字符串中表达式做运算,双引号可以。Java单引号定义字符,双引号定义字符串。
Groovy语言声明一个List集合使用中括号,Java声明List集合使用大括号。(Groovy访问元素list[0]如范围索引1..3,-1表示右侧第一个等,Java访问元素list.get(0))
Groovy语言在声明map时使用中括号(访问map[key]、map.key,遍历map.each{item->...}),Java使用大括号。
Groovy语法在执行调用一个方法时,括号可以不写。Java则是必须的。
Groovy语法的return不是必须的,这个和kotlin一样。
Groovy语法的闭包有话说(与kotlin 如出一辙)

/** Groovy闭包的演变过程 */
def closureMethod () {
	def list = [1,2,3,4,5,6]
	// 呆板写法
	list.each({println it}) 
	list.each({ // 格式化下
	    println it
	})

	// 演进 - Groovy规定,若方法中最后一个参数是闭包,可放到方法外面
	list.each(){
		println it
	}

	// 再次演变 - 方法后的括号能省略
	list.each{
		println it
	}
}

(在gradle文件中)Groovy语言在定义一个任务时,(脚本即代码,代码也是脚本)

// build.gradle
// 每个任务task,都是project的一个属性
task customTask1 {
	doFirst {
		println 'customTask1方法第一个执行到的方法'
		def date = new Date()
		def datef = date.format('yyy-MM-dd)
		println "脚本即代码,代码也是脚本。当记得这一点才能时刻使用Groovy、Java和Gradle的任何语法和API来完成你想要做的事情。像这里,当前已格式化的日期:${datef}"
	}
	doLast {
		println 'customTask1方法最后一个执行到的方法'
	}
}

tasks.create ('customTask2') {
	doFirst {
		println 'customTask2方法第一个执行到的方法'
	}
	doLast {
		println 'customTask2方法最后一个执行到的方法'
	}
}
// 通过任务名称访问方法(其实就是动态赋一个新的原子方法)
customTask2.doFirst {
	print '查看在project中是否有task=customTask2 = '
	println project.hasProperty('customTask2')
}

(在gradle文件中)Groovy创建任务的方式大概有5种


/**我们创建Task任务都会成为Project的一个属性,属性名就是任务名*/
task newOwnerTask5
// 扩展任务属性
newOwnerTask5.description = '扩展任务属性-描述'
newOwnerTask5.group = BasePlugin.BUILD_GROUP
newOwnerTask5.doFirst {
	println "我们创建Task任务都会成为Project的一个属性,属性名就是任务名"
}
tasks['newOwnerTask5'].doFirst {
	println "任务都是通过TaskContanier创建的,TaskContanier是我们创建任务的集合,在Project中我们可以用通过tasks属性访问TaskContanier。所以可以以访问集合元素方式访问已创建的任务。"
}
// 第一种:直接以一个任务名称,作为创建任务的方式
def Task newOwnerTask1 = task(newOwnerTask1)
newOwnerTask1.doFirst {
	println '创建方法的原型为:Task task(String name) throws InvalidUserDataException'
}

// 第二种:以一个任务名+一个对该任务配置的map对象来创建任务 [和第一种大同小异]
def Task newOwnerTask2 = task(newOwnerTask2, group:BasePlugin.BUILD_GROUP)
newOwnerTask2.doFirst {
	println '创建方法的原型为:Task task(String name, Map<String,?> arg) throws InvalidUserDataException'
	println "任务分组:${newOwnerTask2.group}"
}
// 第三种:以一个任务名+闭包配置
task newOwnerTask3 {
	description '演示任务的创建'
	doFirst {
		println "任务的描述:${description}"
		println "创建方法的原型:Task task(String name, Closure closure)"
	}
}
// 第四种:tasks是Project对象的属性,其类型是TaskContainer,
// 因此下面的创建方式tasks可替换为TaskContainer来创建task任务
//【这种创建方式,发生在Project对象源码中创建任务对象】
tasks.create("newOwnerTask4") {
	description '演示任务的创建'
	doFirst {
		println "任务的描述:${description}"
		println "创建方法的原型:Task create(String name, Closure closure) throws InvalidUserDataException"
	}
}
// 白送一种任务创建形式
task (helloFlag).doLast {
	println '<< 作为操作符,在gradle的Task上是doLast方法的短标记形式'
}
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-05-25 11:39:46  更:2022-05-25 11:40:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 0:32:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码