process 类 java_编写可执行jar——java的Process类的使用(二)

你知道怎么在控制台使用ping吗?那你知道怎么在java中使用ping吗?

1.批处理文件

批处理文件大家一定不陌生。接触最多的应该就是tomcat中的start.bat或者start.sh了。bat是在windows环境下运行的批处理文件,sh则是linux的shell脚本。

2.adb指令

安卓刷机的小伙伴们肯定对adb不陌生吧?为了使用adb,我们先安装一个夜神模拟器。比如我安装在C:\Program Files\Nox\bin,那么我们先打开cmd,并且cd到C:\Program Files\Nox\bin目录中。adb指令列表可以看https://www.yeshen.com/faqs/H15tDZ6YW。我们先启动夜神模拟器。

AAffA0nNPuCLAAAAAElFTkSuQmCC

启动完成后

AAffA0nNPuCLAAAAAElFTkSuQmCC

我们此时在控制台输入adb devices查看启动的夜神模拟器列表

AAffA0nNPuCLAAAAAElFTkSuQmCC

可以看到已经启动了一个模拟器,占用了62001的端口。

3.Process类

如何在java中执行上述的指令呢?java中有一个类叫做Process,用于执行shell之类的指令,而且可以获得控制台的输出内容。public class App {

public static void main(String...args)throws Exception{

//执行指令

Process process = Runtime.getRuntime().exec("adb devices");

System.out.println("【控制台执行信息】");

System.out.println(readInputstream(process.getInputStream()));

System.out.println("【控制台错误信息】");

System.out.println(readInputstream(process.getErrorStream()));

}

/**

* 读取控制台打印的文字

* @param in

* @return

* @throws Exception

*/

public static String readInputstream(InputStream in) throws Exception{

InputStream inputStream = in;

InputStreamReader inputStreamReader = new InputStreamReader(inputStream);

BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

StringBuilder sb = new StringBuilder();

String line = null;

while((line=bufferedReader.readLine())!=null){

sb.append(line).append("\n");

}

return sb.toString();

}

}

执行结果如下

AAffA0nNPuCLAAAAAElFTkSuQmCC

这是因为在程序入口下找不到adb.exe这个文件。我们只要把【adb】换成【C:\Program Files\Nox\bin\adb】就可以了。

执行结果如下

AAffA0nNPuCLAAAAAElFTkSuQmCC

还有一种执行指令的方式就比上述的方式更加简单了。

下面要讲的是ProcessBuilder这个类。我们将main函数修改成以下样子public static void main(String...args)throws Exception{

//执行指令

//        Process process = Runtime.getRuntime().exec("C:\\Program Files\\Nox\\bin\\adb devices");

//此处利用ProcessBuilder的command方法,

//值得注意的是command方法支持可变参数,

//也可以使用List,只要按指令空格分开好每个指令项就OK

Process process = new ProcessBuilder().command("C:\\Program Files\\Nox\\bin\\adb","devices").start();

System.out.println("【控制台执行信息】");

System.out.println(readInputstream(process.getInputStream()));

System.out.println("【控制台错误信息】");

System.out.println(readInputstream(process.getErrorStream()));

}

执行结果也是一样的。接下来我们也建一个Builder。

4.编写指令词典

可以看到,adb指令实在太多了。作为一个java程序员,是没必要去记住这些东西的,因为实际上我们并不常用这个东西。所以我们只好建一个指令词典了。指令词典的demo如下(我使用了lombok插件,自动生成Getter方法,不知道的同志们,请百度搜一下):package com.zeemoo.nox.actuator.consts;

import lombok.Getter;

/**

* 夜神模拟器的adb指令词典

*

* @author zhang.shushan

* @date 2018/6/8

*/

@Getter

public class NoxCmdDict {

/**

* adb脚本指令

*/

public final static String ADB = "adb";

/**

* 选择模拟器

*/

public final static String SERVER_HOST = "-s";

/**

* 模拟器列表

*/

public final static String DEVICES = "devices";

/**

* 安装apk

*/

public final static String INSTALL = "install";

/**

* 从电脑发送文件到模拟器,没什么卵用,还有权限限制

*/

@Deprecated

public final static String PUSH = "push";

/**

* 从模拟器拉取文件到电脑,没什么卵用,还有权限限制

*/

@Deprecated

public final static String PULL = "pull";

/**

* 卸载app

*/

public final static String UNINSTALL = "uninstall";

/**

* shell脚本指令,安卓内核为linux

*/

public final static String SHELL = "shell";

/**

* 列举进程

*/

public final static String SHELL_PS = "ps";

/**

* 包含某个字符串的进程信息

*/

public final static String SHELL_PS_MTH_FIND_STR ="|findStr";

/**

* 包指令

*/

public final static String SHELL_PM = "pm";

/**

* 包指令下的列举指令

*/

public final static String SHELL_PM_LIST = "list";

/**

* 包指令下的列举指令选项,表示列举所有的包名

*/

public final static String SHELL_PM_LIST_PACKAGES = "packages";

/**

* 包指令下的列举指令选项的附加选项,表示列举所有的包名和对应的路径

*/

public final static String SHELL_PM_LIST_PACKAGES_OP_NAME_AND_PATH = "-f";

/**

* 获取某个应用的路径,需要填写包名

*/

public final static String SHELL_PM_PATH = "path";

/**

* 清除应用缓存,后面接包名

*/

public final static String SHELL_PM_CLEAR_TEMP = "clear";

/**

* 应用管理指令(Activity Manager),启动或关闭应用

*/

public final static String SHELL_AM = "am";

/**

* 启动应用,最后接上包名+“/”+Activity类名

*/

public final static String SHELL_AM_START = "start";

/**

* 这个选项表示如果应用启动了就直接打开后台进程,如果没启动则启动。

* 不加此选项每次调用start的时候则每次都重启应用

*/

public final static String SHELL_AM_START_OP_XSTART = "-n";

/**

* 关闭应用,后接包名

*/

public final static String SHELL_AM_STOP = "force-stop";

/**

* 杀死进程,后接包名,似乎没什么用

*/

public final static String SHELL_AM_KILL = "kill";

/**

* 杀死后台所有进程,似乎没什么用

*/

public final static String SHELL_AM_KILL_ALL = "kill-all";

/**

* shell模拟输入

*/

public final static String SHELL_INPUT = "input";

/**

* 模拟输入文字(不支持中文)

*/

public final static String SHELL_INPUT_TEXT = "text";

/**

* 模拟点击按键

*/

public final static String SHELL_INPUT_KEYEVENT = "keyevent";

/**

* 模拟鼠标点击,后面接X,Y

*/

public final static String SHELL_INPUT_TAP = "tap";

/**

* 模拟鼠标滑动,后面接X1,Y1,X2,Y2

*/

public final static String SHELL_INPUT_SWIPE = "swipe";

/**

* 截屏

*/

public final static String SHELL_SCREEN_CAP = "screencap";

/**

* 截屏选项,后接截屏文件输出目标

*/

public final static String SHELL_SCREEN_CAP_OP_DEST = "-p";

/**

* 退出shell

*/

public final static String SHELL_EXIT = "exit";

/**

* 夜神模拟器的adb

*/

public final static String NOX_ADB = "nox_adb";

/**

* 夜神模拟器属性设置

*/

public final static String NOX_ADB_SHELL_SET_PROP = "setprop";

/**

* 设置手机的纬度

*/

public final static String NOX_ADB_SHELL_SET_PROP_LATITUDE = "persist.nox.gps.latitude";

/**

* 设置模拟器的经度

*/

public final static String NOX_ADB_SHELL_SET_PROP_LONGITUDE = "persist.nox.gps.longitude";

/**

* 设置模拟器的mac地址

*/

public final static String NOX_ADB_SHELL_SET_PROP_MAC = "setprop persist.nox.wifimac";

}

现在来创建一个Builder类,代码如下package com.zeemoo.nox.actuator.service;

import lombok.AllArgsConstructor;

import lombok.NoArgsConstructor;

import lombok.Setter;

import java.io.File;

import java.util.ArrayList;

import java.util.List;

//此处使用静态引入指令词典,可以试着删去这一行,看看有什么区别

import static com.zeemoo.nox.actuator.consts.NoxCmdDict.*;

/**

* 功能指令构建

*

* @author zhang.shushan

* @date 2018/6/8

*/

@Setter

@AllArgsConstructor

@NoArgsConstructor

public class NoxCmdBuilder {

/**

* 夜神模拟器的根目录

*/

private String noxPath;

/**

* 给指令添加指定模拟器

* @param cmds

* @param host

* @return

*/

public List addHost(List cmds,String host){

if(host!=null&&"".equals(host)){

cmds.add(1, SERVER_HOST);

cmds.add(2,host);

}

return cmds;

}

/**

* 筛选字符进程

* @param example

* @return

*/

public List listProcess(String example){

List cmds=listPackageName();

cmds.add(SHELL_PS_MTH_FIND_STR);

cmds.add(example);

return cmds;

}

/**

* 列举所有的进程

* @return

*/

public List listProcess(){

List cmds = this.shellModal();

cmds.add(SHELL_PS);

return cmds;

}

/**

* 列举所有模拟器

* @return

*/

public List devices(){

List cmds = new ArrayList<>();

cmds.add(noxPath+File.separator+ NOX_ADB);

cmds.add(DEVICES);

return cmds;

}

/**

* 启动夜神模拟器

* @return

*/

public String startNox(){

return noxPath+File.separator+"nox.exe";

}

/**

* 截屏

* @param vitualBoxFilePath

* @return

*/

public List screenCap(String vitualBoxFilePath){

List cmds = new ArrayList<>();

cmds.add(SHELL_SCREEN_CAP);

cmds.add(SHELL_SCREEN_CAP_OP_DEST);

cmds.add(vitualBoxFilePath);

return cmds;

}

/**

* 模拟滑动屏幕

* @param x1

* @param y1

* @param x2

* @param y2

* @return

*/

public List swipe(int x1,int y1,int x2,int y2){

List cmds = this.inputModal();

cmds.add(SHELL_INPUT_SWIPE);

cmds.add(String.valueOf(x1));

cmds.add(String.valueOf(y1));

cmds.add(String.valueOf(x2));

cmds.add(String.valueOf(y2));

return cmds;

}

/**

* 模拟点击

* @param x

* @param y

* @return

*/

public List click(int x,int y){

List cmds = this.inputModal();

cmds.add(SHELL_INPUT_TAP);

cmds.add(String.valueOf(x));

cmds.add(String.valueOf(y));

return cmds;

}

/**

* 模拟按键

* @param keys 按键

* @return

*/

public List pressKey(List keys){

List cmds = this.inputModal();

cmds.add(SHELL_INPUT_KEYEVENT);

cmds.addAll(keys);

return cmds;

}

/**

* 文本输入,不支持中文

* @param text

* @return

*/

public List inputText(String text){

List cmds = this.inputModal();

cmds.add(SHELL_INPUT_TEXT);

cmds.add(text);

return cmds;

}

/**

* 输入模式

* @return

*/

private List inputModal() {

List cmds = this.shellModal();

cmds.add(SHELL_INPUT);

return cmds;

}

/**

* 杀死后台所有进程

* @return

*/

public List killAllAppProcess(){

List cmds = this.activityManager();

cmds.add(SHELL_AM_KILL_ALL);

return cmds;

}

/**

* 杀死某个后台进程

* @param pkgNm

* @return

*/

public List killAppProcess(String pkgNm){

List cmds = this.activityManager();

cmds.add(SHELL_AM_KILL);

cmds.add(pkgNm);

return cmds;

}

/**

* 停止app

* @param pkgName

* @return

*/

public List stopApp(String pkgName){

List cmds = this.activityManager();

cmds.add(SHELL_AM_STOP);

cmds.add(pkgName);

return cmds;

}

/**

* 启动app

* @param pkgName

* @param activity

* @return

*/

public List startApp(String pkgName,String activity){

List cmds = this.activityManager();

cmds.add(SHELL_AM_START);

cmds.add(SHELL_AM_START_OP_XSTART);

cmds.add(pkgName+"/"+activity);

return cmds;

}

/**

* 获取某个应用的路径

* @param pkgName

* @return

*/

public List getAppPath(String pkgName){

List cmds = this.packageManager();

cmds.add(SHELL_PM_PATH);

cmds.add(pkgName);

return cmds;

}

/**

*

* @return

*/

public List listPackageNameAndPath(){

List cmds = this.listPackageName();

cmds.add(SHELL_PM_LIST_PACKAGES_OP_NAME_AND_PATH);

return cmds;

}

/**

* 列举所有的包名

* @return

*/

public List listPackageName(){

List cmds=this.packageManager();

cmds.add(SHELL_PM_LIST);

cmds.add(SHELL_PM_LIST_PACKAGES);

return cmds;

}

/**

* 包操作指令

* @return

*/

private List packageManager(){

List cmds = this.shellModal();

cmds.add(SHELL_PM);

return cmds;

}

/**

* activityManager模式

* @return

*/

private List activityManager(){

List cmds = this.shellModal();

cmds.add(SHELL_AM);

return cmds;

}

/**

* 从模拟器拉取文件到电脑,有权限限制

* @param virtualBoxFilePath

* @param pcFilePath

* @return

*/

@Deprecated

public List pull(String virtualBoxFilePath,String pcFilePath){

List cmds = new ArrayList<>();

cmds.add(noxPath+File.separator+virtualBoxFilePath);

cmds.add(PULL);

cmds.add(virtualBoxFilePath);

cmds.add(pcFilePath);

return cmds;

}

/**

* 推送文件到模拟器,有权限限制

* @param pcFilePath

* @param vitualBoxFilePath

* @return

*/

@Deprecated

public List push(String pcFilePath,String vitualBoxFilePath){

List cmds = new ArrayList<>();

cmds.add(noxPath+ File.separator+ NOX_ADB);

cmds.add(PUSH);

cmds.add(pcFilePath);

cmds.add(vitualBoxFilePath);

return cmds;

}

/**

* 卸载app

* @param packageName

* @return

*/

public List uninstall(String packageName){

List cmds = new ArrayList<>();

cmds.add(noxPath+ File.separator+ NOX_ADB);

cmds.add(UNINSTALL);

cmds.add(packageName);

return cmds;

}

/**

* 安装app

* @param apkPath

* @return

*/

public List install(String apkPath){

List cmds = new ArrayList<>();

cmds.add(noxPath+ File.separator+ NOX_ADB);

cmds.add(INSTALL);

cmds.add(apkPath);

return cmds;

}

/**

* 设置mac地址

* @param mac

* @return

*/

public List setMac(String mac){

List cmds = this.shellModal();

cmds.add(NOX_ADB_SHELL_SET_PROP);

cmds.add(NOX_ADB_SHELL_SET_PROP_MAC);

cmds.add(mac);

return cmds;

}

/**

* 设置经度

* @param longitude

* @return

*/

public List setLongitude(Double longitude){

List cmds = this.shellModal();

cmds.add(NOX_ADB_SHELL_SET_PROP);

cmds.add(NOX_ADB_SHELL_SET_PROP_LONGITUDE);

cmds.add(longitude.toString());

return cmds;

}

/**

* 设置模拟器纬度

* @param latitude

* @return

*/

public List setLatitude(Double latitude){

List cmds = this.shellModal();

cmds.add(NOX_ADB_SHELL_SET_PROP);

cmds.add(NOX_ADB_SHELL_SET_PROP_LATITUDE);

cmds.add(latitude.toString());

return cmds;

}

/**

* shell模式,设置模拟器属性之类的

* @return

*/

private List shellModal(){

List cmds = new ArrayList<>();

cmds.add(noxPath+ File.separator+ NOX_ADB);

cmds.add(SHELL);

return cmds;

}

/**

* shell模式,清除缓存

* @return

*/

public List clearTemp(String pckName) {

List cmds = this.shellModal();

cmds.add(SHELL_PM_CLEAR_TEMP);

cmds.add(pckName);

return cmds;

}

}

我们来测试一下。修改main方法如下:public static void main(String...args)throws Exception{

NoxCmdBuilder noxCmdBuilder = new NoxCmdBuilder("C:\\Program Files\\Nox\\bin");

System.out.println(noxCmdBuilder.listPackageName());

}

输出结果[C:\Program Files\Nox\bin\nox_adb, shell, pm, list, packages]

直接将这个list放入ProcessBuilder中使用,就可以获得所有的包名了。我们来试一下。修改main如下public static void main(String... args) throws Exception {

NoxCmdBuilder noxCmdBuilder = new NoxCmdBuilder("C:\\Program Files\\Nox\\bin");

Process start = new ProcessBuilder().command(noxCmdBuilder.listPackageName()).start();

//此处注意的是,读取流信息的时候,有可能流对象太大,

//不能一次性读完,导致获取的字符串顺序错乱或缺失的问题,

//所以我们等程序执行完毕之后再去读取

//waitFor会让线程阻塞,直至process执行完毕

start.waitFor();

System.out.println(readInputstream(start.getInputStream()));

}

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

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

相关文章

2782: [HNOI2006]最短母串

2782: [HNOI2006]最短母串 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 3 Solved: 2[Submit][Status][Web Board]Description 给定n个字符串&#xff08;S1,S2,„,Sn&#xff09;&#xff0c;要求找到一个最短的字符串T&#xff0c;使得这n个字符串&#xff08;S1,S2,„,…

c java 内部类_java程序中能否在内部类当中再定义一个内部类?

展开全部我被你的想62616964757a686964616fe78988e69d8331333363386664法震撼了,哈哈.亏你想的出来...这么弄代码不好理解,Java看起来醒目,也是Java中的一个规范!可以吗?必须可以..看代码演示...声明下,我也第一次,多次嵌套,看你想法后去试验下是可行的我用的两种办法!不多说看…

数据库分区分表以及读写分离

谈谈怎么实现Oracle数据库分区表 Oracle数据库分区是作为Oracle数据库性能优化的一种重要的手段和方法&#xff0c;做手头的项目以前&#xff0c;只聆听过分区的大名&#xff0c;感觉特神秘&#xff0c;看见某某高手在讨论会上夸夸其谈时&#xff0c;真是骂自己学艺不精&#x…

JSP Workshop

http://www.cnblogs.com/ITtangtang/p/4126395.html 发现http://www.tutorialspoint.com/里的资料很全也很不错啊&#xff01; 资料&#xff1a;http://www.tutorialspoint.com/jsp/jsp_tutorial.pdf 另外&#xff0c;http://www.runoob.com/jsp/jsp-tutorial.html 中关于JSP…

h5页面不可 移动_H5营销|为什么H5适合于微信营销

随着互联网技术的不断发展&#xff0c;更新在移动互联网时代&#xff0c;网络营销也开始越来越新颖化&#xff0c;而微信H5就是其中的佼佼者。它的出现满足了用户视觉上的审美要求&#xff0c;并且可以使营销方式变得更加的美观整洁&#xff0c;那么这里就有一个问题。为什么微…

亚太地区数学建模优秀论文_数学建模美赛强势来袭!

01美赛&#xff0c;即美国大学生数学建模竞赛(MCM/ICM)又要来啦&#xff01;赛题内容涉及经济、管理、环境、资源、生态、医学、安全、未来科技等众多领域。竞赛要求三人(本科生)为一组&#xff0c;在四天时间内&#xff0c;就指定的问题完成从建立模型、求解、验证到论文撰写的…

《软件调试》读书笔记:第13章 硬错误和蓝屏

会话管理器进程SMSS.exe是系统启动后的第一个用户态进程&#xff0c;负责启动和监护windows子系统进程&#xff1a;CSRSS.exe和登陆管理进程&#xff1a;WinLogonSMSS.exe从注册表中查询子系统exe文件的位置&#xff0c;并且启动它 CSRSS是windows子系统进程&#xff0c;自NT4以…

信息安全技术网络安全等级保护定级指南_行业标准 |报业网络安全等级保护定级参考指南V2.0发布,明确保护对象、定级要求...

近期&#xff0c;中国新闻技术工作者联合会正式发布《报业网络安全等级保护定级参考指南V2.0》。该指南由中国新闻技术工作者联合会组织网络安全领域的专家、报业技术专家以及业务专家经过多次调研、学习、探讨后&#xff0c;在原《报业网络安全等级保护定级参考指南V1.0》的基…

数学作图工具_科研论文作图系列-从PPT到AI (一)

导语&#xff1a;之前的推送中&#xff0c;小编给大家介绍过几款科研作图软件&#xff0c;包括统计分析软件Origin和Prism&#xff0c;图像处理软件ImageJ等等。从本期开始&#xff0c;小编将和大家一起继续学习科研论文作图。重点介绍图像的处理和排版&#xff0c;用到的工具主…

优启通怎么重装系统win10_重装系统失败?小编教你安全给神舟战神GX9 Pro重装win10系统方法...

神舟战神GX9 Pro 上市于2016年1月&#xff0c;虽然现在已经停产&#xff0c;但是还是有不少用户依旧十分喜爱这款笔记本。这款笔记本的性能完全对得起它的售价&#xff0c;很多用户都反馈其比外星人电脑要好。对于爱玩游戏的用户而言&#xff0c;对它17.3英寸的显示屏简直欲罢不…

20135202闫佳歆--week 8 实验:理解进程调度时机跟踪分析进程调度与进程切换的过程--实验及总结...

week 8 实验&#xff1a;理解进程调度时机跟踪分析进程调度与进程切换的过程 1.环境搭建&#xff1a; rm menu -rf git clone https://github.com/megnning/menu.git cd menu ls make rootfs qemu -kernel ../linux-3.18.6/arch/x86/boot/bzImage -initrd ../rootfs.img -s -S …

java jni技术_JNI技术简介

JNI(Java Native Interface)提供一种Java字节码调用C/C的解决方案&#xff0c;JNI描述的是一种技术。NDK(Native Development Kit)Android NDK 是一组允许您将 C 或 C(“原生代码”)嵌入到 Android 应用中的工具&#xff0c;NDK描述的是工具集。 能够在 Android 应用中使用原生…

java web redis_java web redis使用(二)

上篇中已经安装好redis&#xff0c;然后下面就说怎么在java web中用客户端来使用regis使用jedis java客户端一&#xff1a;一个简单的示例代码:public static void main(String[] args) {Jedis jedis new Jedis( "147.151.240.234" , 6379 );jedis.set("foo&…

mysql 主从_搭建mysql主从并编写监控主从状态脚本

要求&#xff1a;两台centos7虚拟机分为主和从安装mysqlyum -y install mysql mysql-server关闭防火墙service iptables stopsetenforce 0上面的主从都做。修改主的配置文件vi /etc/my.cnf#添加server-id1log-binmysqlbinrelay-logrelays之后保存退出重启mysql服务service …

Java核心技术点之动态代理

本篇博文会从代理的概念出发&#xff0c;介绍Java中动态代理技术的使用&#xff0c;并进一步探索它的实现原理。由于个人水平有限&#xff0c;叙述中难免出现不清晰或是不准确的地方&#xff0c;希望大家可以指正&#xff0c;谢谢大家&#xff1a;&#xff09; 一、概述 1. 什么…

shell入门之expr的使用

在expr中加减乘除的使用&#xff0c;脚本例如以下&#xff1a; #!/bin/sh #a test about expr v1expr 5 6 echo "$v1" echo expr 3 5 echo expr 6 / 2 echo expr 9 \* 5 echo expr 9 - 6 执行效果 转载于:https://www.cnblogs.com/bhlsheji/p/5401458.html

java中子线程与主线程通信_Android笔记(三十二) Android中线程之间的通信(四)主线程给子线程发送消息...

之前的例子都是我们在子线程(WorkerThread)当中处理并发送消息&#xff0c;然后在主线程(UI线程)中获取消息并修改UI&#xff0c;那么可以不可以在由主线程发送消息&#xff0c;子线程接收呢&#xff1f;我们按照之前的思路写一下代码&#xff1a;packagecn.lixyz.handlertest;…

java开源笔记软件下载_开发常用软件笔记 - ZhaoQian's Blog - OSCHINA - 中文开源技术交流社区...

notepad使用快捷键CtrlH打开“替换对话框”&#xff0c;在每行的开头添加内容。 勾选左下角的“正则表达式”选项 在“查找目标”里输入上尖号“^”&#xff0c;上尖号代表每行的开头 在“替换为”里输入“private String”。然后点"全部替换"按钮&#xff0c;这样每…

极光推送指定用户推送_App用户都睡着了?是时候用推送和活动唤醒一波了!

想要运营好一款App&#xff0c;引流、留存、促活三大环节必不可少。引流解决了用户来的问题&#xff0c;留存解决了用户留下来的问题&#xff0c;而促活解决的是让一部分新注册用户以及许久没有动静的老用户&#xff0c;在平台中再次活跃起来。今天&#xff0c;我们就来聊聊关于…

oracle awr报告生成_分享AWR报告的生成和简单分析方法

生成AWR报告方法&#xff1a;第一步&#xff1a;数据库压力测试卡开始时&#xff1a;生成第一个快照&#xff1a;Sql>exec dbms_workload_repository.create_snapshot();第二步&#xff1a;数据库压力测试结束时&#xff1a;生成第二个快照Sql>exec dbms_workload_reposi…