大连培训网站建设开发公司管理制度

diannao/2026/1/21 7:13:36/文章来源:
大连培训网站建设,开发公司管理制度,网站建设报价word文档,建设网站的个人心得体会1、前言 Gradle插件开发在Android进阶知识中是占有一定比例的#xff0c;特别是在性能优化领域#xff0c;基本都会涉及#xff0c;而且跟我们日常的编译打包也息息相关#xff0c;加上有不少招聘要求里也明确要有Gradle插件开发经验#xff0c;所以即使大部分人的日常开…1、前言 Gradle插件开发在Android进阶知识中是占有一定比例的特别是在性能优化领域基本都会涉及而且跟我们日常的编译打包也息息相关加上有不少招聘要求里也明确要有Gradle插件开发经验所以即使大部分人的日常开发中可能用不到插件开发但也心向往之。本文就给大家带来Gradle系列的第8篇——插件开发指南希望能给大家带来收获。 2、Gradle插件是什么 Gradle插件(Plugin)是一种用于扩展和定制 Gradle构建系统功能的机制。Gradle是一个强大的构建自动化工具用于构建和管理各种类型的项目从简单的Java应用到复杂的多模块企业级项目。插件为Gradle提供了灵活性允许开发者根据特定需求添加自定义行为和功能。 Gradle插件可以执行各种任务包括编译代码、执行测试、打包文件、生成文档等等。插件可以访问和操作 Gradle的构建模型如项目、任务、依赖关系等从而实现对构建过程的控制和定制。 Gradle提供了丰富的插件生态系统可以使用现有的官方插件或第三方插件来增强构建过程。许多流行的框架和工具如 Android、Spring Boot、Kotlin 等都有相应的Gradle插件使得与这些技术栈的集成变得更加简单和高效。 比如大家熟悉的Android插件com.android.application plugins {id com.android.application }通过编写自己的Gradle插件你可以定制和扩展 Gradle 构建系统以适应特定项目的需求。你可以在插件中定义自定义任务、配置扩展、操作项目属性、应用其他插件等。插件使得构建过程变得可控和可定制从而提高开发效率。 3、为什么要写插件 写插件的意义 封装把具体的逻辑抽出去项目只要运行插件就行了不用放在某一个build.gradle文件中而降低build.gradle的可读性复用把通用的逻辑抽出去用的时候只要apply应用插件即可不用一遍一遍的复制也可以提供给别的项目使用定制如果需要在编译期做一些插桩、Hook之类的自定义操作也需要用到编译插件 4、插件写在哪 上文我们介绍了Gradle Task其中有提到Task写在哪那Plugin又写在哪呢 插件Plugin可以写在3个地方 跟Task一样写在build.gradle文件中作用域当前Project写在buildSrc里作用域当前项目所有Project写在单独项目里发布后可提供给所有项目所有Project 根据自己需求结合插件作用域写在不同的位置即可。 5、自定义插件 编写一个插件Plugin其实挺简单的只需要实现Plugin接口并实现唯一apply方法即可。 我们就直接写在build.gradle文件中 class YechaoaPlugin implements PluginProject {Overridevoid apply(Project project) {println(这是插件${this.class.name})} }apply plugin: YechaoaPlugin //apply(plugin: YechaoaPlugin)这实际上是一个内联类。 写完别忘了apply依赖上。第9行的apply方法是调用的PluginAware接口的apply()方法参数是一个map用来映射Plugin Id。 sync输出 Configure project :app 这是插件YechaoaPlugin ...在上一文Task详解中提到Task是Project中的一个方法所以我们需要通过Project去创建一个Task。示例中YechaoaPlugin类实现了Plugin接口并实现唯一apply方法而apply方法中提供了Project对象那我们就也可以在Plugin中去创建一个Task。 class YechaoaPlugin implements PluginProject {Overridevoid apply(Project project) {println(这是插件${this.class.name})project.task(YechaoaPluginTask) { task -task.doLast {println(这是插件${this.class.name}它创建了一个Task${task.name})}}} }如上我们在Plugin里创建了一个Task这时候sync是不会执行Task里面的打印的得单独去执行这个Task。 执行 ./gradlew YechaoaPluginTask输出 Task :app:YechaoaPluginTask 这是插件YechaoaPlugin它创建了一个TaskYechaoaPluginTaskok最基本的Plugin编写就是这么简单。 结合以上两次输出不管是单纯的在Plugin里打印也好还是在Plugin里创建Task当我们依赖YechaoaPlugin插件的时候即apply plugin: YechaoaPlugin这个apply会把这个插件放进PluginContainer里类似TaskContainer同时这个apply也是在编译阶段执行Plugin接口的apply()方法所以sync执行构建后会有输出执行的Task也是在有向无环图里。 6、自定义插件扩展 在Gradle系列的第二章里通过源码分析了android{ }闭包是怎么来的android{ }闭包是我们非常熟悉的配置通过DSL的方式我们经常会在里面配置compileSdk、buildTypes等。 而在自定义插件的时候经常也会有这种自定义配置的需求通过这些自定义的配置可以让我们的插件提供更丰富的能力。这些配置就是通过扩展插件来的。 6.1、定义扩展对象 interface YechaoaPluginExtension{PropertyString getTitle() }可以是一个接口也可以是一个类。 6.2、把扩展添加给Plugin并使用 class YechaoaPlugin implements PluginProject {Overridevoid apply(Project project) {println(这是插件${this.class.name})def extension project.extensions.create(yechaoa, YechaoaPluginExtension)project.task(YechaoaPluginTask) { task -task.doLast {println(这是插件${this.class.name}它创建了一个Task${task.name})println(extension.title.get())}}} }project.extensions.create()方法接收两个参数 第一个是名字比如yechaoa、android第二个就是扩展对象然后返回这个扩展对象通过这个扩展对象的方法就可以获取自定义的配置参数 6.3、配置参数 yechaoa.massage 【Gradle-8】Gradle插件开发指南一个配置可以直接省略写也可以这么写 yechaoa {massage 【Gradle-8】Gradle插件开发指南 }如果没有设置配置参数的话Gradle也提供了默认值的设置 extension.title.convention(默认配置title)如果是类对象就定义一下setter/getter。 如果有多个配置怎么写扩展多个配置属性就好了。 6.4、嵌套扩展 如下android { }里面还有defaultConfig { } android {namespace com.yechaoa.gradlexcompileSdk 32defaultConfig {applicationId com.yechaoa.gradlex...} }嵌套扩展其实也很简单就是套娃。 上面我们用接口定义了扩展属性下面换一种写法用class对象来定义。 6.4.1、定义扩展 class YechaoaPluginExtension {String titleint chapterSubExtension subExtensionYechaoaPluginExtension(Project project) {subExtension project.extensions.create(sub, SubExtension.class)} } class SubExtension {String author }多定义了一个SubExtension类然后在YechaoaPluginExtension实例化的时候加到ExtensionContainer中。 如果要类嵌套的话也行得是内联类不然编译识别不了。 6.4.2、获取扩展属性 class YechaoaPlugin implements PluginProject {Overridevoid apply(Project project) {println(这是插件${this.class.name})def extension project.extensions.create(yechaoa, YechaoaPluginExtension)// 设置默认值 可以定义set()方法 然后在这里setproject.task(YechaoaPluginTask) { task -task.doLast {println(这是插件${this.class.name}它创建了一个Task${task.name})println(title ${extension.title})println(chapter ${extension.chapter})println(author ${extension.subExtension.author})}}} }相比于上面接口定义的示例少了Property对象的.get()也去掉了设置的默认值的环节如果想要的话在类对象里定义setter/getter方法就行其它逻辑不变。 6.4.3、使用 yechaoa {title 【Gradle-8】Gradle插件开发指南chapter 8sub {author yechaoa} }闭包配置中多了一个sub{ }闭包就是我们YechaoaPluginExtension类中定义的。 6.4.4、执行 ./gradlew YechaoaPluginTask6.4.5、输出 Task :app:YechaoaPluginTask title 【Gradle-8】Gradle插件开发指南 chapter 8 author yechaoa6.4.6、完整代码 class YechaoaPluginExtension {String titleint chapterSubExtension subExtensionYechaoaPluginExtension(Project project) {subExtension project.extensions.create(sub, SubExtension.class)} } class SubExtension {String author }class YechaoaPlugin implements PluginProject {Overridevoid apply(Project project) {println(这是插件${this.class.name})def extension project.extensions.create(yechaoa, YechaoaPluginExtension)// 设置默认值 可以定义set()方法 然后在这里setproject.task(YechaoaPluginTask) { task -task.doLast {println(这是插件${this.class.name}它创建了一个Task${task.name})println(title ${extension.title})println(chapter ${extension.chapter})println(author ${extension.subExtension.author})}}} }apply plugin: YechaoaPluginyechaoa {title 【Gradle-8】Gradle插件开发指南chapter 8sub {author yechaoa} }现在yechaoa{ }这个配置是不是很熟悉了 yechaoa {title 【Gradle-8】Gradle插件开发指南chapter 8sub {author yechaoa} }是不是跟android{ }一毛一样 android {namespace com.yechaoa.gradlexcompileSdk 32defaultConfig {applicationId com.yechaoa.gradlex...} }7、编写在单独项目中 上面我们的Plugin是写在build.gradle文件中的而一般在实际项目中为了更好的复用一般都是写在buildSrc或者单独的项目中。 而写在build.gradle文件中和写在buildSrc或者单独的项目中还是有一些区别的下面带大家一起看下在单独项目中是如果来写的等同于buildSrc。 来个简单的就写一个打印项目中所有依赖的Plugin吧。 7.1、新建Module 新建一个名称为plugin的Module类型选择为Library或下面的Java or Kotlin Library 新建Module之后会有默认的文件目录多余的文件都可以删掉的。 我们可以看到main文件夹下有java文件夹Gradle Plugin可以用java写也可以用kotlin、groovy来学喜欢用什么就可以在main文件下新建对应语言的文件夹接口比如kotlin文件夹。 7.2、新建文件添加依赖 7.2.1、新建类 新建一个DependenciesPlugin类 但是这时候还是不能编写Plugin的因为你这个module里面并没有依赖Gradle相关API。 7.2.2、添加依赖 在Gradle 6.4及以后就不用再添加gradleApi()来配置Plugin的依赖啥的了直接一个java-gradle-plugin插件搞定它会自动把java、gradleApi()依赖添加到项目中。 并且不需要像以前在src/main/resources/META-INF/gradle-plugins/xxx.properties中来配置你的implementation-class了直接一个gradlePlugin{ }配置搞定Gradle会自动生成META-INF描述文件。 在pluginbuild.gradle文件中依赖插件 plugins {id java-gradle-plugin }配置如下 gradlePlugin{plugins{DependenciesPlugin{id com.yechaoa.plugin.dependenciesimplementationClass com.yechaoa.plugin.DependenciesPlugin}} }idapply时引用的plugin idimplementationClassPlugin路径 在Gradle 6.4以前 implementation-classcom.yechaoa.plugin.DependenciesPlugin因为以前这些文件夹、配置全是手动的很繁琐相比之下现在更爽多了。 7.3、编写Plugin package com.yechaoa.plugin;import org.gradle.api.Plugin; import org.gradle.api.Project;/*** GitHub : https://github.com/yechaoa* CSDN : http://blog.csdn.net/yechaoa* p* Created by yechao on 2023/8/8.* Describe :*/ class DependenciesPlugin implements PluginProject {Overridepublic void apply(Project project) {System.out.println( this.getClass().getName());} }新建一个类实现Plugin接口在apply方法中实现自己的逻辑这里示例打印 到此Plugin的基本雏形就有了。 添加依赖使用 apply plugin: com.yechaoa.plugin.dependencies但是现在外部项目还用不了直接引用这个 会出现找不到plugin的情况(not found)。 Plugin with id com.yechaoa.plugin.dependencies not found.因为这个Plugin是在单独项目中写的准确的来说跟别的项目其实是没有关系的想要找到这个插件就得发布这个插件才行。 7.4、本地发布 本地发布要比远端发布简单多了虽然远端发布也不难只是繁琐。 7.4.1、Maven插件 首先比较常用的仓库是maven在pluginbuild.gradle文件中先依赖一个maven发布的插件maven-publish plugins {id maven-publish }dependencies {implementation com.android.tools.build:gradle:7.3.0 }7.4.2、发布配置 添加发布配置 group com.yechaoa.plugin version 1.0.0publishing {// 配置Plugin GAVpublications {maven(MavenPublication) {groupId groupartifactId dependenciesversion versionfrom components.java}}// 配置仓库地址repositories {maven {url layout.buildDirectory.dir(maven-repo)}} }7.4.3、执行发布操作 ./gradlew publish或者在Android Studio右边Gradle可视化的面板点击运行publish 7.4.4、生成产物 ok这时候build文件夹下已经有本地发布配置的maven-repo文件夹了。 可以再确认一下maven的元数据和pom文件 metadatagroupIdcom.yechaoa.plugin/groupIdartifactIddependencies/artifactIdversioninglatest1.0.0/latestrelease1.0.0/releaseversionsversion1.0.0/version/versionslastUpdated20230809154815/lastUpdated/versioning /metadata7.5、使用 ok本地发布完了要想使用这个插件跟我们正常依赖插件是一样的流程。 三步走 在settings.gradle文件中配置插件仓库地址 pluginManagement {repositories {// ...maven {url ./maven-repo}} }在projectbuild.gradle文件中添加插件依赖 buildscript {dependencies {classpath(com.yechaoa.plugin:dependencies:1.0.0)} }在app:build.gradle文件中依赖我们的plugin plugins {id com.yechaoa.plugin.dependencies }以上配置都是在app模块中添加的即需要使用的模块。 编译看效果 Configure project :appcom.yechaoa.plugin.DependenciesPluginok正确打印出来了说明我们自定义的plugin已经可以对外提供使用了。 注意本地依赖使用的时候要先发布再依赖插件否则就会出现cannot found找不到依赖的情况。 7.6、功能实现 上面的示例只是一个打印继续实现我们的功能把所有的依赖项打印出来。 打印依赖项的方式有很多比如gradle命令 ./gradlew app:dependencies那如果我要区分官方库和三方库怎么办呢这时候就无法满足了。 下面改造一下上面的Plugin class DependenciesPlugin implements PluginProject {private final String TAG DependenciesPlugin ;Overridepublic void apply(Project project) {System.out.println(TAG this.getClass().getName());DependenciesPluginExtension extension project.getExtensions().create(printDependencies, DependenciesPluginExtension.class);project.afterEvaluate(pro - {/** 扩展的配置要在 project.afterEvaluate 之后获取哦* 因为配置阶段完成才能读取参数* 且配置完成才能拿到所有的依赖*/// 默认开启打印extension.getEnable().convention(false);if (extension.getEnable().get()) {// debug/release也可以加配置System.out.println(TAG 已开启依赖打印);AppExtension androidExtension project.getExtensions().getByType(AppExtension.class);androidExtension.getApplicationVariants().all(applicationVariant - {System.out.println(TAG applicationVariant.getName() applicationVariant.getName());// 方式一build.gradle 文件中添加的依赖Configuration configuration project.getConfigurations().getByName(applicationVariant.getName() CompileClasspath);SetDependency allDependencies configuration.getAllDependencies(); // for (Dependency dependency : allDependencies) { // System.out.println(TAG dependency dependency.getGroup() : dependency.getName() : dependency.getVersion()); // }ListString androidLibs new ArrayList();ListString otherLibs new ArrayList();// 方式二所有的依赖包括依赖中的依赖configuration.getResolvedConfiguration().getLenientConfiguration().getAllModuleDependencies().forEach(resolvedDependency - {ModuleVersionIdentifier identifier resolvedDependency.getModule().getId();//System.out.println(TAG identifier identifier.getGroup() : identifier.getName() : identifier.getVersion());if (identifier.getGroup().contains(androidx) || identifier.getGroup().contains(com.google) || identifier.getGroup().contains(org.jetbrains)) {androidLibs.add(identifier.getGroup() : identifier.getName() : identifier.getVersion());} else {otherLibs.add(identifier.getGroup() : identifier.getName() : identifier.getVersion());}});System.out.println(--------------官方库 start--------------);androidLibs.forEach(System.out::println);System.out.println(--------------官方库 end--------------);System.out.println(--------------三方库 start--------------);otherLibs.forEach(System.out::println);System.out.println(--------------三方库 end--------------);});} else {System.out.println(TAG 已关闭依赖打印);}});} } 扩展 interface DependenciesPluginExtension {PropertyBoolean getEnable(); }使用 printDependencies {enable true }小结 先是加了一个配置enable来判断是否需要打印依赖在项目评估完成之后project.afterEvaluate获取项目配置Configuration通过Configuration获取所有的依赖getAllModuleDependencies遍历获取GAV并分类最后打印出来 这里有一点需要注意我们需要在project.afterEvaluate方法中去获取扩展配置因为apply plugin的执行时机早于扩展配置否则获取不到扩展配置的值。 编译运行输出 Configure project :appcom.yechaoa.plugin.DependenciesPluginapplicationVariant.getName() debug--------------官方库 start-------------- com.google.android.material:material:1.8.0 androidx.appcompat:appcompat:1.5.0 org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10...省略部分org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.1 androidx.arch.core:core-runtime:2.1.0 org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.1 --------------官方库 end-------------- --------------三方库 start-------------- com.squareup.okhttp3:okhttp:4.10.0 com.squareup.retrofit2:retrofit:2.9.0 com.squareup.okio:okio:3.0.0 com.squareup.okio:okio-jvm:3.0.0 --------------三方库 end--------------ok在独立项目中自定义插件把所有的依赖区分并打印出来的效果就实现了。 8、总结 我们先是介绍了Gradle插件然后以最基本的写法上手然后又介绍了Plugin扩展的实现和用法最后以一个小例子介绍了Plugin在独立项目中的编写、发布和供外部使用的过程。 总体而言难度一般但是也有一些小细节需要注意比如对Gradle生命周期的掌握、使用插件的流程等。 9、最后 有朋友反馈之前的文章虽然都写的很棒但是篇幅有点长不是很好消化。。 虽然但是Gradle的东西确实很多后面会酌情精简一些。 写作不易感谢支持~ 10、GitHub https://github.com/yechaoa/GradleX 11、相关文档 Developing Custom Gradle PluginsGradle Plugin Development PluginUsing Gradle Plugins【Gradle-4】Gradle的生命周期【Gradle-7】Gradle构建核心之Task指南

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/89698.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站运营做内容做网页要多少钱

本文为非全局websocket,只在单页面创建连接。适用于在线聊天对话等业务。若有需要全局websocket(一打开app/小程序就自动连接,关闭则断开),请参考:微信小程序全局websocket。或将本文的实现移至App.vue中即可本文示例较为简易,若生产业务线上使用,需额外优化稳定性即异…

做qq空间的网站安装字体怎么在wordpress

一、set/multiset容器 1. set基本概念 简介:所有元素都会在插入时自动被排序 本质:set/multiset属于关联式容器,底层结构是用二叉树实现的 set和multiset的区别:set不允许容器中有重复的元素,multiset允许容器中有…

自己做的网站怎么放到网上去网站建设使用情况

下载安装克魔助手 摘要 本文介绍了如何下载安装克魔助手工具,以及注册和登录流程。通过简单的步骤,用户可以轻松获取并使用该工具,为后续的手机应用管理操作做好准备。 引言 克魔助手是一款免费的手机管理工具,通过该工具用户…

网站备案号 信息女生网站开发

1. 静态Web服务器是什么? 可以为发出请求的浏览器提供静态文档的程序。 平时我们浏览百度新闻数据的时候,每天的新闻数据都会发生变化,那访问的这个页面就是动态的,而我们开发的是静态的,页面的数据不会发生变化。 …

怎么用自己的网站做邮箱广东建筑人才网招聘信息网

目录 1.对真实值类别编码:2.预测值:3.目标函数要求:4.使用Softmax模型将输出置信度Oi计算转换为输出匹配概率y^i:5.使用交叉熵作为损失函数:6.代码实现: 1.对真实值类别编码: y为真实值&#xf…

自学做网站多长时间如何做网站的逻辑结构图

插: 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 坚持不懈,越努力越幸运,大家一起学习鸭~~~ 3妹:好冷啊, 冻得瑟瑟发抖啦 2…

自己怎么做机构网站网站项目怎么做计划

随着科技的进步,电脑已经深入到我们的日常生活和工作中。而在这个数字时代,录制屏幕内容变得日益重要。无论是制作教程、分享游戏技巧,还是记录重要的演示,录屏都是一个不可或缺的功能。可是电脑怎么录屏呢?本文将深入…

做网站标题图片大小互联网域名是什么意思

Thinkpad笔记本重装系统时无法UEFI启动进入PE怎么办?近日,有用户想要在Thinkpad笔记本中重装操作系统,但是发现无法UEFI启动并进入PE系统。如果想要通过PE进行Thinkpad笔记本系统重装操作的话,那么应该如何解决上述的问题呢?下面&#xff0…

网站导航栏的设计与实现天涯论坛发帖推广

JavaScript的事件循环是一种执行模型,它允许JavaScript引擎执行异步任务,尽管JavaScript是单线程的。这个模型确保了即使在执行长时间运行的操作(如从服务器获取数据)时,JavaScript代码也能保持响应性。事件循环和回调…

建网站的公司广州自适应企业架构

1.将Exchange Server 2010服务器加入域。 2.在“开始”菜单上,依次导航到“所有程序”>“附件”>“Windows PowerShell”。打开提升的 Windows PowerShell 控制台并运行以下命令: Import-Module ServerManager 3.使用 Add-WindowsFeature cmdlet 安…

长治网站制作浏览器推广怎么做

不知从何开始Redis的内存淘汰策略也开始被人问及,卷!真的是太卷了。难不成要我们去阅读Redis源码吗,其实问题的答案,在Redis中的配置文件中全有,不需要你阅读源码、这个东西就是个老八股,估计问这个东西是想…

网站右键禁止网络工程师自学难吗

更新对象的部分输入参数 代码 def update_state(self, **kwargs):# 更新指定的状态参数,保持其他参数不变for key, value in kwargs.items():if hasattr(self, key):setattr(self, key, value)怎么理解解释 用于更新对象的状态参数。这个方法使用了关键字参数&am…

网站生成静态慢原因建设银行档案管理网站

1. 什么是幂等性? 幂等性是指在分布式系统中,一个操作多次执行的结果与其执行一次的结果相同。设计具有幂等性的分布式系统可以有效避免数据不一致和重复处理的问题。 幂等系统的应用场景 在微服务架构下,由于分布式天然特性的时序问题, 以…

中小企业为什么要建网站oppo软件商店安装

前言 在上一篇文章中,我解释了如何以及为什么在Java代码中使用enums而不是switch/case控制结构。 在这里,我将展示如何扩展现有enums功能。 介绍 Java enum是一种编译器魔术。 在字节码中,任何enum都表示为扩展抽象类java.lang.Enum并具有几…

工信部网站备案流程网站管理强化阵地建设

基础面试题 什么是AOF AOF(Append-Only File)用于将Redis服务器收到的写操作追加到日志文件,通过该机制可以保证服务器重启后依然可以依靠日志文件恢复数据。 它的工作过程大抵分为以下几步: 收到客户端的写入命令(例如SET、DE…

建设网站需要的资金清单咨询公司的成本费用有哪些

一、前言 最近将推流程序完善了很多功能,尤其是增加了对多种流媒体服务程序的支持,目前支持mediamtx、LiveQing、EasyDarwin、nginx-rtmp、ZLMediaKit、srs、ABLMediaServer等,其中经过大量的对比测试,个人比较建议使用mediamtx和…

响应式网站怎么样深圳市手机网站建设企业

覆盖索引:查询使用了索引,并且需要返回的列,在索引里面都可以找到,减少select*的使用 1、using index condition Extra 为using index condition 表明查找使用了索引,但是需要回表查询(也就是先二级索引&…

建设网站的一般过程中信建设有限责任公司 电话

导言 生成式 AI 正在改变企业的运作方式,并加快创新的步伐。总体而言,人工智能正在改变企业利用技术的方式。生成式 AI 技术包括微调和部署大型语言模型(LLM),并允许开发人员访问这些模型以执行提示和对话。负责在 Kub…

怎样用电脑做网站四川网站营销seo什么价格

文中首先解释了加密解密的一些基础知识和概念,然后通过一个加密通信过程的例子说明了加密算法的作用,以及数字证书的出现所起的作用。接着对数字证书做一个详细的解释,并讨论一下windows中数字证书的管理,最后演示使用makecert生成…

WordPress插件Discuz企业网站seo模板

看网上的 win R 然后终端输入什么删除的,照做了都没有删掉 有火绒的可以试试: 拖进去就删掉了 很好使