Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >音视频开发之旅(63) -Lottie 源码分析之动画与绘制

音视频开发之旅(63) -Lottie 源码分析之动画与绘制

原创
作者头像
音视频开发之旅
发布于 2022-01-16 00:18:50
发布于 2022-01-16 00:18:50
96700
代码可运行
举报
运行总次数:0
代码可运行

目录

  1. 动画和绘制的流程
  2. LayerView树
  3. ShapeLayer的分析
  4. Lottie优劣以及rLottie、PAG的介绍
  5. 资料
  6. 收获

上一篇我们学习分析了Lottie的json解析部分. 这篇我们分析的动画和渲染部分。

分析的重点:如何组织多图层layer的关系,控制先后处理不同图层的绘制以及动画。

一、动画和绘制的流程

我们通过入口API函数(LottieDrawable#setComposition、LottieDrawable#playAnimation)来进行分析。

1.1 LottieDrawable#setComposition 流程

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public boolean setComposition(LottieComposition composition) {

    //......
    clearComposition();
    this.composition = composition;
    //构建图层layer compositionlayer它的作用有点先andoid View树中ViewGroup,可以包含其他的View和ViewGroup
    //完成CompositionLayer和ContentGroup的初始化 主要是两个里面TransformKeyframeAnimation
    buildCompositionLayer();  
  
    //触发notifyUpdate,进而触发个Layer的progress的重新计算以及draw的回调(当然此时进度为0,各种判断之后也不会触发composition的drawlayer)
    animator.setComposition(composition);

    //设置当前动画的进度
    setProgress(animator.getAnimatedFraction());

   ......

   }

可以看到setComposition主要调用了buildCompositionLayer和 animator.setComposition来进行CompositionLayer和其他各Layer(json中对应的layers字段)以及 ContentGroup、TransformKeyframeAnimation等初始化。 Lottie动画中使用最多Layer是CompositionLayer、ShapeLayer以及ImageLayer。

思考:那么什么是ContentGroup、TransformKeyframeAnimation、他们和layer的关系是什么呐?(后面会尝试分析解答)

1.2 LottieDrawable#playAnimation 流程

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   1. LottieDrawable.playAnimation
   2. LottieValueAnimator.playAnimation
   3. LottieValueAnimator.setFrame
   4. BaseLottieAnimator.notifyUpdate
   5.然后触发回调(LottieDrawable.progressUpdateListener)AnimatorUpdateListener.onAnimationUpdate
   6. CompositionLayer.setProgress --》计算当前的progress,然后倒序设置每个图层进度 BaseLayer.setProgress
       6.1(transform.setProgress(progress))TransformKeyframeAnimation.setProgress 设置矩阵变换的进度(缩放、透明度、位移等)--》需要重点分析
       6.2  animations.get(i).setProgress(progress); 遍历设置每个animation的进度
   7. BaseKeyframeAnimation.notifyListeners 回调给监听者
   8. BaseLayer.onValueChanged (invalidateSelf())触发页面的重新绘制,--》即LottieDrawable.draw(android.graphics.Canvas, android.graphics.Matrix)
   9. compositionLayer.draw(canvas, matrix, alpha)  即 BaseLayer.draw --》这也是一个关键的方法
   10. drawLayer(canvas, matrix, alpha); 即 BaseLayer.drawLayer这个方法是抽象方法,各layer具体实现
         10.1 我们以ImageLayer为例来来看 (重点分析) ImageLayer.drawLayer 首先通过BaseKeyframeAnimation.getValue() 这个就用到前面动画改变的progress的值,根据差值器获取到当前的Bitmap
         10.2 然后使用canvas来进行绘制,完成图片的变换

LottieValueAnimator是ValueAnimator的子类,并且实现了Choreographer.FrameCallback接口。通过属性动画的进度变换回调以及VSYNC信号的doframe回调来通知Layer进行进度以及值计算,并且通知LottieDrawble进行重新绘制,从而实现json中layers也即各种Layer图层的动画和绘制。

而具体的绘制还是有Canvas来实现,可以通过ImageLayer的drawLayer

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void drawLayer(@NonNull Canvas canvas, Matrix parentMatrix, int parentAlpha) {
    Bitmap bitmap = getBitmap();
    if (bitmap == null || bitmap.isRecycled()) {
      return;
    }
    float density = Utils.dpScale();

    paint.setAlpha(parentAlpha);
    if (colorFilterAnimation != null) {
      paint.setColorFilter(colorFilterAnimation.getValue());
    }
    //将画布的当前状态保存
    canvas.save();
    //对matrix的变换应用到canvas上的所有对象
    canvas.concat(parentMatrix);
    //src用来设定要绘制bitmap的区域,即是否进行裁剪
    src.set(0, 0, bitmap.getWidth(), bitmap.getHeight());
    //dst用来设置在canvas画布上的显示区域。这里可以看到显示的宽高会根据像素密度进行等缩放
    dst.set(0, 0, (int) (bitmap.getWidth() * density), (int) (bitmap.getHeight() * density));
    //第一个Rect(src) 代表要绘制的bitmap 区域,可以对是对图片进行裁截,若是空null则显示整个图片。第二个 Rect(dst) 是图片在Canvas画布中显示的区域,即要将bitmap 绘制在屏幕的什么地方
   // 通过动态的改变dst,可以实现 移动、缩放等效果,以及根据屏幕的像素密度进行缩放,通过改变src 对绘制的图片需求做处理,也能够实现很多有趣的效果,比如 显示一部分,或者逐渐展开等
    canvas.drawBitmap(bitmap, src, dst, paint);
    //恢复之前保存的画布状态,和sava一一对应
    canvas.restore();
  }

至于ShapeLayer和CompositionLayer有些复杂,下面我们会单独来分析。

思考: 如果有多个图层,怎么保证多个图层之间的关联性(就像ViewTree一样,怎么管理他们之间的关系和绘制的顺序)。

二、LayerView树

Lottie中有各种Layer:

那么他们之间是什么关系呐?如何进行管理和层级控制呐?

CompositionLayer的构造

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  public CompositionLayer(LottieDrawable lottieDrawable, Layer layerModel, List<Layer> layerModels,
      LottieComposition composition) {

   //主要是TransformKeyframeAnimation的初始化
    super(lottieDrawable, layerModel);
LongSparseArray<BaseLayer> layerMap =
        new LongSparseArray<>(composition.getLayers().size());

    BaseLayer mattedLayer = null;
    //根据layers大小,倒序生产每个Layer
    for (int i = layerModels.size() - 1; i >= 0; i--) {
      Layer lm = layerModels.get(i);
      //这个是一个工程方法,根据layerType构造对应的Layer
      BaseLayer layer = BaseLayer.forModel(this, lm,   lottieDrawable, composition);
      if (layer == null) {
        continue;
      }
      layerMap.put(layer.getLayerModel().getId(), layer);
      ......
     }

    
    for (int i = 0; i < layerMap.size(); i++) {
      long key = layerMap.keyAt(i);
      BaseLayer layerView = layerMap.get(key);
      if (layerView == null) {
        continue;
      }
     // 确定layer之间的父子关系
      BaseLayer parentLayer =   layerMap.get(layerView.getLayerModel().getParentId());
      if (parentLayer != null) {
        layerView.setParentLayer(parentLayer);
      }
    }

}

工厂方法:BaseLayer#forModel

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
static BaseLayer forModel(
      CompositionLayer compositionLayer, Layer layerModel, LottieDrawable drawable, LottieComposition composition) {
    //对应json中 object->layers->ty
    switch (layerModel.getLayerType()) {
        //轮廓/形态图层  这个是再lottie动画中用的基本上是最多的类型
      case SHAPE:
        return new ShapeLayer(drawable, layerModel, compositionLayer);
        //合成图层,相当于ViewTree的ViewGroup的角色
      case PRE_COMP:
        return new CompositionLayer(drawable, layerModel,
            composition.getPrecomps(layerModel.getRefId()), composition);
        //填充图层
      case SOLID:
        return new SolidLayer(drawable, layerModel);
        //图片图层  这个也很常用,特别是做一些模版特效时
      case IMAGE:
        return new ImageLayer(drawable, layerModel);
        //空图层,可以作为其他图层的parent
      case NULL:
        return new NullLayer(drawable, layerModel);
        //文本图层
      case TEXT:
        return new TextLayer(drawable, layerModel);
      case UNKNOWN:
      default:
        // Do nothing
        Logger.warning("Unknown layer type " + layerModel.getLayerType());
        return null;
    }
  }

我们上面看到layerView.setParentLayer(parentLayer);那么这个ParentLayer有什么用呐? 主要在确定每个图层的边界和绘制时使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 // BaseLayer#buildParentLayerListIfNeeded
 //该方法会在确定当前图层边界getBounds以及绘制该图层的时候调用draw
  private void buildParentLayerListIfNeeded() {
    if (parentLayers != null) {
      return;
    }
    //如果该图层有父图层,则创新
    if (parentLayer == null) {
      parentLayers = Collections.emptyList();
      return;
    }

    //该图层的LayerViewTree
    parentLayers = new ArrayList<>();
    BaseLayer layer = parentLayer;
    //递归找到该图层的父图层、祖父图层、曾祖图层等等
    while (layer != null) {
      parentLayers.add(layer);
      layer = layer.parentLayer;
    }
  }

BaseLayer#getBounds

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public void getBounds(
      RectF outBounds, Matrix parentMatrix, boolean applyParents) {
    rect.set(0, 0, 0, 0);
    //确定该图层的LayerViewTree:parentLayers
    buildParentLayerListIfNeeded();
    //子图层的矩阵变换,以作用再父图层的矩阵变换为基础
    boundsMatrix.set(parentMatrix);

    if (applyParents) {
      //递归调用父图层额矩阵变换,进行矩阵相乘
      if (parentLayers != null) {
        for (int i = parentLayers.size() - 1; i >= 0; i--) {
          boundsMatrix.preConcat(parentLayers.get(i).transform.getMatrix());
        }
      } else if (parentLayer != null) {
        boundsMatrix.preConcat(parentLayer.transform.getMatrix());
      }
    }

    //最后再乘以当前图层的矩阵变换,以确定最终的边界矩阵
    boundsMatrix.preConcat(transform.getMatrix());
  }

BaseLayer#draw 和BaseLayer#getBounds一样的矩阵处理方式。

通过parentid确立该图层的LayerViewTree,再测量绘制时根据LayerView的确定自己的bound和draw。

三、ShapeLayer 的分析

之所以把ShapeLayer单独拎出来说,是因为他在lottie动画中很重要,通过 ShapeLayer是一个通过矢量图形而不是bitmap来绘制的图层子类。指定颜色和线宽等属性,用Path来定义要绘制的图形.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ShapeLayer extends BaseLayer {
  ......
  
 //这个ContentGroup是什么呐?可以看到ShapeLayer的drawLayer和getBound都是通过contentGroup代理的。
  private final ContentGroup contentGroup;
  

  ShapeLayer(LottieDrawable lottieDrawable, Layer layerModel, CompositionLayer compositionLayer) {
    ......
    //ContentGroup构造
    contentGroup = new ContentGroup(lottieDrawable, this, shapeGroup);
    contentGroup.setContents(Collections.<Content>emptyList(), Collections.<Content>emptyList());
  }

  @Override void drawLayer(@NonNull Canvas canvas, Matrix parentMatrix, int parentAlpha) {
    //调用了contentGroup的draw
    contentGroup.draw(canvas, parentMatrix, parentAlpha);
  }

  @Override public void getBounds(RectF outBounds, Matrix parentMatrix, boolean applyParents) {
    ......
    contentGroup.getBounds(outBounds, boundsMatrix, applyParents);
  }
  ......
}

ContentGroup是什么呐? 可以看到ShapeLayer的drawLayer和getBound都是通过contentGroup代理的。 我们看下ContentGroup的draw的实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void draw(Canvas canvas, Matrix parentMatrix, int parentAlpha){

    //遍历调用content,如果是DrawingContent则进行draw,那边什么是DrawingContent呐
    for (int i = contents.size() - 1; i >= 0; i--) {
      Object content = contents.get(i);
      if (content instanceof DrawingContent) {
        ((DrawingContent) content).draw(canvas, matrix, childAlpha);
      }
    }

}

遍历调用content,如果是DrawingContent则进行draw,哪些content是DrawingContent呐?

我们以FillContent为例,来看下其draw的实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void draw(Canvas canvas, Matrix parentMatrix, int parentAlpha) {
    ......
    //获取颜色 透明度等 设置画笔paint的颜色
    int color = ((ColorKeyframeAnimation) this.colorAnimation).getIntValue();
    int alpha = (int) ((parentAlpha / 255f * opacityAnimation.getValue() / 100f) * 255);
    paint.setColor((clamp(alpha, 0, 255) << 24) | (color & 0xFFFFFF));

    //设置colorFilter
    if (colorFilterAnimation != null) {
      paint.setColorFilter(colorFilterAnimation.getValue());
    }

    ......
    //设置path路径
    path.reset();
    for (int i = 0; i < paths.size(); i++) {
      path.addPath(paths.get(i).getPath(), parentMatrix);
    }

    //用cavas drawpath
    canvas.drawPath(path, paint);

  }

可以ShapeContent的DrawingContent也是通过Canvas来进行draw的。

Lottie的动画和渲染解析部分就到这里,关于BaseKeyframeAnimation主要实现Layer和DrawingContent中动画的插值计算,没有详细分析,有需要再看吧。

思考:能不能通过OpenGL ES来进行渲染绘制呐?

五、Lottie优劣以及和PAG的简单对比

Lottie的优劣

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
优点:
支持跨平台(虽然每个端各自实现一套)
性能好
可以通过配置下发“json和素材”进行更新。

不足点:
Lottie不支持交互和编辑
Lottie不支持压缩位图,如果使用png等位图,需要自行在tiny等压缩平台进行图片压缩、降低包体积。
Lottie存在mask、matters 时,需要先saveLayer,再调用drawLayer返回。
saveLayer是一个耗时的操作,需要先分配、绘制一个offscreen的缓冲区,这增加了渲染的时间

PAG的优劣简单介绍

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
PAG是腾讯昨天刚开源的动画组件,除lottie的优点外,
 支持更多AE特效,
 支持文本和序列帧,
 支持模版的编辑,
 采用二级值文件而不是json,文件大小和解析的性能都会更好些
 渲染层面:Lottie渲染层面的实现依赖平台端接口,不同平台可能会有所差异。PAG渲染层面使用C++实现,所有平台共享同一套实现,平台端只是封装接口调用,提供渲染环境,渲染效果一致。


PAG的不足,渲染基于google开源的skia 2d来实现。增加了包大小。4.0的版本会有改善,去掉skia 2d。自己实现简单的渲染封装(估计也是opengl或者metal 、vulkan)。

rlottie简单介绍

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[Samsung-rlottie](https://github.com/Samsung/rlottie)

rLottie 与 lottie 工作流一致,在 SDK 上实现不一样,rLottie 没有使用平台特定实现,是统一 C++实现,素材支持 lottie 的 json 文件,矢量渲染性能还不错,但缺少各平台封装,支持的 AE 特性不全,也不支持文本、序列帧等

这个还没有分析它的源码实现。抽时间可以分析学习下。

六、资料

  1. Lottie实现思路和源码分析
  2. Lottie 动画原理剖析
  3. 揭秘Lottie动画的优劣及原理
  4. lottie-android 框架使用及源码解析
  5. Lottie动画库 Android 端源码浅析
  6. 腾讯开源的PAG
  7. Samsung-rlottie
  8. 从解码渲染层面对比 PAG 与 lottie

七、收获

通过本篇的学习分析

  1. 梳理了lottie动画和渲染的流程
  2. LayerView树的概念和理解,搞清楚lottie是如何管理不同layer之间的关系的
  3. 重点分析了CompositionLayer、BaseLayer、ImageLayer和ShapeLayer,其中ShapeLayer又包含ContentGroup
  4. 简单对比了lottie、PAG、rlottie

感谢你的阅读 欢迎关注公众号“音视频开发之旅”,一起学习成长。 欢迎交流

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
小程序开发为什么要https和SSL证书呢?在哪里可以申请办理?
小程序开发为什么要https和SSL证书呢?在哪里可以申请办理?合信ssl证书可以一手办您申请办理好!
合信ssl证书
2019/07/11
1.5K0
揭开SSL的神秘面纱,了解如何用SSL保护数据
随着互联网的日益发展,对于用户共享的关键数据的威胁已经产生了严重的后果,人们在网络上交换地址、电话号码、信用卡号、企业机密等各种信息,网络上的恶意破坏者始终都在伺机窥探,企图窃取这些重要的信息。随着国家不断地宣传和普法,越来越多的人对于数据安全意识也在成倍的增长,如果您是网站所有者,那么保护您的用户的隐私信息和敏感数据避免受到网络犯罪分子的恶意攻击就成为您不可推卸的责任了。
埃文科技
2022/06/20
4310
简述https的几种加密方式
加密方式 常见的加密方式:对称加密和非对称加密。 对称加密算法和非对称加密算法只不过是密码学中的两种加密算法罢了,所谓的算法就是一种可以将信息从一种形式转变为另一种形式的规则。 对称加密 概念:对称密钥加密,又称为对称加密、私钥加密、共享秘钥加密,是密码学中的一类加密算法。这类算法在加密和解密时使用相同的密钥,或是使用两个可以简单地相互推算的密钥。 对称加密也可以理解为一方通过密钥将信息加密之后,把密文传给另一方,另一方通过这个相同的密钥将密文解密,转换成可以理解的明文。它们之间的关系如下: 明文<->密钥
田维常
2019/07/16
5.2K0
网站全站开启 HTTPS(一、又拍云一键部署)
2017-02-0111:11:26 发表评论 521℃热度 1.全站 HTTPS 趋势 2.专有名词介绍 3.网站申请证书 4.总结 目录 HTTPS(全称:HyperText Transfer Protocol over Secure Socket Layer),其实 HTTPS 并不是一个新鲜协议,Google 很早就开始启用了,初衷是为了保证数据安全。 近两年,Google、Apple、Facebook 等这样的互联网巨头,不谋而合地开始大力推行 HTTPS, 国外的大型互联网公司很多也都
timhbw
2018/05/03
1.5K0
网站HTTPS证书
作为拥抱数字化时代的重要一环,建设一个安全可靠的网站对于吸引访问者并保持用户信任至关重要。在这方面,HTTPS证书是不可或缺的工具。HTTPS(安全套接层传输协议)证书是由受信任的第三方CA机构颁发的一种数字证书。它通过加密通信数据并验证网站的身份来确保用户和网站之间的安全连接。因此,添加HTTPS证书可将您的网站从传统的HTTP协议转变为更安全、加密的HTTPS协议。
涂样丶
2023/11/28
5470
网站HTTPS证书
SSL数字证书如何选择适合自己的?https证书如何选择
域名验证(DV):这是最基本的验证级别,仅验证您对域名的所有权。它通常是价格最便宜的选项,并且适用于个人网站、博客或非商业网站。
网盾JoySSL小张
2023/08/18
4670
Https网站的应用场景是什么?
您经常在访问加密的网站,如建设银行的网银系统,https://ibsbjstar.ccb.com.cn 。加密网站最明显的标志是https,而不是http,你一定会好奇这些为什么网站需要加密?我们如何为网站进行加密?
希望的田野
2019/12/24
2K0
Https网站的应用场景是什么?
了解 SSL 证书类型,没有所谓的“品质”和“等级”之分
很多站长们很好奇为什么 SSL 证书有免费版的、有收费版的、有些收费版的价格非常的高昂,其实这主要是因为 SSL 证书的类型不同而已,确切的说只有三种不同的类型,分别是 DV SSL、OV SSL、EV SSL,不同的类型针对不同类型的网站域名和行业需求而定的。所以说 SSL 证书没有所谓的“品质”和“等级”之分,只有三种不同的类型。
明月登楼的博客
2019/05/15
7690
了解 SSL 证书类型,没有所谓的“品质”和“等级”之分
利用腾讯云轻量搭建属于自己的博客小程序
现在是QQ和微信内部流量的时代,如果你分享的链接可以在QQ和微信正常打开还好,但是如果变白或者变红那么就没有人愿意打开了,就像这样:
星橙
2021/09/09
4.3K0
利用腾讯云轻量搭建属于自己的博客小程序
https的原理「建议收藏」
  上过网的朋友都知道,网络是非常不安全的。尤其是公共场所很多免费的wifi,或许只是攻击者的一个诱饵。还有大家平时喜欢用的万能钥匙,等等。那我们平时上网可能会存在哪些风险呢?   1. 泄密,个人隐私、账户密码等信息可能会被盗取。   2. 篡改,收到的数据可能被第三方修改过,或被植入广告等。   3. 假冒,访问的站点非目标服务器站点。如域名欺骗、域名劫持、钓鱼网站等。
全栈程序员站长
2022/10/04
4740
https的原理「建议收藏」
Https证书是什么?为甚麽大家都在使用?
HTTPS证书是一种用于加密网站通信的数字证书,又称SSL证书。SSL证书就是遵守SSL协议的一种数字证书,由受信任的数字证书颁发机构CA,在验证服务器身份后颁发,具有服务器身份验证和数据传输加密功能。它类似于驾驶证、身份证,只不过它是对网站服务器进行验证。通过安装SSL证书,可以在客户端浏览器和网站服务器之间构建起一条加密通道,从而起到保护用户数据,提升网站安全的效果。
久荔
2023/10/09
2970
一文读懂SSL证书以及https对于网站安全的重要性
SSL证书是数字证书的一种,类似于驾驶证、护照和营业执照的电子副本。因为配置在服务器上,也称为SSL服务器证书。
追梦者
2019/01/22
1.4K0
一文读懂SSL证书以及https对于网站安全的重要性
为什么说网站一定要安装https证书呢?网站不安装https证书可以吗?
HTTPS【安全超文本传输协议】是HTTP协议的安全版本,该协议使用SSL / TLS协议 进行加密和身份验证。HTTPS协议使网站用户可以通过Internet安全地传输敏感数据,比如银行卡号密码等。 因此,HTTPS对于保护在线活动(例如购物,银行业务和远程工作)尤为重要。
网盾JoySSL小张
2023/08/14
6090
京汨:SSL证书常见问题概览
SSL证书就是遵守SSL安全套接层协议的服务器数字证书,而SSL安全协议最初是由美国网景Netscape Communication公司设计开发,全称为安全套接层协议(Secure Sockets Layer)。
京汨 Jingmis.com
2019/09/19
8450
京汨:SSL证书常见问题概览
【HTTPS】https证书详细解释
HTTPS证书,通常指的是SSL证书,是一种数字证书。它用于验证网站的身份并确保数据传输的安全。当网站部署了HTTPS证书后,其URL将以"https:/“开头,而不是"http:/”, 这表明网站启用了SSL/TLS加密层,能够对客户端与服务器之间的通信进行加密,防止数据在传输过程中被窃听、篡改或伪造。
杨我名
2024/03/27
2.4K0
【HTTPS】https证书详细解释
SSL证书是什么?SSL证书怎么申请?
  SSL证书是数字证书的一种,由权威数字证书机构(CA)验证网站身份后颁发,可实现浏览器和网站服务器数据传输加密。网站安装SSL证书后会在浏览器显示安全锁标志,数据传输协议从http(传统协议) 升级为 https(加密协议)。
安信SSL证书
2019/08/15
9.6K0
SSL证书是什么?SSL证书怎么申请?
网站https证书种类有哪些?有什么区别
  网站https证书可分为2大类,一类按照验证方式进行分类,即:DV SSL证书、OV SSL证书、EV SSL证书。另一类按照域名数量进行分类,即:单域名SSL证书、多域名SSL证书、通配符证书。
安信SSL证书
2019/07/31
5.7K0
网站https证书种类有哪些?有什么区别
SSL证书类型
图片 SSL证书具有服务器身份认证和数据加密传输的重要作用,在国家政策和各大主流浏览器的推动下,SSL证书早已成为我国网站的标配。但对于大部分企业来说,在建设网站时所面临的问题并不是要不要安装SSL
柳絮云泡泡
2023/03/08
2.4K0
SSL证书类型
如何选择保护网站安全的SSL证书?看完这篇,你才会选对!
在网络安全领域,SSL证书经常作为传输数据安全保护的重要措施被大家所看到,但是市面上的单域名证书、多域名证书、DV证书、OV证书等等傻傻分不清楚。今天梳理了2个表格对比,来跟大家详细讲一下。
做个网站就这么简单
2025/04/12
830
如何选择保护网站安全的SSL证书?看完这篇,你才会选对!
DNSPod十问崔久强:证书有效期缩短,CA机构要凉透?
本期嘉宾 崔久强 上海CA中心总经理 崔久强,上海市数字证书认证中心有限公司总经理、上海市静安区政协委员、第一届上海市智慧城市建设领军先锋、一带一路信息产业发展联盟数字签名专委会主任委员、中国电子认证产业联盟专委会委员、中国密码学会电子认证专委会理事、协同创新实验室主任、上海产业菁英高层次人才、虹口区拔尖人才,长期致力于电子认证、数字身份、区块链、数据安全和数字信任等领域的研究,曾获上海市科技进步三等奖、上海市科学技术奖一等奖、中国标准创新质量贡献奖,编制国家/行业/地方标准10项、国家发明专利20项,参
腾讯云DNSPod团队
2023/05/29
1.4K0
DNSPod十问崔久强:证书有效期缩短,CA机构要凉透?
推荐阅读
相关推荐
小程序开发为什么要https和SSL证书呢?在哪里可以申请办理?
更多 >
LV.1
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验