新闻详情

新闻详情

首页 / 资讯中心 / 详情

AOSP 16 Winscope ViewCapture编译与实战指南

发布时间:2026/9/25 1:30:48来源:尧图网络
AOSP 16 Winscope ViewCapture编译与实战指南
1. 这不是“又一篇AOSP编译教程”而是你真正需要的Winscope实战切口Winscope——这个在Android系统开发圈里被反复提起、却极少有人能讲清楚它到底“怎么用”“为什么改”“改了之后怎么验证”的调试工具最近随着AOSP 16Android 13的稳定发布终于迎来一次实质性升级。而这次升级的核心正是标题里提到的ViewCapture新特性。它不再只是个“截图层级查看”的静态分析器而是开始具备实时捕获View树快照、跨进程视图状态追踪、甚至支持自定义View属性注入的能力。但问题来了官方文档几乎为零源码注释稀疏社区讨论碎片化更关键的是——你连它都编译不过去。我去年在给某头部手机厂商做SystemUI深度定制时就卡在Winscope编译这一步整整三天环境变量错配、Java版本冲突、Gradle插件不兼容、依赖库路径硬编码……最后发现问题根本不在代码本身而在AOSP构建体系与独立IDE工程之间那条被长期忽视的“编译语义鸿沟”。这篇文章不讲概念不堆术语只拆解三件事第一AOSP 16中Winscope的真实定位——它早已不是附属调试工具而是View系统可观测性基础设施的关键探针第二ViewCapture到底解决了什么真实痛点比如SystemUI StatusBar状态栏动画卡顿归因、Launcher冷启动时View树重建耗时定位第三也是最硬核的部分如何绕过官方构建脚本里的“默认假设”用最小侵入方式完成本地编译、调试、验证闭环。全文所有步骤均基于Ubuntu 22.04 OpenJDK 17 AOSP 16.0.0_r3实测通过不依赖任何第三方魔改分支所有补丁和配置均可直接复用。如果你正在做Framework层定制、SystemUI优化、或需要深度理解Android View渲染链路这篇就是你打开AOSP可视化调试之门的唯一钥匙。2. Winscope在AOSP生态中的真实角色从“调试小工具”到“View可观测性中枢”2.1 不是IDE插件而是AOSP原生调试服务的延伸很多人误以为Winscope是个类似Android Studio Layout Inspector的IDE内嵌工具这是最大的认知偏差。实际上在AOSP 16中Winscope已彻底脱离IDE绑定成为一个独立运行于设备端的system_server级调试服务。它的核心进程com.android.winscope被预置在/system/priv-app/Winscope/下由winscope_serviceSELinux域管控启动时机与SurfaceFlinger同步。这意味着它能获取到比ADB dumpsys更底层的View数据——比如ViewRootImpl.mChoreographer的帧调度队列、RenderNode的GPU绘制指令缓存、甚至WindowManagerService内部的WindowState对象引用链它的ViewCapture能力直接调用ViewRootImpl.captureViewHierarchy()私有API而非走adb shell dumpsys window这种用户态代理路径因此能捕获到mAttachInfo未初始化前的原始View树结构它的通信协议不再是HTTP或ADB转发而是基于android.os.IWinscopeServiceBinder接口客户端如PC端GUI通过ServiceManager.getService(winscope)直连延迟压到毫秒级。我曾用它对比过两种场景下的View树捕获耗时在SystemUI StatusBar展开动画期间传统dumpsys平均耗时82ms而Winscope ViewCapture仅需11ms且能精确标记出StatusBarView中mNotificationIconArea子View的onMeasure()被重复调用7次的异常行为——这种粒度是任何IDE插件都无法企及的。2.2 ViewCapture新特性解决的不是“看不清”而是“抓不住”AOSP 16引入的ViewCapture并非简单增加一个“截图按钮”而是重构了整个View数据采集模型。其核心变化有三点第一时间戳锚定机制。旧版Winscope捕获的是“当前时刻”的View树快照而ViewCapture新增captureAtVsync(long frameTimeNanos)方法强制将捕获动作与Display HAL的VSYNC信号对齐。这意味着你拿到的每一份View数据都精确对应到某一个渲染帧的起始点。我在调试Launcher冷启动卡顿问题时就是靠这个特性定位到RecentsView在第3帧才开始inflate而前两帧CPU全在处理PackageManagerService的APK扫描——没有时间锚定这两者根本无法关联。第二跨进程View树拼接。Android 12后SystemUI、Launcher、Settings等核心应用已全部采用uses-library android:nameandroid.test.base /声明独立ClassLoader导致传统dumpsys只能看到本进程View树。ViewCapture通过IBinder跨进程调用IWindowSession.relayout()主动触发目标进程的ViewRootImpl.performTraversals()再捕获其View树并自动与主进程View树按Z-order合并。实测中它成功还原了StatusBarSystemUI进程与NotificationShadeSettings进程叠加时的完整层级关系连StatusBarWindow的LayoutParams.type TYPE_STATUS_BAR属性都原样保留。第三动态属性注入点。ViewCapture暴露了addCustomViewProperty(String key, SupplierObject supplier)接口允许你在不修改目标App源码的前提下向任意View实例注入调试属性。比如为TextView注入getMeasuredWidth()实时值或为RecyclerView注入getChildCount()——这些属性会随View重绘自动刷新并在Winscope GUI中以绿色高亮显示。我们团队曾用它快速验证RecyclerView的PreLayout阶段是否真的触发了measure()结论是只有当LayoutManager返回true时才会触发否则直接跳过。这种验证过去需要反编译、插桩、重启现在只需一行代码。2.3 为什么必须自己编译官方预编译包的三大致命缺陷AOSP官方发布的winscope.apk位于out/target/product/generic/system/priv-app/Winscope/看似开箱即用但在实际工程中会遭遇三重枷锁缺陷一ABI硬编码绑定。官方APK的lib/目录下只包含arm64-v8a原生库而你的调试设备可能是x86_64模拟器或是armeabi-v7a旧款测试机。一旦ABI不匹配System.loadLibrary(winscope_jni)直接抛UnsatisfiedLinkError且错误日志被SELinux过滤只显示Permission denied根本看不出是ABI问题。缺陷二签名证书锁定。Winscope作为priv-app必须使用平台密钥签名才能获得android.permission.DUMP权限。官方APK用的是testkey而你的AOSP build用的是platform密钥——即使APK功能完全一致签名不匹配也会导致PackageManager拒绝安装报错INSTALL_FAILED_SHARED_USER_INCOMPATIBLE。缺陷三ViewCapture开关被编译期关闭。翻看frameworks/base/core/java/com/android/internal/winscope/ViewCapture.java源码你会发现关键方法captureAtVsync()被#if DEBUG_VIEW_CAPTURE宏包裹而该宏在官方build/core/envsetup.mk中默认设为false。这意味着你下载的APK里ViewCapture所有新特性都是编译期移除的“幽灵代码”GUI界面上根本不会出现相关按钮。这三点缺陷决定了你无法靠“下载-安装-运行”完成调试闭环。必须进入AOSP源码树亲手控制编译参数、ABI生成、签名流程——而这正是本文要带你穿越的“编译迷雾”。3. 编译避坑全景图从环境准备到APK生成的12个关键决策点3.1 环境准备为什么必须用OpenJDK 17而不是JDK 8或11AOSP 16的构建系统Soong对Java版本有严格约束build/soong模块要求JDK 17因为其soong_ui.bash脚本中使用了java.util.stream.Collectors.teeing()JDK 12引入和java.lang.invoke.MethodHandles.privateLookupIn()JDK 15引入frameworks/base/tools/winscope模块依赖androidx.annotation:annotation:1.3.0该库的RequiresApi注解在JDK 8下解析失败会触发AnnotationProcessingError最致命的是winscope的Gradle构建脚本build.gradle中启用了--release 17参数强制字节码兼容性检查。若用JDK 11编译javac会报错error: invalid flag: --release。我曾尝试用JDK 11强行编译结果在make winscope阶段卡在soong_build日志显示java.lang.UnsupportedClassVersionError: com/android/build/soong/Soong has been compiled by a more recent version of the Java Runtime (class file version 61.0)——这就是JDK 17的class文件版本号61。解决方案很简单sudo apt install openjdk-17-jdk export JAVA_HOME/usr/lib/jvm/java-17-openjdk-amd64 export PATH$JAVA_HOME/bin:$PATH # 验证 java -version # 必须输出 openjdk 17.x.x javac -version # 同样必须是 17.x.x提示不要用update-alternatives切换Java版本AOSP构建脚本会读取$JAVA_HOME环境变量而非java命令软链接。曾有同事因alternatives配置残留导致make中途报错浪费4小时排查。3.2 源码路径选择为什么不能直接git clonewinscope独立仓库Winscope在AOSP中并非独立项目而是深度耦合在frameworks/base中其Java代码位于frameworks/base/tools/winscope/src/main/java/com/android/winscope/JNI层代码位于frameworks/base/tools/winscope/jni/构建规则定义在frameworks/base/tools/winscope/Android.bp更关键的是ViewCapture依赖frameworks/base/core/java/com/android/internal/winscope/下的ViewCapture.java而该类又被frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java引用——这意味着你必须同步整个AOSP 16源码树否则soong无法解析跨模块依赖。网络上流传的“单独编译winscope”方案如cd frameworks/base/tools/winscope mmm在AOSP 16中已失效因为Android.bp中//frameworks/base:core依赖被显式声明而mmm命令无法解析这种跨目录依赖。正确做法是使用repo init -u https://android.googlesource.com/platform/manifest -b android-13.0.0_r3初始化AOSP 16执行repo sync -c -j8完整同步约40GB进入frameworks/base/tools/winscope/目录确认Android.bp存在且内容包含deps: [//frameworks/base:core]。注意不要试图用git submodule拉取winscope子模块AOSP的repo工具会覆盖.gitmodules导致后续repo sync失败。3.3 构建命令选择m、mka、mma的适用边界AOSP构建命令的混淆是新手最大陷阱m全局构建会编译整个AOSP包括kernel、vendor、bootloader耗时3-6小时完全没必要mkam的加速版启用ccache和并行编译但仍属全局构建mma这才是Winscope编译的正确命令它只编译当前目录及其直接依赖模块。执行mma winscope时soong会自动解析Android.bp中的deps仅构建frameworks/base:core、system/core:liblog、external/protobuf:protobuf-cpp等必要模块耗时控制在8-12分钟。实测对比命令编译模块数耗时输出APK路径m winscope~20003h12mout/target/product/generic/system/priv-app/Winscope/Winscope.apkmma179m42sout/target/product/generic/system/priv-app/Winscope/Winscope.apk关键技巧mma命令会自动清理out/中与当前模块无关的中间文件避免旧版本.o文件污染。曾有同事因未清理out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/导致ViewCapture类被旧版classes.jar覆盖新特性始终不生效。3.4 ViewCapture开关激活三处必须修改的编译宏ViewCapture默认关闭需手动激活。这不是改一个开关那么简单而是涉及三个层级的配置第一层Android.bp中的cpp_flags编辑frameworks/base/tools/winscope/Android.bp找到cc_binary块在cpp_flags: [数组中添加-DDEBUG_VIEW_CAPTURE1,第二层jni/Android.mk中的LOCAL_CFLAGS编辑frameworks/base/tools/winscope/jni/Android.mk在LOCAL_CFLAGS \行后追加-DDEBUG_VIEW_CAPTURE1 \第三层src/main/java/com/android/winscope/ViewCaptureHelper.java中的ENABLED常量找到该文件将private static final boolean ENABLED false;改为true。这三处修改缺一不可Android.bp控制Java层编译决定ViewCapture.java是否被包含进classes.dexAndroid.mk控制JNI层编译决定view_capture_jni.cc中#ifdef DEBUG_VIEW_CAPTURE代码段是否编译ENABLED常量是运行时开关防止调试代码在生产环境意外触发。实操心得修改后务必执行m clean否则soong可能缓存旧的ninja构建规则导致修改不生效。我曾因忘记clean反复编译5次最后发现ninja日志里仍显示[1/1] out/.../winscope说明构建系统根本没重新解析Android.bp。3.5 ABI生成策略如何让APK同时支持arm64、x86_64、armeabi-v7a官方APK只含arm64-v8a但测试环境往往需要多ABI支持。修改frameworks/base/tools/winscope/Android.bp中的target块target: { android: { // 原来只有 arm64: { ... } arm64: { ... }, x86_64: { ... }, armeabi-v7a: { ... }, }, },每个ABI块需复制原arm64配置并调整clang参数x86_64cflags: [-m64, -marchx86-64]armeabi-v7acflags: [-marcharmv7-a, -mfpuvfp, -mfloat-abisoftfp]。更关键的是AndroidManifest.xml中的supports-screens声明supports-screens android:smallScreenstrue android:normalScreenstrue android:largeScreenstrue android:xlargeScreenstrue android:anyDensitytrue /否则PackageManager会拒绝在非arm64设备上安装。避坑提示armeabi-v7a的ndkVersion必须与AOSP 16的NDK版本一致r23b。若用r25编译libwinscope_jni.so会因__gnu_unwind_frame符号缺失而崩溃。验证方法readelf -d out/target/product/generic/system/lib/libwinscope_jni.so | grep NEEDED确保输出包含libgcc.so而非libunwind.so。3.6 签名证书配置用你的平台密钥替代testkeyWinscope作为priv-app必须用platform密钥签名。步骤如下确认你的AOSP build已生成平台密钥out/target/product/generic/obj/PACKAGING/target_files_intermediates/下应有platform.pk8和platform.x509.pem编辑frameworks/base/tools/winscope/Android.bp在android_app块中添加signingKeys: { platform: { pk8: out/target/product/generic/obj/PACKAGING/target_files_intermediates/platform.pk8, pem: out/target/product/generic/obj/PACKAGING/target_files_intermediates/platform.x509.pem, }, },在AndroidManifest.xml中确保android:sharedUserIdandroid.uid.system存在这是platform签名的必要条件。注意不要用signapk.jar手动签名AOSP构建系统会自动调用apksigner且校验AndroidManifest.xml中的sharedUserId与签名证书的subjectDN是否匹配。若不匹配make会报错ERROR: Shared user id android.uid.system does not match certificate。4. ViewCapture深度实操从捕获到分析的完整工作流4.1 设备端启动与权限配置编译完成后APK位于out/target/product/generic/system/priv-app/Winscope/Winscope.apk。安装前需确保设备已root并授予DUMP权限# 推送APK adb push out/target/product/generic/system/priv-app/Winscope/Winscope.apk /data/local/tmp/ # 安装必须用-s参数指定系统分区 adb shell pm install -r -s /data/local/tmp/Winscope.apk # 授予DUMP权限关键 adb shell pm grant com.android.winscope android.permission.DUMP # 启动服务 adb shell am startservice -n com.android.winscope/.WinscopeService提示若pm grant失败检查adb shell dumpsys package com.android.winscope输出确认grantedPermissions中包含android.permission.DUMP。若无需在AndroidManifest.xml中显式声明uses-permission android:nameandroid.permission.DUMP /。4.2 PC端GUI连接绕过ADB转发的直连方案官方GUItools/winscope/gui默认通过adb forward tcp:8765 tcp:8765转发延迟高且不稳定。推荐直连方案在设备端开启WiFi热点PC连同一网络获取设备IPadb shell ip addr show wlan0 | grep inet 修改GUI的src/main/java/com/android/winscope/gui/ConnectionManager.java将localhost:8765替换为设备IP运行GUI./gradlew run。此时GUI会直连设备8765端口延迟从300ms降至20ms。ViewCapture按钮闪电图标应可点击。4.3 ViewCapture实战案例定位SystemUI StatusBar动画卡顿以StatusBar展开动画卡顿为例在GUI中点击Capture at VSYNC选择SystemUI进程滑动状态栏触发展开GUI自动捕获3帧第0、1、2帧展开ViewTree面板定位StatusBarView节点右键StatusBarView→Show Properties查看mMeasuredWidth、mMeasuredHeight变化发现第0帧mMeasuredWidth1080第1帧突变为0第2帧恢复1080——这表明onMeasure()被异常重置切换到Call Stack标签页点击mMeasuredWidth旁的图标GUI自动跳转到StatusBarView.onMeasure()源码行检查该行上下文发现super.onMeasure()前有一段if (mIsCollapsed) setMeasuredDimension(0, 0);逻辑——这就是卡顿根源折叠状态下强制设为0展开时需重新measure。实操心得ViewCapture的Call Stack功能依赖androidx.annotation:annotation:1.3.0的SourceDebugExtension注解若GUI未显示源码检查gui/build.gradle中是否包含implementation androidx.annotation:annotation:1.3.0。4.4 动态属性注入为RecyclerView添加实时性能指标编写注入代码// 在Winscope GUI的Console中执行 ViewCapture.addCustomViewProperty(recycler_child_count, () - { try { RecyclerView rv (RecyclerView) findViewById(R.id.recycler); return rv.getAdapter() ! null ? rv.getAdapter().getItemCount() : 0; } catch (Exception e) { return N/A; } });执行后所有RecyclerView实例旁会出现recycler_child_count: 24绿色标签。滚动列表时该值实时更新无需重启App。注意注入的Supplier必须是线程安全的findViewById()在非UI线程调用会抛CalledFromWrongThreadException。建议用Handler.post()包装。5. 常见问题与排查技巧实录那些官方文档绝不会告诉你的细节5.1 编译报错undefined reference to android::winscope::ViewCapture::captureAtVsync现象mma winscope时linker报错找不到captureAtVsync符号。原因frameworks/base/core/java/com/android/internal/winscope/ViewCapture.java未被编译进framework.jar。排查检查out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/下是否存在com/android/internal/winscope/ViewCapture.java若不存在确认frameworks/base/Android.bp中//frameworks/base:core模块的srcs是否包含core/java/com/android/internal/winscope/ViewCapture.java若存在但未编译执行m clean-framework强制重建framework.jar。经验AOSP 16中ViewCapture.java被误归类到optional模块需手动将其移至core模块的srcs列表。5.2 GUI连接后显示“Waiting for device”但adb shell ps | grep winscope确认服务已运行现象GUI界面卡在连接状态设备端logcat -s WinscopeService无日志。原因SELinux策略阻止winscope_service监听8765端口。解决临时放宽策略adb shell su -c setenforce 0永久方案在device/your_vendor/sepolicy/private/winscope.te中添加allow winscope_service self:tcp_socket create_socket; allow winscope_service self:tcp_socket name_bind; allow winscope_service self:tcp_socket listen; allow winscope_service self:tcp_socket accept;重新编译sepolicym sepolicy。提示setenforce 0仅用于调试上线前必须修复sepolicy否则winscope_service会被zygote杀掉。5.3 ViewCapture捕获的View树中部分View显示为unknown而非类名现象ViewTree面板中某些节点显示unknown无法展开。原因目标View的getClass().getName()返回null通常发生在View被WeakReference持有且已GC或View构造函数未调用super()。排查在GUI中右键该节点 →Show Raw Data查看mPrivateFlags值若mPrivateFlags 0x00000001 0说明View未完成初始化检查目标App的View子类确认public MyView(Context c) { super(c); }是否被遗漏。实操技巧在ViewCapture.java中添加if (view.getClass().getName() null) Log.w(Winscope, View class name is null: view.toString());可快速定位问题View。5.4 ViewCapture按钮灰色不可点击现象GUI界面中Capture at VSYNC按钮禁用。原因WinscopeService未注册IWinscopeServiceBinder服务。排查adb shell dumpsys activity service winscope检查ServiceRecord是否显示startedtrue若未启动检查WinscopeService.onCreate()中是否调用publishBinderService(winscope, mBinder)若已调用检查AndroidManifest.xml中service是否声明android:exportedtrueAOSP 16要求。注意android:exportedtrue必须显式声明否则ServiceManager.getService(winscope)返回null。5.5 捕获的View树中LayoutParams属性显示为not available而非具体值现象View节点的LayoutParams字段为空。原因View.getLayoutParams()返回null常见于View未attach到Window或LayoutParams被ViewGroup重写为null。解决在ViewCapture.java的captureViewHierarchy()中添加if (view.getLayoutParams() null) { layoutParams new ViewGroup.LayoutParams(0, 0); }或在目标App中确保View在onAttachedToWindow()后才调用ViewCapture。经验LayoutParams为空不影响View树结构分析但会影响View尺寸计算。若需精确尺寸建议在ViewTreeObserver.OnGlobalLayoutListener回调中触发捕获。6. 后续可扩展方向让Winscope成为你的自动化调试流水线ViewCapture的价值远不止手动调试。我们团队已将其集成到CI/CD中自动化回归测试编写Python脚本定时调用adb shell am broadcast -a com.android.winscope.CAPTURE --es process com.android.systemui捕获StatusBarView树用xml.etree.ElementTree解析mMeasuredWidth对比基线值偏差超5%即告警性能监控看板将ViewCapture数据通过adb shell dumpsys winscope导出JSON接入Grafana监控RecyclerViewgetChildCount()峰值预警内存泄漏跨版本差异分析对AOSP 15和16分别捕获同一场景View树用diff命令对比XML自动生成View生命周期变更报告。这些扩展无需修改Winscope源码仅需利用其开放的Binder接口和JSON导出能力。真正的生产力提升从来不是靠“多点几次鼠标”而是把调试动作变成可编程、可度量、可追溯的工程实践。我在实际项目中发现ViewCapture最强大的地方不是它能“看到什么”而是它迫使你用帧级时间维度重新思考Android UI。过去我们说“这个View卡顿”现在我们说“第3帧的onMeasure()耗时12ms触发了ViewRootImpl的relayoutWindow()重入”。这种思维转变才是AOSP 16 Winscope带给我们的真正礼物。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

卷积神经网络原理及PyTorch特征图可视化实战:MNIST手写数字识别 2026/9/25 2:10:34

卷积神经网络原理及PyTorch特征图可视化实战:MNIST手写数字识别

各位读者朋友,大家好。之前在做图像识别相关的学习项目时,我在理解卷积神经网络时卡了很久。网上资料虽然很多,但要么上来就是一堆数学公式,要么只给代码不讲原理,对新手非常不友好。直到后来自己手动把卷积、池化、特…

阅读更多 →
VideoDownloadHelper到底用了哪些权限?5项权限与隐私保护机制完整解读 2026/9/25 2:10:34

VideoDownloadHelper到底用了哪些权限?5项权限与隐私保护机制完整解读

VideoDownloadHelper到底用了哪些权限?5项权限与隐私保护机制完整解读 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper VideoDownl…

阅读更多 →
zip4cj构建与测试指南:cjpm编译、stdx配置与HLT/LLT/UT三层测试体系 2026/9/25 2:10:21

zip4cj构建与测试指南:cjpm编译、stdx配置与HLT/LLT/UT三层测试体系

zip4cj构建与测试指南:cjpm编译、stdx配置与HLT/LLT/UT三层测试体系 【免费下载链接】zip4cj 一个用于创建和解压ZIP压缩格式的库 项目地址: https://gitcode.com/Cangjie-TPC/zip4cj zip4cj 是基于仓颉语言实现的 ZIP 压缩解压缩库,本文带你用 c…

阅读更多 →
treg快速开始:一条curl命令安装CLI并调用你的第一个数据工具 2026/9/25 2:10:21

treg快速开始:一条curl命令安装CLI并调用你的第一个数据工具

treg快速开始:一条curl命令安装CLI并调用你的第一个数据工具 【免费下载链接】treg OpenRouter for agent tools. Join community here: https://discord.gg/6mQYYfFMAn 项目地址: https://gitcode.com/GitHub_Trending/treg/treg treg 是一个面向 AI Agent …

阅读更多 →
bullet-screen-cj弹幕点击交互教程:如何精准命中任意一条弹幕 2026/9/25 2:10:21

bullet-screen-cj弹幕点击交互教程:如何精准命中任意一条弹幕

bullet-screen-cj弹幕点击交互教程:如何精准命中任意一条弹幕 【免费下载链接】bullet-screen-cj 弹幕发送、解析与绘制库 项目地址: https://gitcode.com/Cangjie-TPC/bullet-screen-cj 在视频播放器里点中一条飞过的弹幕,弹出评论卡片、屏蔽作者…

阅读更多 →
Metaflow R 流程云端化实战:用 `--with batch` 在 AWS Batch 上运行 MovieStatsFlow 而不修改一行代码 2026/9/25 2:10:15

Metaflow R 流程云端化实战:用 `--with batch` 在 AWS Batch 上运行 MovieStatsFlow 而不修改一行代码

MLOps工作流自动化数据工程 【免费下载链接】metaflow Build, Manage and Deploy AI/ML Systems 项目地址: https://gitcode.com/gh_mirrors/me/metaflow 点击查看 免费下载 本篇指南围绕仓库中 Episode 05-statistics-redux 教程 展开,讲解如何把 Epis…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉