GTS GtsUnofficialApisUsageTestCases Failed

news2024/11/20 1:50:21

GTS 测试GtsUnofficialApisUsageTestCases失败如下:

junit.framework.AssertionFailedError: There are 102 violation(s)
com.google.android.gm / Landroid/window/BackEvent;->getProgress()F / BLOCKED / LINKING
com.google.android.gm / Landroid/window/BackEvent;->getSwipeEdge()I / BLOCKED / LINKING
com.google.android.gm / Landroid/window/BackEvent;->getTouchX()F / BLOCKED / LINKING
com.google.android.gm / Landroid/window/BackEvent;->getTouchY()F / BLOCKED / LINKING
com.google.android.dialer / Landroid/window/BackEvent;->getProgress()F / BLOCKED / LINKING
com.google.android.dialer / Landroid/window/BackEvent;->getSwipeEdge()I / BLOCKED / LINKING
com.google.android.dialer / Landroid/window/BackEvent;->getTouchY()F / BLOCKED / LINKING
com.google.android.apps.photos / Landroid/media/MediaRoute2Info$Builder;->setDeduplicationIds(Ljava/util/Set;)Landroid/media/MediaRoute2Info$Builder; / BLOCKED / LINKING
com.google.android.apps.photos / Landroid/media/MediaRoute2Info$Builder;->setType(I)Landroid/media/MediaRoute2Info$Builder; / BLOCKED / LINKING
com.google.android.apps.photos / Landroid/media/MediaRoute2Info;->getDeduplicationIds()Ljava/util/Set; / BLOCKED / LINKING
com.google.android.apps.photos / Landroid/media/MediaRoute2Info;->getType()I / BLOCKED / LINKING
com.google.android.apps.photos / Landroid/window/BackEvent;->getProgress()F / BLOCKED / LINKING
com.google.android.apps.photos / Landroid/window/BackEvent;->getSwipeEdge()I / BLOCKED / LINKING
com.google.android.apps.photos / Landroid/window/BackEvent;->getTouchX()F / BLOCKED / LINKING
com.google.android.apps.photos / Landroid/window/BackEvent;->getTouchY()F / BLOCKED / LINKING
com.google.android.apps.safetyhub / Landroid/window/BackEvent;->getProgress()F / BLOCKED / LINKING
com.google.android.apps.tachyon / Landroid/window/BackEvent;->getProgress()F / BLOCKED / LINKING
com.google.android.apps.tachyon / Landroid/window/BackEvent;->getSwipeEdge()I / BLOCKED / LINKING
com.google.android.apps.tachyon / Landroid/window/BackEvent;->getTouchX()F / BLOCKED / LINKING
com.google.android.apps.tachyon / Landroid/window/BackEvent;->getTouchY()F / BLOCKED / LINKING
com.google.android.apps.youtube.music / Landroid/media/MediaRoute2Info$Builder;->setDeduplicationIds(Ljava/util/Set;)Landroid/media/MediaRoute2Info$Builder; / BLOCKED / LINKING
com.google.android.apps.youtube.music / Landroid/media/MediaRoute2Info$Builder;->setType(I)Landroid/media/MediaRoute2Info$Builder; / BLOCKED / LINKING
com.google.android.apps.youtube.music / Landroid/media/MediaRoute2Info;->getDeduplicationIds()Ljava/util/Set; / BLOCKED / LINKING
com.google.android.apps.youtube.music / Landroid/media/MediaRoute2Info;->getType()I / BLOCKED / LINKING
com.google.android.apps.youtube.music / Landroid/window/BackEvent;->getProgress()F / BLOCKED / LINKING
com.google.android.apps.youtube.music / Landroid/window/BackEvent;->getSwipeEdge()I / BLOCKED / LINKING
com.google.android.apps.youtube.music / Landroid/window/BackEvent;->getTouchX()F / BLOCKED / LINKING
com.google.android.apps.youtube.music / Landroid/window/BackEvent;->getTouchY()F / BLOCKED / LINKING
com.google.android.gms / Landroid/media/MediaRoute2Info$Builder;->setDeduplicationIds(Ljava/util/Set;)Landroid/media/MediaRoute2Info$Builder; / BLOCKED / LINKING
com.google.android.gms / Landroid/media/MediaRoute2Info$Builder;->setType(I)Landroid/media/MediaRoute2Info$Builder; / BLOCKED / LINKING
com.google.android.gms / Landroid/media/MediaRoute2Info;->getDeduplicationIds()Ljava/util/Set; / BLOCKED / LINKING
com.google.android.gms / Landroid/media/MediaRoute2Info;->getType()I / BLOCKED / LINKING
com.google.android.gms / Landroid/window/BackEvent;->getProgress()F / BLOCKED / LINKING
com.google.android.gms / Landroid/window/BackEvent;->getSwipeEdge()I / BLOCKED / LINKING
com.google.android.gms / Landroid/window/BackEvent;->getTouchX()F / BLOCKED / LINKING
com.google.android.gms / Landroid/window/BackEvent;->getTouchY()F / BLOCKED / LINKING
com.google.android.tts / Landroid/window/BackEvent;->getProgress()F / BLOCKED / LINKING
com.google.android.tts / Landroid/window/BackEvent;->getSwipeEdge()I / BLOCKED / LINKING
com.google.android.tts / Landroid/window/BackEvent;->getTouchX()F / BLOCKED / LINKING
com.google.android.tts / Landroid/window/BackEvent;->getTouchY()F / BLOCKED / LINKING
com.google.android.as / Landroid/window/BackEvent;->getProgress()F / BLOCKED / LINKING
com.google.android.as / Landroid/window/BackEvent;->getSwipeEdge()I / BLOCKED / LINKING
com.google.android.as / Landroid/window/BackEvent;->getTouchX()F / BLOCKED / LINKING
com.google.android.as / Landroid/window/BackEvent;->getTouchY()F / BLOCKED / LINKING
com.google.android.keep / Landroid/window/BackEvent;->getProgress()F / BLOCKED / LINKING
com.google.android.keep / Landroid/window/BackEvent;->getSwipeEdge()I / BLOCKED / LINKING
com.google.android.keep / Landroid/window/BackEvent;->getTouchX()F / BLOCKED / LINKING
com.google.android.keep / Landroid/window/BackEvent;->getTouchY()F / BLOCKED / LINKING
com.google.android.apps.docs / Landroid/window/BackEvent;->getProgress()F / BLOCKED / LINKING
com.google.android.apps.docs / Landroid/window/BackEvent;->getSwipeEdge()I / BLOCKED / LINKING
com.google.android.apps.docs / Landroid/window/BackEvent;->getTouchX()F / BLOCKED / LINKING
com.google.android.apps.docs / Landroid/window/BackEvent;->getTouchY()F / BLOCKED / LINKING
com.google.android.calendar / Landroid/window/BackEvent;->getProgress()F / BLOCKED / LINKING
com.google.android.calendar / Landroid/window/BackEvent;->getSwipeEdge()I / BLOCKED / LINKING
com.google.android.calendar / Landroid/window/BackEvent;->getTouchX()F / BLOCKED / LINKING
com.google.android.calendar / Landroid/window/BackEvent;->getTouchY()F / BLOCKED / LINKING
com.google.android.inputmethod.latin / Landroid/window/BackEvent;->getProgress()F / BLOCKED / LINKING
com.google.android.inputmethod.latin / Landroid/window/BackEvent;->getSwipeEdge()I / BLOCKED / LINKING
com.google.android.inputmethod.latin / Landroid/window/BackEvent;->getTouchX()F / BLOCKED / LINKING
com.google.android.inputmethod.latin / Landroid/window/BackEvent;->getTouchY()F / BLOCKED / LINKING
com.google.android.apps.messaging / Landroid/window/BackEvent;->getProgress()F / BLOCKED / LINKING
com.google.android.apps.messaging / Landroid/window/BackEvent;->getSwipeEdge()I / BLOCKED / LINKING
com.google.android.apps.messaging / Landroid/window/BackEvent;->getTouchX()F / BLOCKED / LINKING
com.google.android.apps.messaging / Landroid/window/BackEvent;->getTouchY()F / BLOCKED / LINKING
com.google.android.apps.maps / Landroid/media/MediaRoute2Info$Builder;->setDeduplicationIds(Ljava/util/Set;)Landroid/media/MediaRoute2Info$Builder; / BLOCKED / LINKING
com.google.android.apps.maps / Landroid/media/MediaRoute2Info$Builder;->setType(I)Landroid/media/MediaRoute2Info$Builder; / BLOCKED / LINKING
com.google.android.apps.maps / Landroid/media/MediaRoute2Info;->getDeduplicationIds()Ljava/util/Set; / BLOCKED / LINKING
com.google.android.apps.maps / Landroid/media/MediaRoute2Info;->getType()I / BLOCKED / LINKING
com.google.android.apps.maps / Landroid/window/BackEvent;->getProgress()F / BLOCKED / LINKING
com.google.android.apps.maps / Landroid/window/BackEvent;->getSwipeEdge()I / BLOCKED / LINKING
com.google.android.apps.maps / Landroid/window/BackEvent;->getTouchX()F / BLOCKED / LINKING
com.google.android.apps.maps / Landroid/window/BackEvent;->getTouchY()F / BLOCKED / LINKING
com.google.android.deskclock / Landroid/window/BackEvent;->getProgress()F / BLOCKED / LINKING
com.google.android.deskclock / Landroid/window/BackEvent;->getTouchY()F / BLOCKED / LINKING
com.google.android.contacts / Landroid/window/BackEvent;->getProgress()F / BLOCKED / LINKING
com.google.android.contacts / Landroid/window/BackEvent;->getSwipeEdge()I / BLOCKED / LINKING
com.google.android.contacts / Landroid/window/BackEvent;->getTouchX()F / BLOCKED / LINKING
com.google.android.contacts / Landroid/window/BackEvent;->getTouchY()F / BLOCKED / LINKING
com.google.android.googlequicksearchbox / Landroid/media/MediaRoute2Info$Builder;->setDeduplicationIds(Ljava/util/Set;)Landroid/media/MediaRoute2Info$Builder; / BLOCKED / LINKING
com.google.android.googlequicksearchbox / Landroid/media/MediaRoute2Info$Builder;->setType(I)Landroid/media/MediaRoute2Info$Builder; / BLOCKED / LINKING
com.google.android.googlequicksearchbox / Landroid/media/MediaRoute2Info;->getDeduplicationIds()Ljava/util/Set; / BLOCKED / LINKING
com.google.android.googlequicksearchbox / Landroid/media/MediaRoute2Info;->getType()I / BLOCKED / LINKING
com.google.android.googlequicksearchbox / Landroid/window/BackEvent;->getProgress()F / BLOCKED / LINKING
com.google.android.googlequicksearchbox / Landroid/window/BackEvent;->getSwipeEdge()I / BLOCKED / LINKING
com.google.android.googlequicksearchbox / Landroid/window/BackEvent;->getTouchX()F / BLOCKED / LINKING
com.google.android.googlequicksearchbox / Landroid/window/BackEvent;->getTouchY()F / BLOCKED / LINKING
com.google.android.youtube / Landroid/media/MediaRoute2Info$Builder;->setDeduplicationIds(Ljava/util/Set;)Landroid/media/MediaRoute2Info$Builder; / BLOCKED / LINKING
com.google.android.youtube / Landroid/media/MediaRoute2Info$Builder;->setType(I)Landroid/media/MediaRoute2Info$Builder; / BLOCKED / LINKING
com.google.android.youtube / Landroid/media/MediaRoute2Info;->getDeduplicationIds()Ljava/util/Set; / BLOCKED / LINKING
com.google.android.youtube / Landroid/media/MediaRoute2Info;->getType()I / BLOCKED / LINKING
com.google.android.youtube / Landroid/window/BackEvent;->getProgress()F / BLOCKED / LINKING
com.google.android.youtube / Landroid/window/BackEvent;->getSwipeEdge()I / BLOCKED / LINKING
com.google.android.youtube / Landroid/window/BackEvent;->getTouchX()F / BLOCKED / LINKING
com.google.android.youtube / Landroid/window/BackEvent;->getTouchY()F / BLOCKED / LINKING
com.google.android.videos / Landroid/media/MediaRoute2Info$Builder;->setDeduplicationIds(Ljava/util/Set;)Landroid/media/MediaRoute2Info$Builder; / BLOCKED / LINKING
com.google.android.videos / Landroid/media/MediaRoute2Info$Builder;->setType(I)Landroid/media/MediaRoute2Info$Builder; / BLOCKED / LINKING
com.google.android.videos / Landroid/media/MediaRoute2Info;->getDeduplicationIds()Ljava/util/Set; / BLOCKED / LINKING
com.google.android.videos / Landroid/media/MediaRoute2Info;->getType()I / BLOCKED / LINKING
com.google.android.videos / Landroid/window/BackEvent;->getProgress()F / BLOCKED / LINKING
com.google.android.videos / Landroid/window/BackEvent;->getSwipeEdge()I / BLOCKED / LINKING
com.google.android.videos / Landroid/window/BackEvent;->getTouchX()F / BLOCKED / LINKING
com.google.android.videos / Landroid/window/BackEvent;->getTouchY()F / BLOCKED / LINKING
    at junit.framework.Assert.fail(Assert.java:57)
    at junit.framework.TestCase.fail(TestCase.java:223)
    at com.android.gts.api.UnofficialApisUsageTest.testNonApiReferencesInProduct(UnofficialApisUsageTest.java:211)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at junit.framework.TestCase.runTest(TestCase.java:177)
    at junit.framework.TestCase.runBare(TestCase.java:142)
    at com.android.tradefed.testtype.DeviceTestResult$1.protect(DeviceTestResult.java:99)
    at com.android.tradefed.testtype.DeviceTestResult.runProtected(DeviceTestResult.java:73)
    at com.android.tradefed.testtype.DeviceTestResult.run(DeviceTestResult.java:104)
    at junit.framework.TestCase.run(TestCase.java:130)
    at com.android.tradefed.testtype.DeviceTestCase.run(DeviceTestCase.java:170)
    at com.android.tradefed.testtype.JUnitRunUtil.runTest(JUnitRunUtil.java:65)
    at com.android.tradefed.testtype.JUnitRunUtil.runTest(JUnitRunUtil.java:44)
    at com.android.tradefed.testtype.JUnitRunUtil.runTest(JUnitRunUtil.java:39)
    at com.android.tradefed.testtype.DeviceTestCase.run(DeviceTestCase.java:146)
    at com.android.tradefed.testtype.HostTest.runRemoteTest(HostTest.java:673)
    at com.android.tradefed.testtype.HostTest.runTestClasses(HostTest.java:581)
    at com.android.tradefed.testtype.HostTest.run(HostTest.java:564)
    at com.android.compatibility.common.tradefed.testtype.JarHostTest.run(JarHostTest.java:56)
    at com.android.tradefed.testtype.suite.GranularRetriableTestWrapper.intraModuleRun(GranularRetriableTestWrapper.java:366)
    at com.android.tradefed.testtype.suite.GranularRetriableTestWrapper.run(GranularRetriableTestWrapper.java:277)
    at com.android.tradefed.testtype.suite.ModuleDefinition.run(ModuleDefinition.java:581)
    at com.android.tradefed.testtype.suite.ITestSuite.runSingleModule(ITestSuite.java:912)
    at com.android.tradefed.testtype.suite.ITestSuite.run(ITestSuite.java:792)
    at com.android.tradefed.invoker.InvocationExecution.runTest(InvocationExecution.java:1335)
    at com.android.tradefed.invoker.InvocationExecution.runTests(InvocationExecution.java:1114)
    at com.android.tradefed.invoker.TestInvocation.prepareAndRun(TestInvocation.java:604)
    at com.android.tradefed.invoker.TestInvocation.performInvocation(TestInvocation.java:274)
    at com.android.tradefed.invoker.TestInvocation.invoke(TestInvocation.java:1322)
    at com.android.tradefed.command.CommandScheduler$InvocationThread.run(CommandScheduler.java:629)

上述失败提示的app都是google的原生应用,例如com.google.android.youtube(YouTube)并且这些app都位于product目录下,我们可以反编译看下此测试项:

可以看到此测试项主要测试product目录下的app是否调用黑名单或者灰名单中的api,也就是非SDK接口管控名单内的api,名单如下:

Android P以后调用非 SDK(包括深灰名单、黑名单)接口的所有应用都将受到影响,Google提供的工具veridex 可以检测app是否调用了这些api,其内含有一个appcompat.sh ,我们可以看GTS也是使用该脚本

1:源码包含此工具,目录在:QSSI.13\art\tools\veridex\appcompat.sh
2:我们可以在QSSI.13 目录下编译此工具:make appcompat
3:我们就可以使用下面的命令行将其扫描内容输出到文件中
./appcompat.sh --dex-file=my_game.apk.apk >> out_put.txt
当然也可以加一个--imprecise参数,加这个参数是为了让输出内容更加详细
./appcompat.sh --dex-file=my_game.apk --imprecise >>  out_put.txt

截图所示为扫描出来的非SDK API,扫描出92个隐藏api,52个反射api,还有一些其他的,例如7个api的最大只支持到q的,当然不是说这些api都不能调用,GTS测试失败的过滤条件为:

也就是下图只有红款内的api会被视为不规范,下面的Linking unsupported 亦或者Reflection unsupported 都可以算正常。

当然还有一个判断:该项是读取GTS配置文件:GtsUnofficialApisUsageTestCases.dynamic内是否配置了额外的api, 如果没有配置,则该方法始终为false,则GTS的此项过滤条件可以不考虑该条件

但是我们发现这些原生的应用肯定是调用了这些api,并且我们没有源码,所以修改不了。也就是按照这个测试工具的判断方法,我们只有一个方法可以测过该项,那就是把这些应用移到别的目录,例如system_ext/app 或者system/app目录下。这个也是可以的,只不过工作量比较大。举例YuTuBe修改如下:

# YouTube
LOCAL_PATH := $(my-dir)
....
#LOCAL_PRIVILEGED_MODULE := true
#phoebe  add for move YuTuBe to system/app
#LOCAL_PRODUCT_MODULE := true
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_DPI_VARIANTS := xxhdpi xhdpi hdpi mdpi
LOCAL_DPI_FILE_STEM := YouTube_$(my_src_arch)_%.apk
LOCAL_SRC_FILES := YouTube_$(my_src_arch)_xxhdpi.apk
...

 ...

当然网上也有人说,在google play store里面更新这些app,是一样的效果,更新这些app以后,这些app的目录变为了data/data/xxx 这样,所以也算跳过此项了。

当然最终问题的原因为:

GTS 工具版本更新,从R4更新为R1,这个时候我们再测试,就会PASS了。主要原因是因为第三个判断方法返回true,则此GTS会跳过此项。

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

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

相关文章

java参数中的-、--、-X、-XX、-D

详细描述请参考:https://docs.oracle.com/en/java/javase/19/docs/specs/man/java.html Java标准选项(以-、或者–开头) Java标准选项被所有的Java虚拟机(JVM)实现所支持。 这些选项用于普通的动作,例如检…

服务器数据恢复-VSAN环境下ESXI虚拟机无法访问的数据恢复方案

一、用户信息: 广东某单位 二、数据恢复环境: 主机操作系统:ESXI 分区类型:VSAN 存储介质清单 :一共8台服务器节点,每节点2个磁盘组,其中1个磁盘组配置1块SSD固态硬盘,4块1.2T机…

【unity3D】Debug方法(如何在console面板中输出红色的错误信息)

💦本专栏是我关于游戏开发的笔记 🈶本篇是一个简短的小知识点 Debug方法 介绍常用方法 介绍 Unity中的Debug方法可以用来输出一些调试信息,帮助开发者查找代码中的错误和问题。 常用方法 Debug.Log():最常用的Debug方法之一&am…

表白墙(服务器)

目录 0.需求 1.创建Maven项目 2.给pom.xml内引入三个依赖 3.完善目录,并补充web.xml中的内容 4.编写代码 后端代码 ​编辑前端代码 5.引入数据库 创建message表 创建工具类 往MessageServlet类中添加方法 0.需求 前面写好了表白墙页面,但存…

视阅口译有何特点,哪里提供视阅口译翻译?

据了解,视阅口译是一种涉及视听和口头表达的翻译方式,它在跨文化交流等领域中起到了非常重要的作用。那么,视阅口译有何特点,哪里提供专业的视阅口译服务? 我们知道,视阅口译就是基于事先准备好的讲稿或文…

“构建高效的Java Web开发环境及前后端分离后台接口部署“

目录 引言一、安装环境:JDK和Tomcat1. 安装JDK下载jdk配置环境变量2. 安装Tomcat 二、安装MySQL三、部署前后端分离后台接口总结 引言 在现代软件开发中,构建高效的开发环境和部署稳定的后台接口是至关重要的。本文将介绍如何安装和配置Java开发环境&am…

一文2000字使用JMeter进行接口测试教程!(建议收藏)

安装 使用JMeter的前提需要安装JDK,需要JDK1.7以上版本目前在用的是JMeter5.2版本,大家可自行下载解压使用 运行 进入解压路径如E: \apache-jmeter-5.2\bin,双击jmeter.bat启动运行 启动后默认为英文版本,可通过Options – Cho…

【王道代码】【3 栈和队列】

结构体定义: 队列操作:

DevExpress(GridControl基础样式)

1.设置GridControl底部导航器可见 this.gridControl1.UseEmbeddedNavigator true; 2.隐藏嵌入式导航器的追加按钮,所有导航器的操作可以自行查阅API this.gridControl1.EmbeddedNavigator.Buttons.Append.Visible false; 3.去掉第一列前的空白列,去掉…

学历不好,背景不强?想进入互联网行业难道真的没希望?

随着互联网的大环境越来越好,各个企业又有了新一轮的招聘需求,但是大家会发现企业招人要求出奇的一致:学信网可查、本科及以上学历!虽然越来越多的人希望能够进入这个行业,但是有些人可能会因为学历不好或者背景不强而…

C++基础算法④——排序算法(快速、归并附完整代码)

快速排序 快速排序是对冒泡排序的一种改进。 它的基本思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行快速排序,以达到整个序列有序。 假设我们现在对 …

JVM 类加载的过程

JVM 类加载的过程 加载验证准备解析初始化 加载 “加载”(Loading)阶段是整个“类加载”(Class Loading)过程中的一个阶段,它和类加载 Class Loading 是不同的,一个是加载 Loading 另一个是类加载 Class L…

重磅消息!优维发布全新产品“应急管理”

近日,蚂蚁集团旗下的在线文档编辑与协同工具语雀平台发生了一次严重的宕机事件,导致用户无法正常使用其各项功能。从故障发生到完全恢复正常,语雀整个宕机时间将近 8 小时,如此长时间的宕机已经达到了 P0 级事故,并在网…

PCL setCameraPosition 参数讲解

setCameraPosition 的原型如下void setCameraPosition (double pos_x, double pos_y, double pos_z,double view_x, double view_y, double view_z,double up_x, double up_y, double up_z, int viewport 0);pos_x pos_y pos_z为相机所在的位置view_x view_y view_z 是焦点所…

如何通过会员营销数字化推动精准营销与用户忠诚度培养?

营销策略的制定和实施对于企业的成功至关重要,而会员数字化营销系统将通过用户画像、会员标签等重要功能,推动企业提高用户忠诚度培养。目前市面上有哪些热门的会员营销功能? 一、用户画像:让营销更精准 用户画像是一种通过收集和…

TensorFlow案例学习:简单的音频识别

前言 以下内容均来源于官方教程:简单的音频识别:识别关键字 音频识别 下载数据集 下载地址:http://storage.googleapis.com/download.tensorflow.org/data/mini_speech_commands.zip 可以直接浏览器访问下载。 下载完成后将其解压到项目…

uniapp使用z-paging插件下拉刷新

z-paging插件地址传送门 z-paging官网说明传送门 一、uniapp使用z-paging插件下拉刷新 1.导入插件 2.粘贴ui结构 <z-paging ref="paging" v-model="dataList"

【嵌入式】【GIT】如何迁移老的GIF到新的仓库时使用LFS功能并保持LOG不变

一、正常迁移流程 假设有仓库 ssh://old/buildroot-201902 需要迁移到新的仓库 ssh://old/buildroot-201902时,我们可以使用以下命令来完成: # 下载老的仓库 git clone ssh://old/buildroot-201902 # 向新的仓库上传所有的tags git push ssh://new/buildroot-201902 --tag…

三款公认简单好用的文字转语音工具

分享3款好用的文字转语音软件&#xff0c;操作简单&#xff0c;主播声音丰富&#xff0c;转换出来的语音能够接近于人声&#xff0c;非常自然&#xff01; 1、TTSMAKER 一款文字转语音在线工具&#xff0c;不需要注册登录&#xff0c;打开就能使用&#xff0c;支持多种语言的语…