前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java热更新

Java热更新

原创
作者头像
jemuelmiao
发布于 2019-12-02 16:04:56
发布于 2019-12-02 16:04:56
1.8K00
代码可运行
举报
文章被收录于专栏:SunSun
运行总次数:0
代码可运行

1. 背景

最近参与开发一个java项目,每次修改调试时就需要重启进程,由于工程较大,进程初始化任务较多,重启较慢,严重影响了开发效率,因此花了点时间研究java热更新机制,在项目中引入热更新后,每次的修改可以立即看到结果,提高了开发效率。

本文会先简单介绍热更新需要使用到的技术:代理、动态字节码修改,然后分别讨论开源热更新工具SpringLoaded和商用热更新工具Jrebel的使用,最后总结下自己破解最新版Jrebel的方式。

2. JavaAgent

JavaAgent是java程序代理,可以在程序启动或运行时插入自定义代码执行指定操作,根据代理时机分为启动时代理和运行时代理,经常被用于字节码修正。

2.1 启动时代理

该特性是在JDK1.5之后引入,在启动程序时通过javaagent参数指定代理类,代理类需要实现静态函数premain,该函数会在main函数前执行,premain函数有两种定义方式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static void premain(String args, Instrumentation inst);
public static void premain(String args);

JVM首先尝试调用前者,如果没有实现,则尝试调用后者。

启动代理简单实现如下:

  • 启动类
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.tencent;
public class App {
    public static void main( String[] args ) {
        System.out.println("main");
    }
}
  • 代理类
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.tencent;
public class Agent {
    public static void premain(String args, Instrumentation inst) {
        System.out.println("premain");
    }
}
  • 配置manifest

在代理类所在jar包的manifest中指定代理类,Premain-Class: com.tencent.Agent。如果项目是通过maven构建,可配置maven-jar-plugin插件参数,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<configuration>
   <archive>
      <manifestEntries>
         <Premain-Class>com.tencent.Agent</Premain-Class>
      </manifestEntries>
   </archive>
</configuration>
  • 运行

java -javaagent:agent-1.0-SNAPSHOT.jar -cp ./* com.tencent.App

2.2 运行时代理

该特性是在JDK1.6之后引入,在程序启动后通过加载代理类并运行静态函数agentmain执行代码,agentmain函数有两种定义方式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static void agentmain(String args, Instrumentation inst);
public static void agentmain(String args);

JVM首先尝试调用前者,如果没有实现,则尝试调用后者。

运行时代理简单实现

  • 加载代理类
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import com.sun.tools.attach.VirtualMachine;
public class Server {
    public static void main( String[] args ) {
       String pid = 目标进程pid;
       VirtualMachine vm = VirtualMachine.attach(pid);
       vm.loadAgent("path/to/agent jar");
       vm.detach();
    }
}
  • 代理类
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Agent {
    public static void agentmain(String args, Instrumentation inst) {
        System.out.println("agentmain");
    }
}

一般情况,会启动两个进程,一个是目标进程,用于运行代理类,一个是加载进程,用于等待指令加载代理类。

  • 配置manifest

配置与启动代理类似,Premain-Class改为Agent-Class。

3. Instrument

Instrument技术可以实时修改字节码,使得在不改变原程序的基础上,增加监控等辅助功能,甚至可以修改原程序的类定义等。目前Java字节码生成框架主要有:ASM、Javassist、Byte Buddy。以下使用Javassist实现简单耗时统计。

  • 启动类
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.tencent;
public class App {
   public static void main( String[] args ) {
       try {
          App app = new App();
          app.fun();
          Thread.sleep(500);
       } catch (Exception e) {
          System.out.println(e);
       }        
   }
   public static void fun() {
       Thread.sleep(1000);
   }
}
  • 代理类
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.tencent;
public class Agent {
    public static void premain(String args, Instrumentation inst) {
        inst.addTransformer(new TimeTransformer());
    }
}
  • 字节码修改类
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class TimeTransformer implements ClassFileTransformer {
    @Override
    public byte[] transform(ClassLoader loader,
                            String className,
                            Class<?> classBeingRedefined,
                            ProtectionDomain protectionDomain,
                            byte[] classfileBuffer)
        throws IllegalClassFormatException {
        if (!className.replace("/", ".").equals("com.tencent.App")) {
            return null;
        }
        try {
            ClassPool classPool = ClassPool.getDefault();
            CtClass ctClass = classPool.get("com.tencent.App");
            CtMethod[] methods = ctClass.getDeclaredMethods();
            for (CtMethod orgMethod : methods) {
                String orgMethodName = orgMethod.getName();
                String newMethodName = orgMethodName + "New";
                orgMethod.setName(newMethodName);
                CtMethod newMethod = CtNewMethod.copy(orgMethod, orgMethodName, ctClass, null);
                StringBuilder body = new StringBuilder();
                body.append("{\n");
                body.append("long startTime = System.currentTimeMillis();\n");
                body.append(newMethodName + "($$);\n");
                body.append("long endTime = System.currentTimeMillis();\n");
                body.append("System.out.println(\"[" + orgMethodName + "]:\" + " + "(endTime-startTime) + " + "\"ms\");\n");
                body.append("}\n");
                newMethod.setBody(body.toString());
                ctClass.addMethod(newMethod);
            }
            return ctClass.toBytecode();
        } catch (Exception e) {
            System.out.println(e.toString());
        }
        return null;
    }
}

TimeTransformer实现在com.tencent.App类中使用原方法名生成新方法,在新方法中调用原方法,并在调用前后加上时间统计,以此计算函数耗时。

  • 配置manifest

需要配置Can-Retransform-Classes: true

  • 运行

需要加入javassist依赖包。

4. Java热更新

目前Java热更新主要有三种方式:

  • 定义不同的ClassLoader,当监听到文件变化后,通过新的ClassLoader加载新文件,已有对象的状态需要更新,如果有类的相关依赖还需要手动设置。
  • 通过instrument技术修改字节码,代理class的加载过程。典型的有SpringLoaded、Jrebel框架。
  • 修改JVM支持Class动态加载。

方式1实现简单,但当项目复杂时,需要手动维护的状态更新较多。方式2一般以代理参数形式接入应用,对原应用无需做任何修改,下面介绍的SpringLoaded和Jrebel均采用这种方式进行热更新。方式3并非官方提供,通用性值得考虑。

5. SpringLoaded

Springloaded是一款开源的java热更新工具,可以直接监测jar包变化,能够实时增删改方法、属性。

5.1 简单使用

  • 启动类
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class App {
    public static void main( String[] args ) {
        Hot hot = new Hot();
        while (true) {
            hot.run();
            try {
                Thread.sleep(1000);
            } catch (Exception e) {
            }
        }
    }
}
  • 业务类
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//修改前
public class Hot {
    public void run() {
        System.out.println("run");
    }
}

//修改后
public class Hot {
    public void run() {
        System.out.println("run");
        extra();
    }
    public void extra() {
        System.out.println("extra");
    }
}

此处我将启动类、业务类分别编译为app-1.0-SNAPSHOT.jar、utils-1.0-SNAPSHOT.jar,后者包含经常需要改动的逻辑,修改后重新打包,替换原jar包可看到实时变化。

5.2 运行

java -javaagent:/path/to/springloaded-1.2.9.jar -noverify -cp ./* -Dspringloaded=watchJars=utils-1.0-SNAPSHOT.jar com.tencent.App

参数说明:

javaagent:指定springloaded的jar包所在路径。

watchJars:需要监听变化的jar包,监听多个jar使用:进行分隔。

创建demo使用SpringLoaded时可以正常使用,但我在项目中加入SpringLoaded时,会有很多报错,看日志是很多type无法注册,使用的是最新版1.2.6,因此实际未选择该开源工具。

6. Jrebel

Jrebel是一款商用的热更新工具,收费标准是每年550刀,通过监听指定目录中class文件的变化进行热更新,能够实时增删改方法、属性。

6.1 Jrebel热更新原理

原理说明:

定义一个类C如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class C extends X {
	int y = 5;
	int method1(int x) {
		return x + y;
	}
}

初始启动程序时,jrebel通过instrument技术修改类定义,在方法调用中插入代理层,代理层将请求路由到具体实现上,路由规则为始终选择当前系统中最新版本的实现,插入代理如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class C extends X {
	int y = 5;
	int method1(int x) {
		Object[] o = new Object[1];
		o[0] = x;
		return Runtime.redirect(this, o, "C", "method1", "(I)I");
	}
}

程序启动加载的类C的初始实现版本如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public abstract class C0 {
	public static int method1(C c, int x) {
		int tmp1 = Runtime.getFieldValue(c, "C", "y", "I");
		return x + tmp1;
	}
}

当类C的定义修改为如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class C {
	int y = 5;
	int z() {
		return 10;
	}
	int method1(int x) {
		return x + y + z();
	}
	...
}

下次系统使用类C时,jrebel检测到类定义发生变化,会重新加载类的实现版本,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class C1 {
	public static int z(C c) {
		return 10;
	}
	public static int method1(C c, int x) {
		int tmp1 = Runtime.getFieldValue(c, "C", "y", "I");
		int tmp2 = Runtime.redirect(c, null, "C", "z", "(V)I");
		return x + tmp1 + tmp2;
	}
	...
}

由于代理规则始终选择最新版本的实现进行路由,因此会执行新逻辑。

6.2 Jrebel使用

  • 下载jrebel

下载地址:https://jrebel.com/software/jrebel/download/prev-releases/,本文采用最新版2019.1.1。

  • 注册jrebel

注册地址:https://jrebel.com/software/jrebel/trial/,注册后会获得license key,该license免费试用10天。

  • 激活jrebel

解压jrebel,运行activate-gui.cmd或activate-gui.sh,选择Activation code,输入license key,激活后当前用户目录下会生成.jrebel文件夹,文件夹下包含许可证jrebel.lic,配置文件jrebel.prefs。

  • 启动

java -Drebel.dirs=/path/to/classes/dir -Drebel.log=true -agentpath:/path/to/jrebel/lib/libjrebel64.so -noverify -cp ...

参数说明:

rebel.dirs:jrebel监听的class文件目录,初始时将要监听的jar包解压到此目录,需要修改时,将修改后的jar包覆盖解压到此目录。

agentpath:指定官网下载的jrebel压缩包中的liejrebel64.so路径,热更时需要用到压缩包中的其他文件,如jrebel.jar,需要保持该压缩包的完整性。

6.3 Jrebel破解

我在项目开发中加入Jrebel试用下来还是很不错,大部分情况下都可以热更新,在开发中确实可以节省不少时间,但每年550刀的收费标准还是略高了,于是我花了一点时间大概研究了一下jrebel关于license的反编译代码,总结了下最新版(2019.1.1)破解方式如下。

Jrebel的jar包是经过jar的混淆技术处理过的,反编译后很难重新编译成功,因此如果需要更改jar包的话只能直接修改class文件的字节码,然后重新打包。

Jrebel试用版许可证控制流程:

当使用试用版许可证时,默认使用期限为10天,使用日期相关配置会存储在jrebel.prefs中,程序运行时会根据jrebel.prefs中配置来判断许可证的有效性,在保证许可证不变的情况下,最简单的破解办法是定期删除jrebel.prefs并重建。当然此文并没有采用这种方式,而是通过修改字节码破解。

6.3.1 签名校验破解

许可证对应的数据结构定义在com/zeroturnaround/licensing/UserLicense.class中,主要包含两部分:注册信息和签名,其中注册信息我们可以通过反序列化查看,大概信息如下(具体含义可自行研究):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{lastName=miao, GeneratedBy=AUTO, Email=741785694@qq.com, Organization=tc, enterprise=true, Product=JRebel, GeneratedOn=Tue Apr 23 14:39:17 CST 2019, validFrom=Tue Apr 23 14:39:17 CST 2019, OrderId=, limitedFrom=Tue Apr 23 14:39:17 CST 2019, version=1.27, Name=jemuel miao, Seats=1, uid=543971cc72a8e62a983010e17564daaec6ca2e26, firstName=jemuel, Type=evaluation, validUntil=Wed Apr 22 14:39:17 CST 2020, override=false, limitedUntil=Wed Apr 22 14:39:17 CST 2020, validDays=10}

因为没有加密秘钥,所以签名没法伪造,只能通过改代码直接绕过签名校验。签名校验入口在com/zeroturnaround/oc.class中,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class oc {
    ...
    public static boolean a(eca var0, UserLicense var1) {
        eed var2 = new eed(new dpw());
        var2.a(false, var0);
        var2.a(var1.getLicense(), 0, var1.getLicense().length);
        return var2.a(var1.getSignature());
    }
}

由上面反编译的代码可以看出只需要该函数返回true即可跳过签名校验,有两种方式:

  • 修改oc.class,将逻辑改为return true,对应字节码为04 AC。
  • 修改eed.class,将eed.class中return false全改为return true。

为了保证字节码长度不变,此处我选择修改eed.class,本文采用dirtyJOE作为字节码修改工具。

当函数名称被混淆后,可以根据函数签名进行识别,选中函数后双击进入编辑字节码界面

找到所有03 AC的地方修改为04 AC。至此,签名校验已绕过。

6.3.2 许可证日期破解

许可证日期设置入口在com/zeroturnaround/kl.class中,读取日期存在两种情况:不存在jrebel.prefs配置文件和存在jrebel.prefs配置文件。

  • 不存在jrebel.prefs配置文件
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private static Object[] a() {
        try {
            HashMap var0 = new HashMap();
            GregorianCalendar var1 = new GregorianCalendar();
            Date var2 = (Date)var1.getTime().clone();
            Date var3 = (Date)var1.getTime().clone();
            var1.add(6, 10);
            Date var4 = (Date)var1.getTime().clone();
            MessageDigest var5 = MessageDigest.getInstance("SHA-1");
            var5.update(a((Serializable)var2));
            byte[] var6 = var5.digest();
            var0.put("start-date", var2);
            var0.put("digest", var6);
            byte[] var7 = a((Serializable)var0);
            return new Object[]{abt.a(var7), var3, var4};
        } catch (NoSuchAlgorithmException var8) {
            throw new RuntimeException("Problem initializing JRebel diff file", var8);
        }
    }
  • 存在jrebel.prefs配置文件
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private static Object[] a(String var0) {
        try {
            byte[] var1 = abt.a(var0);
            ObjectInputStream var2 = new ObjectInputStream(new ByteArrayInputStream(var1));
            Map var3 = (Map)var2.readObject();
            Date var4 = (Date)var3.get("start-date");
            byte[] var5 = (byte[])var3.get("digest");
            MessageDigest var6 = MessageDigest.getInstance("SHA-1");
            var6.update(a((Serializable)var4));
            byte[] var7 = var6.digest();
            GregorianCalendar var8 = new GregorianCalendar();
            var8.setTime(var4);
            Date var9 = (Date)var8.getTime().clone();
            var8.add(10, 240);
            Date var10 = (Date)var8.getTime().clone();
            return new Object[]{MessageDigest.isEqual(var5, var7), var9, var10};
        } catch (NoSuchAlgorithmException var11) {
        } catch (IOException var12) {
        } catch (ClassNotFoundException var13) {
        }
        return new Object[]{Boolean.FALSE, null, null};
    }

由上面反编译的代码可以看出两个函数中的关键代码var1.add(6, 10)和var8.add(10, 240),都是将起始日期加上10天作为终止日期,因此只需将上面数值调整下即可突破有效期的限制。

将10 0A修改为10 7F,将11 00 F0修改为11 7F FF。至此,日期限制已突破。

6.3.3 验证

修改完所有class文件后,使用新的class文件替换原jrebel.jar中的旧文件,然后重新打jar包:jar -cvfm jrebel.jar META-INF/MANIFEST.MF ./*

启动进程,可以看到破解效果:

破解前

破解后

参考文献:

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
Camtasia2023最新版本免费汉化更新教程
coco玛奇朵这里给大家分享的是Camtasia Studio2023软件,Camtasia Studio一是款专业录制电脑屏幕的软件。我最近在百度上搜索寻找安装Camtasia Studio最新版本,需要付费,不然只能试用,很懊恼!!!于是,我找遍了各大网站终于找到出路了,找到一版本可以免费Camtasia Studio可以汉化后使用,不影响所有功能。这个我可是耗费了一周的时间哟!本来都想放弃了。现在给需要用的朋友们分享一下!
用户7442547
2022/12/04
2.7K0
Camtasia2023电脑屏幕录制与视频剪辑软件
Camtasia软件2023最新版是一款电脑屏幕录制与视频剪辑的软件,功能强大且操作简单。可以使用该软件对视频进行添加滚动字幕的效果,并且还可以选择注释标注的样式、主题以及形状等。在内置的视频编辑器中对视频进行剪辑时还可以拖放文本、添加效果、添加过渡等操作。剪辑结束后可以一键导出视频,支持的多种格式和视频分辨率的选择(如图1所示)。
用户7442547
2022/11/23
2.3K0
专业游戏录屏 Camtasia 2023强悍来袭,Camtasia 2023软件安装激活教程
CamtasiaStudio2023是一款非常不错的游戏录屏软件。总的来说CamtasiaStudio的功能从专业度来说,分别有:录制桌面,录制视频教程,录制音频;剪截视频,拼接合成视频,制作小视频Camtasia Studio是TechSmith的屏幕动作专用工具,可以在任何颜色模式下轻松记录屏幕动作,包括图像、声音、鼠标移动轨迹和旁白。 它还提供实时播放和编辑压缩功能,用于剪切视频剪辑和添加过渡效果。 它以许多常见格式输出,包括MP4、AVI、WMV、M4V、CAMV、MOV、RM和GIF动画,是创建视频演示的良好工具。
用户9208731
2023/05/04
3.4K0
专业游戏录屏 Camtasia 2023强悍来袭,Camtasia 2023软件安装激活教程
Camtasia2023笔记本屏幕录制录像捕获软件使用教程
在Mac或Windows上有各种可用的视频记录和编辑软件,其中Camtasia被称为视频记录器和视频编辑器。录屏软件Camtasia2023到底有什么特色功能?本文将帮助您选择理想的选择来开始视频捕获,创建和编辑。Camtasia2023是Mac/win平台上一款使用非常简单的屏幕录制和编辑软件。Camtasia2023版不仅能够为用户进行桌面屏幕的录制,在录制完成后还可以进行视频后期剪辑,添加字幕,视频效果和文字,总而言之,Camtasia是一款非常优秀的屏幕录像软件。
用户7442547
2023/02/11
1.4K0
最新版本Camtasia2023电脑屏幕录像编辑软件下载
Camtasia 2023是TechSmith出品的一款屏幕录像和编辑的软件,可轻松录制和分享高质量的截屏视频,提供所需的工具和功能。功能强大的视频编辑器,通过记录您的屏幕活动和网络摄像头流,帮助您创建具有专业外观的截屏视频。软件提供了强大的屏幕录像、视频的剪辑和编辑、视频菜单制作、视频剧场和视频播放功能等,它能在任何颜色模式下轻松地记录屏幕动作,包括影像、音效、鼠标移动的轨迹,解说声音等等,另外,它还具有及时播放和编辑压缩的功能,可对视频片段进行剪接、添加转场效果。
用户7442547
2023/02/02
8180
Camtasia2023软件下载及最新版功能介绍
作为一个自媒体人,每天都要录制编辑视频,选择一个好的视频编辑工具就是大家首先面临的一个难题,选择一个好工具,可以起到事半功倍的效果,大大提高工作效率。
用户7442547
2022/12/03
7700
Camtasia Studio2022专业版屏幕录像编辑软件套装
Camtasia Studio 是一款专门录制屏幕动作的工具,它能在任何颜色模式下轻松地记录 屏幕动作,包括影像、音效、鼠标移动轨迹、解说声音等等,另外,它还具有即时播放和编 辑压缩的功能,可对视频片段进行剪接、添加转场效果。
用户7442547
2022/06/14
1.9K0
Camtasia Studio2023专业版电脑屏幕录像软件
Camtasia Studio2023是专业的屏幕录像和视频编辑软件。可以在任何颜色模式下轻松记录屏幕动作,包括图像、音效、鼠标移动轨迹、解释声音等。此外,它还具有即时播放和编辑压缩功能,可以剪接视频短片,增加过渡效果。它输出了许多文档格式,包括Flash(SWF/FLV),AVI,WMV,M4V,CAMV,MOV,RM,GIF动画等常见格式是制作视频演示的绝佳工具。该软件集成了视频录制、编辑、导出等一系列功能,支持鼠标光标样式、草绘示意插图、冰冻区域等实用的功能,还具有移动客户端让你录制视频,然后通过无线传输到Camtasia中进行编辑,如果你正在找一款电脑上的屏幕录像软件,那么Camtasia绝对是第一选择!
用户7442547
2022/11/05
9470
Camtasia Studio 2023最新录屏软件详细功能介绍
Camtasia Studio 2023是一款专门录制屏幕动作的工具,它能在任何颜色模式下轻松地记录 屏幕动作,包括影像、音效、鼠标移动轨迹、解说声音等等,另外,它还具有即时播放和编 辑压缩的功能,可对视频片段进行剪接、添加转场效果。 让您用更短的时间创作更多的视频。Camtasia 2023版本带来了焕然一新的软件主界面、更加简化的视频导出流程,让我们的创作更加高效,新增加的混合模式、动画光标等功能也能让我们创作的视频拥有全新的视觉体验
用户9208731
2023/04/26
1.2K0
Camtasia Studio 2023最新录屏软件详细功能介绍
Camtasia2023简体中文试用版喀秋莎录屏工具
教学、演示、培训视频轻松制作!Camtasia非常容易学习 你不需要一个大的预算或花哨的视频编辑技能。只需录制屏幕并添加一些特效即可。无论您是有经验还是这是第一次制作视频 Camtasia都会为您提供制作高质量视频所需的一切。创建观看者实际观看的内容。视频将为您提供更多的互动 并帮助受众学习更多内容 比仅通过文本更加生动。
用户7442547
2022/11/21
1.1K0
Camtasia 2023新功能添加了新的视觉效果、滤镜和其他重大改进
总部位于密歇根州的 TechSmith 推出了Camtasia 2023,这是其适用于 Mac 和 Windows 的专业屏幕录制和视频编辑工具的重要新版本。
用户9208731
2023/05/06
6640
Camtasia 2023新功能添加了新的视觉效果、滤镜和其他重大改进
Camtasia Studio2023最新电脑版录屏软件下载
如果你需要制作视频教程、游戏直播或其他视频内容,那么一个好的录屏软件就是必不可少的。Camtasia Studio是非常好用的录屏软件,它们可以记录计算机屏幕上发生的所有活动,并可捕捉声音。这些软件还提供了一些视频编辑功能,如裁剪、剪辑、加工、添加字幕等等,帮助用户制作出更加专业的视频内容。Camtasia 2023是专门用于屏幕录制和视频编辑的软件,一方面可以通过它来录制屏幕、摄像头等,另一方面可以实时进行视频编辑,对录制的视频进行音效、转场、字幕等方面的操作。而且它的功能设置很全面,操作比较简单,小白上手也很快。
用户7442547
2023/03/27
3630
Camtasia2023新版功能介绍及离线安装教程
TechSmith Camtasia Studio2023免费的屏幕录像视频编辑软件,最专业的电脑屏幕录制及编辑软件!这款专业录屏与视频创作大型软件包含屏幕录像、视频编辑、视频菜单制作、视频录音配音、视频发布等系列强大功能。
用户7442547
2022/12/11
9410
Camtasia Studio2023最新版本详细官方功能介绍
Camtasia专业的 屏幕录制和视频剪辑软件3000多万专业人士在全球范围内使用Camtasia展示产品,教授课程,培训他人,以更快的速度和更吸引人的方式进行沟通和屏幕分享。使您在Windows和Mac上进行录屏和剪辑创作专业外观的视频变得更为简单。
用户7442547
2023/04/26
1.1K0
Camtasia2022新增10项功能介绍
Camtasia2022终于带着它的10项新功能来了!从Camtasia2018的初露锋芒,到Camtasia2019、2020的不断进步,再到Camtasia2021的惊艳众人,Camtasia凭借愈发强大的功能收获了一大批忠实用户和如潮好评,已成为屏幕录制必备软件,高效的帮助无数用户轻松录制网络课程、游戏视频,完成了视频创作的梦想!
用户7442547
2022/06/13
6210
最新Camtasia 2022免费版电脑录屏工具
Camtasia 2022是一款集屏幕录制与视频编辑为一体的工具。创建具有专业外观的软件演示、产品教程、在线课程和录制的演示文稿的首选视频解决方案 - 无需视频体验。预建的视频模板可帮助您轻松创建所需的视频。录制屏幕、导入 PowerPoint 演示文稿或添加已有的视频片段。
用户7442547
2022/06/09
1.7K0
Camtasia Studio2023全新版本新功能介绍
CamtasiaStudio2023是一款非常不错的软件。总的来说CamtasiaStudio的功能从专业度来说,分别有:录制桌面,录制视频教程,录制音频;剪截视频,拼接合成视频,制作小视频Camtasia Studio是TechSmith的屏幕动作专用工具,可以在任何颜色模式下轻松记录屏幕动作,包括图像、声音、鼠标移动轨迹和旁白。 它还提供实时播放和编辑压缩功能,用于剪切视频剪辑和添加过渡效果。 它以许多常见格式输出,包括MP4、AVI、WMV、M4V、CAMV、MOV、RM和GIF动画,是创建视频演示的良好工具。
用户7442547
2022/11/24
1.1K0
TechSmith Camtasia2022电脑屏幕录屏软件使用教程
TechSmith Camtasia是一款功能十分专业并且实用的屏幕录像工具。这款软件提供了强大的屏幕录像、视频剪辑编辑、视频菜单制作、视频剧场和视频播放功能等一系列视频编辑功能,让你可以非常轻松的进行屏幕内容录制,然后在对其进行编辑。除了能录制之外,还提供视频编辑处理功能,可对你所录制的视频片段进行剪接、缩放、音频处理、画中画、添加转场特效等操作,你也可以加入各种特效或者添加标题、注释,让你的视频更显专业性,制作出专属于自己的作品,而且它支持的文件格式也是非常多,有常用的AVI及GIF格式,还有RM、WMV及MOV等格式。并可将电影文件打包成 EXE文件,在没有播放器的机器上也可以进行播放,同时还附带一个功能强大的屏幕动画抓取工具,内置一个简单的媒体播放器。
用户7442547
2022/09/25
1.7K0
Camtasia中文最新2023电脑屏幕录制编辑工具
作为一个自媒体人,每天都要录制编辑视频,选择一个好的视频编辑工具就是大家首先面临的一个难题,选择一个好工具,可以起到事半功倍的效果,大大提高工作效率。视频编辑非常多,今天给大家推荐的是一款功能强大、又容易上手的软件,它就是Camtasia 2023。
用户7442547
2023/04/20
1.1K0
Camtasia2022mac全新版电脑录屏软件
又到了Camtasia推出新品的时候,每次更新它都能给我们带来意料之外的惊喜,这款软件既是我们的老朋友,又是每次都有新改变的新朋友。
用户7442547
2022/06/26
7250
推荐阅读
相关推荐
Camtasia2023最新版本免费汉化更新教程
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档