• Stars
    star
    718
  • Rank 61,437 (Top 2 %)
  • Language
    Java
  • Created about 4 years ago
  • Updated 10 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

用于项目测试,崩溃重启操作,崩溃记录日志【可以查看,分享】和重启【多种重启app方式】;网路拦截查看的工具小助手,拦截请求和响应数据,统计接口请求次数,流量消耗,以及统计网络链接/dns解析/request请求/respond响应等时间。提高开发效率……

目录介绍

  • 01.该库具有的功能
  • 02.崩溃收集模块
  • 03.网络分析模块
  • 04.ping库模块
  • 05.磁盘file模块
  • 06.卡顿监测模块
  • 07.如何使用该库
  • 08.其他待完善项

01.该库具有的功能

  • 最大特点
    • 入侵性低,你不用改动愿项目代码,几行代码设置即可使用这几个模块功能,已经用于多个实际项目中。如果觉得可以,麻烦star一下……
  • 功能齐全
    • 包括平常看到的卡顿分析,收集,监控;Anr模拟,监控和日志收集;崩溃拦截处理和日志界面展示;网络接口请求数据的收集和ping。以及超全的系列文档

1.1 崩溃收集模块

  • 崩溃模块
    • 崩溃重启操作,崩溃记录日志操作,崩溃日志列表支持查询,删除,查看详情,分享,保存文本,以及截图等操作。
  • 崩溃分析流程
    • 从崩溃流程分析,到拦截App崩溃,然后收集崩溃相关信息,记录到file文件,以及到UI界面展示。一体化来学习崩溃的系统化处理。

1.2 网络分析模块

  • 网络分析库模块
    • 网络流程分析,记录每个网络请求->响应数据,方便查看很全面的请求头信息,响应头信息,以及body实体。
  • ping库模块
    • 通过ping检测网络问题,帮助诊断,这个在Android中检查域名的诊断信息……
  • 查看网络时间和流量
    • 网络连接,dns解析,TLS连接,请求响应等时间差……都可以记录下来通过界面展示

1.3 卡顿监测模块

  • 支持fps查看帧率
    • 一键便可以开启查看页面的帧率。
  • 卡顿监控方案
    • LooperPrinter实现卡顿监控,卡顿之后的数据收集,
    • WatchDog卡顿监控,作为一种学习案例,理解它监控卡顿的原理。

1.4 ANR监测模块

02.崩溃收集模块

2.1 异常崩溃介绍

  • 低入侵性接入该lib,不会影响你的其他业务。
    • 暴露崩溃重启,以及支持开发者自己捕获crash数据的接口!能够收集崩溃中的日志写入文件,记录包括设备信息,进程信息,崩溃信息(Java崩溃、Native崩溃 or ANR),以及崩溃时内存信息到file文件中。支持用户获取崩溃列表,以及跳转崩溃日志详情页面,并且可以将崩溃日志分享,截长图,复制等操作。可以方便测试和产品给开发提出那种偶发性bug的定位日志,免得对于偶发行崩溃,开发总是不承认……开发总是不承认……

2.2 截图如下所示

image image image image

2.3崩溃后日志记录

image

2.4 崩溃流程图

image

03.网络分析模块

3.1 网络分析库模块

  • 如何拿来用
    • 既然Android中使用到facebook的stetho库,可以拦截手机请求请求,然后去Chrome浏览器,在浏览器地址栏输入:chrome://inspect 。即可查看请求信息。
    • 那么能不能把这个拿到的请求信息,放到集合中,然后在Android的页面中展示呢?这样方便开发和测试查看网络请求信息,以及请求流程中的消耗时间(比如dns解析时间,请求时间,响应时间,共耗时等等)
  • OkHttp如何进行各个请求环节的耗时统计呢?
    • OkHttp 版本提供了EventListener接口,可以让调用者接收一系列网络请求过程中的事件,例如DNS解析、TSL/SSL连接、Response接收等。
    • 通过继承此接口,调用者可以监视整个应用中网络请求次数、流量大小、耗时(比如dns解析时间,请求时间,响应时间等等)情况。因此统计耗时,需要致敬EventListener实现,照搬代码即可。
  • 如何消耗记录时间
    • 在OkHttp库中有一个EventListener类。该类是网络事件的侦听器。扩展这个类以监视应用程序的HTTP调用的数量、大小和持续时间。
    • 所有启动/连接/获取事件最终将接收到匹配的结束/释放事件,要么成功(非空参数),要么失败(非空可抛出)。
    • 比如,可以在开始链接记录时间;dns开始,结束等方法解析记录时间,可以计算dns的解析时间。

3.2 网络拦截库功能

  • 网络请求拦截
    • 记录每个页面网络请求的数据,保存在map中,方便查看网络请求的请求头,响应头,响应body
    • 针对获取的网络数据,记录网络状态,请求耗时,请求方式,完善了网络日志包括的绝大部分字段信息展示
  • 流量统计
    • 目前只是针对get,post网络请求以及上传流量统计,并且针对get和post比例展示,以及抓包数量统计
    • 后期完善比如glide加载图片消耗的流量统计
  • 网络消耗时间
    • 网络请求到完成耗时,dns消耗时间,连接消耗时间,TLS连接开始结束消耗时间,request请求消耗时间,response响应消耗时间等等
  • 设备信息
    • 获取手机设备信息,包括硬件厂商,版本,root,包名等信息
    • 获取本机wifi信息,主要是wifi的名称,mac地址,ip地址,dns信息,子网掩码等
    • 获取服务端信息,根据网络请求host,获取服务端ip,mac,是ipv4还是ipv6等,这个还在完善中
  • ping网络诊断
    • 致敬网易ping方案,应用于Android项目中,获取Android项目域名,拿到ping信息
  • 全局悬浮按钮
    • 为了方便查看每个activity页面的网络请求数据,因此在每个activity页面显示全局悬浮按钮,点击即可跳入查看数据页面
    • 这个一行代码设置即可,无任何耦合作用,低入侵

3.3 网络请求接口信息

3.4 案例截图如下

image image image image image

04.ping库模块

4.1 ping在Android的应用

  • 为了检查网络,在android上也可以通过ping来查看是否网络通。
  • 实现方案有哪些
    • 通过后台线程执行ping命令的方式模拟traceroute的过程,缺点就是模拟过程较慢,timeout的出现比较频繁
    • 通过编译开源网络检测库iputilsC代码的方式对traceroute进行了套接字发送ICMP报文模拟,可以明显提高检测速度

4.2 ping使用截图

image

05.磁盘file模块

5.1 项目背景说明

  • app展示在数据量多且刷新频繁的情况下,为提升用户体验,通常会对上次已有数据做内存缓存或磁盘缓存,以达到快速展示数据的目的。缓存的数据变化是否正确、缓存是否起到对应作用是QA需要重点测试的对象。
  • android缓存路径查看方法有哪些呢?将手机打开开发者模式并连接电脑,在pc控制台输入cd /data/data/目录,使用adb主要是方便测试(删除,查看,导出都比较麻烦)。
  • 如何简单快速,傻瓜式的查看缓存文件,操作缓存文件,那么该项目小工具就非常有必要呢!采用可视化界面读取缓存数据,方便操作,直观也简单。

5.2 沙盒作用

  • 可以通过该工具查看缓存文件
    • 快速查看data/data/包名目录下的缓存文件。
    • 快速查看/sdcard/Android/data/包名下存储文件。
  • 对缓存文件处理
    • 支持查看file文件列表数据,打开缓存文件查看数据详情。还可以删除缓存对应的文件或者文件夹,并且友好支持分享到外部。
    • 能够查看缓存文件修改的信息,修改的时间,缓存文件的大小,获取文件的路径等等。都是在可视化界面上处理。

5.3 设计目标

  • 可视化界面展示 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述
  • 多种处理文件操作
    • 针对file文件夹,或者file文件,长按可以出现弹窗,让测试选择是否删除文件。
    • 点击file文件夹,则拿到对应的文件列表,然后展示。点击file直到是具体文件(文本,图片,db,json等非file文件夹)跳转详情。
  • 一键接入该工具
    • FileExplorerActivity.startActivity(MainActivity.this);

07.如何使用该库

7.1 崩溃库

  • 如何引入该库
    //磁盘文件查看工具
    implementation 'com.github.yangchong211.YCAndroidTool:MonitorFileLib:1.2.8'
    //卡顿工具
    implementation 'com.github.yangchong211.YCAndroidTool:MonitorCatonLib:1.2.8'
    //网络工具
    implementation 'com.github.yangchong211.YCAndroidTool:MonitorNetLib:1.2.8'
    //崩溃工具
    implementation 'com.github.yangchong211.YCAndroidTool:MonitorCrashLib:1.2.8'
    //anr工具
    implementation 'com.github.yangchong211.YCAndroidTool:MonitorAnrLib:1.2.8'
  • 初始化代码如下所示。建议在Application中初始化……
    CrashHandler.getInstance().init(this, new CrashListener() {
        /**
         * 重启app
         */
        @Override
        public void againStartApp() {
            CrashToolUtils.reStartApp1(App.this,1000);
            //CrashToolUtils.reStartApp2(App.this,1000, MainActivity.class);
            //CrashToolUtils.reStartApp3(AppManager.getAppManager().currentActivity());
        }
    
        /**
         * 自定义上传crash,支持开发者上传自己捕获的crash数据
         * @param ex                        ex
         */
        @Override
        public void recordException(Throwable ex) {
            //自定义上传crash,支持开发者上传自己捕获的crash数据
            //StatService.recordException(getApplication(), ex);
        }
    });
  • 关于重启App的操作有三种方式api
    //开启一个新的服务KillSelfService,用来重启本APP【使用handler延迟】
    CrashToolUtils.reStartApp1(App.this,1000);
    //用来重启本APP[使用闹钟,整体重启,临时数据清空(推荐)]
    CrashToolUtils.reStartApp2(App.this,1000, MainActivity.class);
    //检索获取项目中LauncherActivity,然后设置该activity的flag和component启动app【推荐】
    CrashToolUtils.reStartApp3(AppManager.getAppManager().currentActivity());
  • 关于获取崩溃目录api
    //崩溃文件存储路径:/storage/emulated/0/Android/data/你的包名/cache/crashLogs
    //崩溃页面截图存储路径:/storage/emulated/0/Android/data/你的包名/cache/crashPics
    String crashLogPath = ToolFileUtils.getCrashLogPath(this);
    String crashPicPath = ToolFileUtils.getCrashPicPath(this);
  • 关于崩溃日志记录
    • 日志记录路径:/storage/emulated/0/Android/data/你的包名/cache/crashLogs
    • 日志文件命名:V1.0_2020-09-02_09:05:01_java.lang.NullPointerException.txt【版本+日期+异常】
  • 关于跳转错误日志list列表页面
    • 跳转日志列表页面如下所示,这里调用一行代码即可。点击该页面list条目即可进入详情
    CrashToolUtils.startCrashListActivity(this);
  • 那么如何获取所有崩溃日志的list呢。建议放到子线程中处理!!
    List<File> fileList = ToolFileUtils.getCrashFileList(this);
    
    //如果是要自己拿到这些文件,建议根据时间来排个序
    //排序
    Collections.sort(fileList, new Comparator<File>() {
        @Override
        public int compare(File file01, File file02) {
            try {
                //根据修改时间排序
                long lastModified01 = file01.lastModified();
                long lastModified02 = file02.lastModified();
                if (lastModified01 > lastModified02) {
                    return -1;
                } else {
                    return 1;
                }
            } catch (Exception e) {
                return 1;
            }
        }
    });
  • 如何删除单个文件操作
    //返回true表示删除成功
    boolean isDelete = ToolFileUtils.deleteFile(file.getPath());
  • 如何删除所有的文件。建议放到子线程中处理!!
    File fileCrash = new File(ToolFileUtils.getCrashLogPath(CrashListActivity.this));
    ToolFileUtils.deleteAllFiles(fileCrash);
  • 如何获取崩溃文件中的内容
    //获取内容
    String crashContent = ToolFileUtils.readFile2String(filePath);
  • 还有一些关于其他的api,如下。这个主要是方便测试同学或者产品,避免开发不承认那种偶发性崩溃bug……
    //拷贝文件,两个参数分别是源文件,还有目标文件
    boolean copy = ToolFileUtils.copyFile(srcFile, destFile);
    //分享文件。这个是调用原生的分享
    CrashLibUtils.shareFile(CrashDetailsActivity.this, destFile);
    //截图崩溃然后保存到相册。截图---> 创建截图存储文件路径---> 保存图片【图片质量,缩放比还有采样率压缩】
    final Bitmap bitmap = ScreenShotsUtils.measureSize(this,view);
    String crashPicPath = ToolFileUtils.getCrashPicPath(CrashDetailsActivity.this) + "/crash_pic_" + System.currentTimeMillis() + ".jpg";
    boolean saveBitmap = CrashLibUtils.saveBitmap(CrashDetailsActivity.this, bitmap, crashPicPath);
    
  • 异常恢复原理
    • 第一种方式,开启一个新的服务KillSelfService,用来重启本APP。
      CrashToolUtils.reStartApp1(App.this,1000);
    • 第二种方式,使用闹钟延时,然后重启app
      CrashToolUtils.reStartApp2(App.this,1000, MainActivity.class);
    • 第三种方式,检索获取项目中LauncherActivity,然后设置该activity的flag和component启动app
      CrashToolUtils.reStartApp3(AppManager.getAppManager().currentActivity());
    • 关于app启动方式详细介绍

7.2 如何网络拦截

  • 如下所示
    new OkHttpClient.Builder()
        //配置工厂监听器。主要是计算网络过程消耗时间
        .eventListenerFactory(NetworkListener.get())
        //主要是处理拦截请求,响应等信息
        .addNetworkInterceptor(new NetworkInterceptor())
        .build()
  • 如何开启悬浮按钮
    //建议只在debug环境下显示,点击去网络拦截列表页面查看网络请求数据
    NetworkTool.getInstance().setFloat(getApplication());
    
  • 该库目的
    • 做成悬浮全局按钮,点击按钮可以查看该activity页面请求接口,可以查看请求几个接口,以及接口请求到响应消耗流量
    • 方便查看网络请求流程,比如dns解析时间,请求时间,响应时间
    • 方便测试查看请求数据,方便抓包。可以复制request,respond,body等内容。也可以截图

7.3 如何使用ping

  • 直接创建一个ping,需要传递一个网址url
    _netDiagnoService = new NetDiagnoService(getContext(), getContext().getPackageName()
            , versionName, userId, deviceId, host, this);
    _netDiagnoService.execute();
  • 如何取消ping
    if (_netDiagnoService!=null){
        _netDiagnoService.cancel(true);
        _netDiagnoService = null;
    }
  • 或者直接停止ping。停止线程允许,并把对象设置成null
    _netDiagnoService.stopNetDialogsis();
  • 关于监听
    /**
     * 诊断结束,输出全部日志记录
     * @param log                       log日志输出
     */
    @Override
    public void OnNetDiagnoFinished(String log) {
        setText(log);
    }
    
    /**
     * 监控网络诊断过程中的日志输出
     * @param log                       log日志输出
     */
    @Override
    public void OnNetDiagnoUpdated(String log) {
        showInfo += log;
        setText(showInfo);
    }

More Repositories

1

YCBlogs

技术博客笔记大汇总,包括Java基础,线程,并发,数据结构;Android技术博客等等;常用设计模式;常见的算法;网络协议知识点;部分flutter笔记;还包括平时开发中遇到的bug汇总,当然也在工作之余收集了大量的面试题,长期更新维护并且修正,持续完善……开源的文件是markdown格式的!转载请注明出处,谢谢!
6,368
star
2

YCAppTool

组件化综合案例,组件分层为:基础公共组件,功能组件,业务组件,主工程。每一层组件的建设,很详细的工程案例,很全面的一个组件化实践案例。一个超级综合案例!
Java
3,133
star
3

YCVideoPlayer

基础封装视频播放器player,可以在ExoPlayer、MediaPlayer原生MediaPlayer可以自由切换内核;该播放器整体架构:播放器内核(自由切换) + 视频播放器 + 边播边缓存 + 高度定制播放器UI视图层。支持视频简单播放,列表播放,仿抖音滑动播放,自动切换播放,使用案例丰富,拓展性强。
Java
2,138
star
4

YCWebView

基于腾讯x5开源库,提高webView开发效率,大概要节约你百分之六十的时间成本。该案例支持处理js的交互逻辑且无耦合、同时暴露进度条加载进度、可以监听异常error状态、支持视频播放并且可以全频、支持加载word,xls,ppt,pdf,txt等文件文档、发短信、打电话、发邮件、打开文件操作上传图片、唤起原生App、支持webView页面截图、x5库为最新版本,功能强大。
Java
1,725
star
5

YCStateLayout

State switching, so that the View state switch and Activity completely separate. Using builder mode to freely add the required state View, can set data, data is empty, load data error, network error, load and other states, and support the layout of custom state. At present has been used in other formal projects, strong expansion!
Java
558
star
6

YCSlideLayout

购物商场商品详情页面自定义控件,模仿淘宝、京东、考拉等商品详情页分页加载的UI效果。可以嵌套RecyclerView、WebView、ViewPager、ScrollView等等。支持设置上拉分页加载动画效果……
Java
490
star
7

YCCustomText

自定义文本控件,支持富文本,包含两种状态:编辑状态和预览状态。编辑状态中,可以对插入本地或者网络图片,可以同时插入多张有序图片和删除图片,支持图文混排,并且可以对文字内容简单操作加粗字体,设置字体下划线,支持设置文字超链接(超链接支持跳转),已经用于多个实际项目中……
Java
478
star
8

YCRefreshView

自定义支持上拉加载更多,下拉刷新,可以自定义头部和底部,可以添加多个headerView,使用一个原生recyclerView就可以搞定复杂界面。支持自由切换状态【加载中,加载成功,加载失败,没网络等状态】的控件,可以自定义状态视图View。拓展功能【支持长按拖拽,侧滑删除】,轻量级,可以选择性添加 。多年前已经使用于前项目投资界,新芽,沙丘大学等APP正式项目中!持续更新……
Java
453
star
9

YCUpdateApp

轻量级版本更新弹窗,弹窗上支持更新进度条,可以设置普通更新或者强制更新。解决8.0以上通知栏不显示问题,解决7.0以上安装apk异常,下载完成则会自动提示安装;下载异常,失败,错误等状态,支持重启下载任务;还支持自定义下载路径。代码量少,调用简单……
Java
447
star
10

YCCaptureTool

App综合防抓包实践,关闭代理,设置配置文件;设置单向认证或双向认证;对数据加密和解密;sign签名参数;防止xposed,root,va挂载等操作。 比较通用全面的防抓包技术方案!
Java
417
star
11

YCNotification

通知栏封装库,强大的通知栏工具类,链式编程调用,解决了8.0以上通知栏不显示问题,支持多种不同的使用场景,兼容老版本。还有自定义通知栏view,可高度定制布局……
Java
375
star
12

YCScrollPager

仿抖音,快手,短视频,竖直方向,一次滚动一个页面的封装库。目前支持ViewPager做法,也支持RecyclerView做法……使用ViewPager则只是修改滑动速率,以及滚动翻页过渡时间;使用recyclerView打造丝滑切换视频的功能,更多内容可以看demo
Java
373
star
13

YCDialog

自定义弹窗,其中包括:自定义Toast;自定义dialog控件;自定义DialogFragment弹窗;自定义PopupWindow弹窗;还有自定义Snackbar等等;简单便用。目前已经用于多个正式项目中。
Java
358
star
14

YCAudioPlayer

音频播放器,基础播放功能有:播放,暂停,下一首,上一首;可以设置多种播放类型:顺序播放,随机播放,单曲循环;可以设置播放进度快慢,参考混沌大学APP;支持后台播放,可以扫描本地音频,有效处理了捕获/丢弃音频焦点逻辑,支持耳机线控。通知栏,底部音频播放控制栏,音频List页面和播放详情页数据同步。持续更新中……
Java
347
star
15

YCStatusBar

关于状态栏方案总结案例,适合于绝大多数的使用场景……同时,兼容了小米,魅族等手机状态栏字体颜色设置失效问题。已经用于实际项目投资界,新芽,沙丘大学等APP,一键集成并使用!支持单Activity多Fragment动态修改状态栏颜色,入侵性低,一行代码即可实现你需要的需求
Java
312
star
16

YCJniHelper

JNI学习案例,通过简单的案例快速入门jni开发。JNI基础语法介绍,so库生成打包和反编译,Java和C/C++相关调用案例
Java
254
star
17

YCFlutterUtils

Flutter Utils 全网最齐全的工具类。包含bus,颜色,日期,文件,json,log,sp,加解密,num,图片,网络,正则,验证,路由,文本,时间,spi,计时器,拓展类,编解码,发射,异常,字节转化,解析等等工具类。
Dart
240
star
18

YCThreadPool

轻量级简易线程池库,轻量级线程池异步库,支持线程执行过程中状态回调监测(包含成功,失败,异常等多种状态);支持创建异步任务,可以设置线程的名称,延迟执行时间,线程优先级,回调callback等;可以根据自己需要创建自己需要的线程池;线程异常时,可以打印异常日志,避免崩溃。
Java
224
star
19

YCCommonLib

组件化开发中基础公共库,activity栈管理;fragment周期监听;Lru缓存库;反射库;分区存储;Log日志打印和存储;通用缓存库(支持sp,mmkv,lru,disk,fastsp等多种存储方式切换);App重启;通用全面的工具类Utils;通用基类fragment,adpater,activity等简单封装;intent内容打印到控制台库;通用基础接口
Java
187
star
20

YCWidgetLib

自定义控件,其中包含自定义折叠布局,拓展性强使用简单;万能自定义红点控件,充分解耦合接入方便;多种方案实现阴影效果库;自定义view和viewGroup圆角控件,彻底解决圆角问题等
Java
184
star
21

YCWalleHelper

瓦力多渠道打包的Python脚本测试工具,通过该自动化脚本,自需要run一下或者命令行运行脚本即可实现美团瓦力多渠道打包,打包速度很快。配置信息十分简单,代码中已经注释十分详细。可以自定义输出文件路径,可以修改多渠道配置信息,简单实用。
Tcl
133
star
22

YCBannerView

轮播图,支持多种自定义属性,可以设置轮播红点或者轮播数字,支持设置引导页。可以根据不同使用场景,可以选择无限循环,静态管理或者动态管理adapter,还可以设置暂停和开始轮播。后期添加了RecyclerView轮播图,同时自定义多种类型SnapHelper,卡片滑动流畅,目前已经用于多个正式项目中!!
Java
106
star
23

YCModelBus

组件之间的通信,很友好起到隔离效果,接口+实现类,使用注解生成代码方式,无需手动注册,将使用步骤简单化,支持组件间以暴露接口提供服务的方式进行通信。
Java
77
star
24

YCHybridFlutter

Android和flutter混合开发案例
Dart
71
star
25

YCServerLib

gRPC学习案例,使用gRPC作为网络方案可以带来高效性、跨平台和语言、可靠性、易于使用和可扩展性等收益。同时可以减少手动编写代码的工作量,提高开发效率。
Java
49
star
26

YCStudyC

系统性学习C/C++编程语音,记录的Demo案例和学习笔记
C++
48
star
27

YCToolLib

按组划分的自定义adapter适配器,一个recyclerView可以完成强大的group+children类型的业务需求。每组支持添加header,footer,children,且每一个都支持设置多类型type的view视图。常见使用场景:仿懂车帝,汽车之家分组图片查看器;仿QQ联系人分组,可以折叠和伸展;以及复杂分组页面……
Java
46
star
28

YCDesignHelper

注解学习小案例,比较系统性学习注解并且应用实践。简单应用了运行期注解,通过注解实现了setContentView功能;简单应用了编译器注解,通过注解实现了防暴力点击的功能,同时支持设置时间间隔;使用注解替代枚举;使用注解一步步搭建简单路由案例。结合相应的博客,在来一些小案例,从此应该对注解有更加深入的理解……
Java
45
star
29

YCArchitecture

MVC,MVP,MVVM框架案例实践,Jetpack,Compose等学习演进。不同架构案例demo对比……
Java
44
star
30

YCTimerHelper

倒计时工具,分别使用了handler,自定义CountDownTimer,Timer和TimerTask,chronometer控件,和属性动画实现倒计时的功能。封装CountDownTimer倒计时器【在原有基础上增加了暂停和恢复倒计时功能】,解决了倒计时无法到0和从最大值开始bug
Java
13
star
31

YCVaHelpTool

VA学习案例,研究挂载,逆向,安全这一块
Java
4
star
32

YCSplashSdk

打开app启动页sdk,支持图片广告,也支持视频
3
star
33

YCUniApp

uni开发的项目,由于公司项目做混合开发,因此边学边做。基础入门级的案例分析,近期学习更新中
Vue
3
star
34

YCPluginTool

Plugin插件学习工具
2
star
35

yangchong211

1
star