郝友做的网站photoshop网站模板设计教程视频

张小明 2026/1/11 15:04:30
郝友做的网站,photoshop网站模板设计教程视频,企业营销型网站建设开发,聊城专业网站开发公司01 Gradle8.0插件的使用方式 随着Gradle和Android Gradle Plugin的版本升级#xff0c;以及Kotlin DSL的加入#xff0c;Gradle的配置和使用方式发生了很大的变化。插件仓库和依赖仓库的配置从之前的根工程下的build.gradle文件移到了settings.gradle.kts文件中#xff0c…01Gradle8.0插件的使用方式随着Gradle和Android Gradle Plugin的版本升级以及Kotlin DSL的加入Gradle的配置和使用方式发生了很大的变化。插件仓库和依赖仓库的配置从之前的根工程下的build.gradle文件移到了settings.gradle.kts文件中插件的引入方式也从之前的classpath更改为插件Id。插件的使用也是在子模块中由apply方式变更为id方式。1、老版本中的配置方式根工程下的build.gradle配置buildscript { repositories { google() mavenCentral() } dependencies { classpath com.android.tools.build:gradle:4.2.1 classpath org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.10 } } allprojects { repositories { google() mavenCentral() } }app模块的build.gradle配置apply plugin: com.android.application2、新版本中的配置方式settings.gradle.kts配置pluginManagement { repositories { google() mavenCentral() gradlePluginPortal() } } dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() mavenCentral() } }根工程下的build.gradle.kts配置plugins { id(com.android.application) version 8.1.2 apply false //引入插件 id(org.jetbrains.kotlin.android) version 1.8.10 apply false //引入插件 }apply false表示只是将插件引入并不会自动应用插件到项目中(插件里的任务不会自动执行只有手动调用里面的任务或者配置使用插件后任务才会执行)可以按需在模块中配置使用app模块的build.gradle配置plugins { id(com.android.application) //使用插件 }02Gradle8.0插件的自定义流程之前使用Groovy、Java 、 手动配置的方式演示了Gradle插件的整个自定义流程《自定义gradle插件》。本文使用java-gradle-plugin 和 Kotlin的方式重新梳理下Gradle插件的自定义流程。1、新建一个Module模块hui_plugin(选择Kotlin Library)2、在hui_plugin模块的build.gradle.kts中引入“java-gradle-plugin”插件 和 “org.jetbrains.kotlin.jvm” 插件。“java-gradle-plugin”插件可以大大简化插件的开发流程这个插件会自动将java-library、gradleApi()引入进来提供gradlePlugin配置插件id、版本号等信息取代resources中声明插件类取代maven发布信息的配置。“org.jetbrains.kotlin.jvm”插件支持使用Kotlin编写插件取代Groovy和Javaplugins { id(java-gradle-plugin) //会自动引入java-library、gradleApi() id(org.jetbrains.kotlin.jvm) //支持kotlin编写插件 }3、开始编写自定义的Plugin类class PageAnalysisPlugin : PluginProject { override fun apply(target: Project) { println(Hello PageAnalysisPlugin) } }4、在hui_plugin模块的build.gradle.kts中配置插件gradlePlugin { plugins { create(pagePlugin) { group com.znh.plugin version 1.0.0 id com.znh.plugin.page //插件的唯一标识使用插件的时候就是这个id implementationClass com.znh.plugin.page.PageAnalysisPlugin //PageAnalysisPlugin的全类名 取代resources声明 } } }5、添加maven-publish插件配置本地仓库地址以便于发布到mavenplugins { id(java-gradle-plugin) //会自动引入java-library、gradleApi() id(org.jetbrains.kotlin.jvm) //支持kotlin编写插件 id(maven-publish) //发布到maven } publishing { repositories { maven { url uri(../custom_plugin_repo) //本地maven地址 } } }6、发布到maven仓库7、生成本地maven仓库至此一个Gradle插件的自定义开发和发布就都完成了相比于老的插件开发方式流程简化了很多8、插件的使用需要先配置本地maven仓库在settings.gradle.kts中配置本地仓库地址pluginManagement { repositories { maven { url uri(./custom_plugin_repo) } } }9、在工程根目录下的build.gradle.kts引入插件plugins { id(com.znh.plugin.page) version 1.0.0 apply false }10、在app下的build.gradle.kts中使用插件plugins { id(com.znh.plugin.page) }11、输出打印结果03Transform的替代方案根据官方文档《Android Gradle 插件 API 更新》可知Transform在7.2版本中被标记为废弃在AGP8.0中被移除但是并没有提供直接替代它的单一API而是提供了几种场景的解决方案(转换字节码、向应用添加生成的类、基于整个程序分析的转换)。像方法耗时统计、页面打点统计这类只需要在遍历中直接修改对应的class即可不涉及到复杂的逻辑可以使用转换字节码的方案进行实现。转换字节码的实现需要用到Instrumentation API使用此API每个类的插桩修改都是独立运行的可以并行执行效率较高。之前基于Transform实现过一个模拟页面打点统计的Demo《ASM和自定义Transform的应用实践》本文还以模拟页面打点统计为例结合Instrumentation的transformClassesWith和AsmClassVisitorFactory来实现对Class的插桩修改。对于较复杂的场景后续考虑以路由信息收集为例使用“基于整个程序分析的转换”方案进行实现。1、在hui_plugin模块的build.gradle.kts中引入android依赖dependencies { implementation(com.android.tools.build:gradle:8.1.2) }2、定义一个AsmClassVisitorFactory类然后实现其createClassVisitor方法和isInstrumentable方法createClassVisitor方法中对class进行ASM修改操作isInstrumentable方法定义需要修改的class的过滤条件。PageClassVisitor具体对Class的ASM操作跟之前一样这里就不粘贴代码了有兴趣的可以直接查看Demo代码。(ASM的字节码操作可以先用kotlin编写然后使用AS工具转换成字节码。也可以结合ChatGPTAI对这种标准化程度较高的功能比较擅长)abstract class PageClassVisitorFactory : AsmClassVisitorFactoryInstrumentationParameters.None { override fun createClassVisitor(classContext: ClassContext, nextClassVisitor: ClassVisitor): ClassVisitor { return PageClassVisitor(nextClassVisitor) } override fun isInstrumentable(classData: ClassData): Boolean { return classData.superClasses.contains(android.support.v7.app.AppCompatActivity) || classData.superClasses.contains(androidx.appcompat.app.AppCompatActivity) || classData.superClasses.contains(androidx.activity.ComponentActivity) } }3、在apply中通过Instrumentation进行遍历修改classoverride fun apply(target: Project) { println(Hello PageAnalysisPlugin) val androidComponents target.extensions.getByType(AndroidComponentsExtension::class.java) androidComponents.onVariants { variant - variant.instrumentation.transformClassesWith( PageClassVisitorFactory::class.java, InstrumentationScope.ALL ) {} variant.instrumentation.setAsmFramesComputationMode(FramesComputationMode.COPY_FRAMES) } }4、输出打印结果Page_TAG com.znh.gradle80.plugin.demo I com/znh/gradle80/plugin/demo/MainActivity---onCreate Page_TAG com.znh.gradle80.plugin.demo I com/znh/gradle80/plugin/demo/FirstActivity---onCreate Page_TAG com.znh.gradle80.plugin.demo I com/znh/gradle80/plugin/demo/SecondActivity---onCreate Page_TAG com.znh.gradle80.plugin.demo I com/znh/gradle80/plugin/demo/SecondActivity---onDestroy Page_TAG com.znh.gradle80.plugin.demo I com/znh/gradle80/plugin/demo/FirstActivity---onDestroy Page_TAG com.znh.gradle80.plugin.demo I com/znh/gradle80/plugin/demo/MainActivity---onDestroyDemo地址https://github.com/huihuigithub/blog_demo_projectsgradle80-plugin-demo参考文档Android Gradle 插件 API 更新https://developer.android.google.cn/studio/releases/gradle-plugin-api-updates?hlzh_cn扩展 Android Gradle 插件https://developer.android.google.cn/studio/build/extend-agp?hlzh_cn开发自定义 Gradle 插件https://docs.gradle.org/current/userguide/custom_plugins.htmlGradle Plugin 开发插件https://docs.gradle.org/current/userguide/java_gradle_plugin.html#java_gradle_plugin使用 Gradle 插件https://docs.gradle.org/current/userguide/plugins.html#sec:plugin_markersAndroid Gradle 插件版本说明https://developer.android.google.cn/studio/releases/gradle-plugin?hlzh-cn#updating-plugin转自基于Gradle8.0的插件开发
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

上海企业咨询公司通辽做网站通过seo来赚钱

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个展示页面,包含5种实战中的CSS下划线案例:1) 电商价格删除线动画 2) 博客标题渐变下划线 3) 导航菜单悬停波浪线 4) 引用文本虚线强调 5) 按钮点击波…

张小明 2026/1/11 5:52:19 网站建设

天津网站开发公司电话网站建设 牛商网技术提供

线程安全函数与信号处理详解 1. 线程安全函数概述 在多线程编程中,线程安全是一个至关重要的概念。虽然 ANSI C 和 POSIX 1003.1 - 1990 在设计时并未考虑线程,但它们定义的大多数函数可以在不改变外部接口的情况下实现线程安全。例如, malloc 和 free 函数为了支持线…

张小明 2026/1/11 6:10:42 网站建设

网站开发模板免费下载做网站需要知道的简单代码

FaceFusion在AI健身课程教练形象多样化中的应用 在智能健身平台竞争日益激烈的今天,用户不再满足于千篇一律的标准化教学视频。他们希望看到“像自己”的教练、听到贴近自己文化背景的声音、感受到被理解与尊重的个性化体验。然而,传统录播课程依赖真人出…

张小明 2026/1/11 7:38:26 网站建设

阜阳学网站建设修改wordpress字体

编程与系统管理综合知识解析 1. 符号与数字相关 在编程和系统管理中,各种符号有着特定的用途。例如冒号(:)在 HISTAIGNORE 、 OPTERR 、 PATH 等设置中有不同作用;双冒号(::)与 PATH 相关。逗号(,)用于文件名和变量处理。点号(.)在文件名、库文件、 PATH …

张小明 2026/1/10 23:50:09 网站建设

建设英文网站公司哪家好专门做电脑壁纸网站

如何快速安装JDK 8:面向开发者的完整指南 【免费下载链接】JDK8安装包下载 JDK8 安装包下载本仓库提供了一个资源文件的下载,即 JDK8安装包.zip 项目地址: https://gitcode.com/open-source-toolkit/8a55c JDK 8(Java Development Kit…

张小明 2026/1/11 8:12:40 网站建设

网站制作代注册域名邮箱

从递归/记忆化搜索入手动态规划 在入门动态规划时,记忆化搜索往往比递推形式更容易想。可以先写出记忆化搜索,再转为递推形式。 记忆化搜索很好用,但并不是万能的,某些题目只有写成递推,才能结合数据结构等来优化时间…

张小明 2026/1/11 9:36:01 网站建设