尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

Unity打包PICO4 APK全攻略:从环境配置到疑难报错解决方案

Unity打包PICO4 APK全攻略:从环境配置到疑难报错解决方案
📅 发布时间:2026/8/4 6:15:56

1. 项目概述:为什么Unity打包PICO4 APK是个“技术雷区”?

如果你正在用Unity开发PICO4的应用,那么从点击“Build”按钮到最终在头显里跑起来,这段路可能比你想象的要坎坷得多。我见过太多团队,从美术到程序,满怀信心地打包,结果却被一连串红字报错直接打懵。这不仅仅是Unity和Android SDK版本不匹配那么简单,它涉及Unity渲染管线、PICO SDK的特定集成、Gradle构建脚本、Android Manifest的权限配置,以及Unity项目设置中无数个可能被忽略的复选框。每一个环节都可能成为“最后一根稻草”,让APK打包失败,或者在PICO4上运行时崩溃、黑屏、手柄失灵。

这个内容,就是为你梳理这条路上的所有“地雷”。我不会只告诉你“把Unity升级到某个版本”这种片汤话,因为版本号永远在变,但问题的本质和排查思路是相通的。我们将深入那些最常见的报错,比如令人头疼的Gradle build failed、IL2CPP compiler error、AndroidManifest merge conflict,以及PICO4特有的大空间(Scene Understanding)权限问题和XR插件初始化失败。我会结合我实际踩过的坑,告诉你每个报错背后真正的原因是什么,以及一套从新手到老手都适用的、可复现的解决方案。无论你是独立开发者还是团队中的技术负责人,这篇文章都能帮你节省大量无谓的排查时间,让打包过程从“玄学”变成可预测、可解决的工程问题。

2. 环境准备与工具链的“正确姿势”

在解决任何具体报错之前,一个稳定、兼容的环境是地基。很多打包问题,根源就在于环境配置的“想当然”。

2.1 Unity版本与模块选择:并非越新越好

对于PICO4开发,Unity版本的选择需要平衡稳定性、功能需求和生态支持。

首选版本范围:目前(基于广泛社区反馈和PICO官方SDK的兼容性),Unity 2021 LTS(长期支持版)和Unity 2022 LTS是经过最多项目验证的稳定选择。特别是Unity 2021.3.x系列,其内置的XR Plug-in Management框架与PICO SDK的集成最为成熟。盲目使用最新的Unity 2023或Alpha/Beta版本,可能会遇到SDK尚未适配的接口变更,导致各种诡异的编译或运行时错误。

注意:在Unity Hub中安装时,务必勾选Android Build Support模块下的OpenJDK、Android SDK & NDK Tools和Gradle。让Unity Hub帮你管理这些,比手动配置环境变量要可靠得多。很多“SDK路径找不到”的报错,都是因为手动配置的路径有空格、中文或权限问题。

2.2 PICO SDK导入:细节决定成败

从PICO开发者官网下载的SDK,通常是一个.unitypackage文件。导入过程看似简单,但有几个关键点:

  1. 导入前备份:强烈建议在导入前,备份你的项目,或至少使用版本控制系统(如Git)提交当前状态。SDK导入可能会覆盖你项目中的一些设置文件。
  2. 导入后检查:导入完成后,前往Edit -> Project Settings -> XR Plug-in Management。
    • 在Android标签页下,你应该能看到PICO的插件。确保它已被勾选启用。
    • 点击PICO插件右侧的齿轮图标,进入其独立设置面板。这里需要填写你在PICO开发者后台申请到的App ID。这个ID是应用在PICO设备生态中的唯一标识,忘记填写会导致应用无法正常启动或无法使用PICO在线服务。
  3. SDK版本与Unity版本的对应关系:务必查阅你下载的PICO SDK包内的README或ReleaseNotes文档,确认其明确支持的Unity版本。使用不匹配的版本组合是后续一切奇怪问题的温床。

2.3 Android SDK, NDK, JDK的版本“三重奏”

这是Android打包的传统难题,Unity的版本又为其增加了新的变数。

  • JDK (Java Development Kit):Unity 2021及更高版本推荐使用其自带的OpenJDK(安装时勾选)。避免使用系统安装的Oracle JDK,以免因版本或路径问题导致Gradle脚本执行失败。你可以在Edit -> Preferences -> External Tools中查看和确认JDK路径是否指向Unity自带的版本。
  • Android SDK:同样,优先使用Unity Hub安装的版本。如果需要手动指定(比如你使用了某些需要特定SDK版本的第三方插件),请确保路径中没有中文或空格。关键是要安装正确的SDK Platform和SDK Tools。对于PICO4(基于Android 10/Q),你需要确保安装了Android SDK Platform 29或更高版本(具体以PICO SDK文档要求为准)。同时,在SDK Tools标签页下,务必安装Android SDK Build-Tools的稳定版本(如30.0.3),版本号不必追求最新,但需与你的Gradle配置兼容。
  • NDK (Native Development Kit):这是IL2CPP脚本编译后端和某些原生插件(Native Plugin)所必需的。Unity不同版本对NDK有特定要求。最稳妥的做法是在Edit -> Preferences -> External Tools中,将Android NDK的选项设置为Unity Hub installed,让Unity自动管理。如果必须手动设置,请根据Unity官方文档的对应版本说明下载指定版本的NDK(例如Unity 2021.3可能要求NDK r21d或r23b)。

一个核心检查清单:在打包前,打开Edit -> Project Settings -> Player,切换到Android标签页,在最下方的Publishing Settings区域,找到Build子区域。确保JDK、SDK、NDK的路径都正确指向了有效且兼容的版本,而不是(Not set)。

3. 核心报错场景与深度解决方案

环境就绪后,我们直面那些最常见的报错信息。我将它们分为构建时错误和运行时错误两大类。

3.1 构建时错误:从代码到APK的“拦路虎”

3.1.1 Gradle构建失败 (Gradle build failed)

这是最高频的报错,控制台会输出一长串Gradle执行日志,错误信息可能五花八门。

  • 场景A:Could not resolve com.android.tools.build:gradle:x.x.x

    • 问题本质:项目使用的Gradle插件版本在远程仓库(如Google的Maven仓库)中找不到,或者你的网络无法访问该仓库。
    • 解决方案:
      1. 检查Assets/Plugins/Android目录下是否存在mainTemplate.gradle或baseProjectTemplate.gradle文件。这些文件允许你自定义Gradle构建脚本。
      2. 打开该文件,找到buildscript块下的dependencies部分,查看classpath 'com.android.tools.build:gradle:xxx'这一行。这个版本号可能过高或过低。
      3. 降级策略:将其改为一个更通用、更稳定的版本,例如4.2.2(这是一个被广泛验证与Unity兼容良好的版本)。修改后保存。
      4. 网络问题:如果公司网络有代理,需要在Unity中或系统环境变量中配置Gradle的代理设置。或者,尝试使用阿里云的Maven镜像仓库。这可以通过在Assets/Plugins/Android目录下创建gradleTemplate.properties文件,并添加以下内容实现:
        systemProp.http.proxyHost=your-proxy-host systemProp.http.proxyPort=your-proxy-port systemProp.https.proxyHost=your-proxy-host systemProp.https.proxyPort=your-proxy-port # 或者使用阿里云镜像 systemProp.org.gradle.jvmargs=-Dhttps.proxyHost=mirrors.aliyun.com -Dhttps.proxyPort=80 -Dhttp.proxyHost=mirrors.aliyun.com -Dhttp.proxyPort=80
    • 实操心得:我个人的习惯是,对于新项目,先使用Unity默认的Internal(内部)构建系统打包一次。如果成功,再切换到Gradle系统并应用mainTemplate.gradle进行高级定制。这能快速判断问题是出在Gradle配置本身,还是项目代码。
  • 场景B:Duplicate class或Program type already present

    • 问题本质:依赖冲突。两个或多个库(JAR或AAR文件)包含了完全相同的Java类。这在导入多个第三方SDK(如广告、分析、支付SDK)时极为常见。
    • 解决方案:
      1. 定位冲突库:错误信息通常会指出冲突的类名,例如com.google.android.gms.xxx。根据类名可以推断出冲突的库(通常是不同版本的Google Play服务或Firebase组件)。
      2. 使用Gradle排除依赖:在mainTemplate.gradle文件中,找到dependencies块。对于引入冲突的依赖项,使用exclude语句。例如,如果某个库com.some.plugin:plugin-aar:1.0包含了冲突的com.google.android.gms:play-services-auth,可以这样写:
        implementation('com.some.plugin:plugin-aar:1.0') { exclude group: 'com.google.android.gms', module: 'play-services-auth' }
      3. 统一版本:如果可能,强制所有依赖使用同一个版本。可以在gradleTemplate.properties中定义版本变量,或在mainTemplate.gradle的根节点使用configurations.all进行分辨率策略设置。
    • 避坑技巧:善用Android Studio的Analyze APK功能。将打包失败的APK(通常位于Temp输出目录)拖入Android Studio,可以直观地看到APK中包含的所有DEX文件和类,有助于发现重复的类。

3.1.2 IL2CPP编译错误 (IL2CPP compiler error)

当你将Scripting Backend设置为IL2CPP以获取更好的性能和跨平台兼容性时,可能会遇到此类错误。

  • 典型错误:NotSupportedException: System.Type.GetType(...)或IL2CPP: Unable to find method...
  • 问题本质:IL2CPP在将C#/.NET的中间代码(IL)转换为C++代码时,无法处理某些使用了反射、动态类型或非托管代码交互的复杂模式。某些第三方插件或自己编写的代码可能使用了不兼容的模式。
  • 解决方案:
    1. 创建link.xml文件:在项目的Assets文件夹下创建一个名为link.xml的文件。这个文件的作用是告诉IL2CPP链接器:“不要裁剪掉这些类型或程序集,即使你认为它们没有被用到。” 这是解决因代码裁剪(Code Stripping)导致运行时找不到类型的最有效方法。
      <linker> <assembly fullname="YourAssemblyName" preserve="all"/> <!-- 或者更精细地控制 --> <assembly fullname="Some.Third.Party.Plugin"> <type fullname="Some.Third.Party.Plugin.*" preserve="all"/> </assembly> <!-- 保留整个System.Core程序集,因为很多反射功能在里面 --> <assembly fullname="System.Core" preserve="all"/> </linker>
    2. 排查第三方插件:如果错误指向某个特定的第三方插件,首先检查该插件的官方文档,看其是否明确支持IL2CPP。如果不支持,可能需要联系插件作者,或寻找替代品。
    3. 暂时切换后端:在Player Settings -> Other Settings -> Scripting Backend中,临时切换回Mono进行打包测试。如果Mono下打包和运行正常,而IL2CPP失败,那么问题几乎可以确定是代码兼容性问题,集中精力按上述方法解决。

3.1.3 AndroidManifest合并冲突

  • 问题本质:Unity会生成一个基础的AndroidManifest.xml文件,PICO SDK和其他第三方插件也会携带自己的AndroidManifest.xml。在构建过程中,Gradle需要将这些文件合并成一个。如果它们声明了相同的权限、组件(Activity/Service)或属性但值不同,就会产生冲突。
  • 报错示例:Manifest merger failed : Attribute application@icon value=(...)
  • 解决方案:
    1. 使用manifestPlaceholders:这是解决属性冲突的优雅方式。在mainTemplate.gradle的defaultConfig块中,可以覆盖一些属性。
      android { defaultConfig { manifestPlaceholders = [ 'appIcon': '@mipmap/ic_launcher', 'appIconRound': '@mipmap/ic_launcher_round' ] } }
      然后在你的或插件的AndroidManifest.xml中使用${appIcon}来引用这个占位符。
    2. 合并规则标记:在Assets/Plugins/Android目录下,你可以创建一个自己的AndroidManifest.xml文件。通过添加tools:命名空间的属性,来指导合并工具。例如,强制使用你的权限定义,并移除库中的重复定义:
      <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <!-- 使用 `tools:node="replace"` 完全替换掉任何库中的同名权限 --> <uses-permission android:name="android.permission.CAMERA" tools:node="replace"/> <!-- 使用 `tools:node="merge"` 和 `tools:replace` 来合并并替换特定属性 --> <application android:icon="${appIcon}" tools:replace="android:icon"> </application> </manifest>
    3. 检查PICO SDK的Manifest:解压PICO SDK的.aar文件(通常位于Assets/PICO/Plugins/Android),查看其内部的AndroidManifest.xml,了解它声明了哪些特殊的Activity、Service和权限(尤其是与大空间、手柄、设备信息相关的),确保你的主Manifest没有与之冲突的定义。

3.2 运行时错误:APK装上了,但一运行就崩

这类错误更棘手,因为通常需要连接真机(PICO4)并通过adb logcat或 Unity的Android Logcat包来查看设备日志。

3.2.1 黑屏、闪退、提示“XXX已停止运行”

  • 排查步骤:
    1. 连接设备与抓取日志:在Unity编辑器中,安装Android Logcat包(Window -> Package Manager)。用USB-C线连接PICO4到电脑,并在头显中同意USB调试。在Unity中,打开Window -> Analysis -> Android Logcat,选择你的设备,开始抓取日志。
    2. 寻找“Fatal”信号:在日志中搜索FATAL EXCEPTION、CRASH、signal(如signal 11 (SIGSEGV))等关键词。段错误(SIGSEGV)通常指向原生代码(C++)崩溃,可能来自图形驱动、不稳定的原生插件或IL2CPP运行时。
    3. 检查图形API:PICO4主要支持OpenGL ES 3.0和Vulkan。在Player Settings -> Other Settings -> Graphics APIs中,确保列表里包含OpenGLES3,且其顺序在Vulkan之前(除非你明确使用了Vulkan特性)。不支持的图形API会导致初始化失败。
    4. 检查最低API级别:在Player Settings -> Other Settings -> Minimum API Level,确保设置不高于PICO4系统所基于的Android版本(例如Android 10/API 29)。设置过高会导致应用无法在旧版本系统上安装。

3.2.2 PICO XR插件初始化失败

  • 错误表现:应用启动后,停留在Unity启动Logo画面,或者进入一个非VR的2D界面,无法进入VR模式。
  • 日志线索:在Android Logcat中搜索PXR、Pico、XR等关键字,可能会看到Initialization failed、Loader not found等错误。
  • 解决方案:
    1. 确认XR插件管理:再次确认Project Settings -> XR Plug-in Management -> Android下,PICO插件已启用。
    2. 检查App ID:确认PICO插件设置中的App ID已正确填写,且与你在PICO开发者后台创建的应用一致。一个空的或错误的App ID会导致SDK无法正常初始化。
    3. 验证清单权限:PICO SDK需要一些特定权限。确保合并后的AndroidManifest.xml包含以下关键权限(通常SDK会自动添加,但合并冲突可能导致丢失):
      <!-- 必要权限示例 --> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- VR设备特性 --> <uses-feature android:name="android.hardware.vr.headtracking" android:version="1" android:required="true" /> <!-- PICO大空间相关(如果需要) --> <uses-permission android:name="com.picovr.permission.SCENE" /> <uses-feature android:name="com.picovr.feature.SCENE" android:required="false"/>
    4. 启动Activity检查:PICO应用的启动Activity必须是其SDK提供的com.unity3d.player.UnityPlayerActivity的子类,并且配置正确的intent-filter。检查你的主Manifest,确保启动Activity配置正确,没有被其他插件错误地覆盖。

3.2.3 大空间(Scene Understanding)功能异常

  • 错误表现:调用PICO的大空间API时,返回失败、无数据,或应用因权限问题崩溃。
  • 解决方案:
    1. 权限动态申请:从Android 6.0开始,危险权限需要在运行时动态申请。大空间相关的权限(如com.picovr.permission.SCENE)可能属于此类。你需要在Unity C#代码中,在尝试使用大空间功能前,检查并请求权限。
      // 示例:使用Unity的Android权限请求API #if UNITY_ANDROID && !UNITY_EDITOR using UnityEngine.Android; #endif public void RequestScenePermission() { #if UNITY_ANDROID && !UNITY_EDITOR if (!Permission.HasUserAuthorizedPermission("com.picovr.permission.SCENE")) { Permission.RequestUserPermission("com.picovr.permission.SCENE"); // 注意:请求是异步的,你需要等待回调或稍后检查权限状态 } #endif }
    2. 清单声明:如上所述,确保AndroidManifest.xml中已声明了必要的权限和<uses-feature>。
    3. 设备支持检查:在运行时,通过PICO SDK提供的API检查当前设备是否支持大空间功能,再进行调用,避免在不支持的设备上触发错误。

4. 打包流程标准化与最佳实践

为了避免每次打包都像开盲盒,建立一个稳定、可重复的打包流程至关重要。

4.1 标准操作流程 (SOP)

  1. 代码与资源就绪:确保所有场景、脚本、资源都已就绪,并在编辑器内测试通过。
  2. 版本管理与清理:使用Git等工具提交当前工作状态。执行Assets -> Clean All Asset Bundles和Assets -> Reimport All有时可以解决一些元数据缓存问题。
  3. 构建设置检查:
    • File -> Build Settings:确保正确的场景在列表中并被勾选。
    • Player Settings:
      • Company Name和Product Name使用英文,避免特殊字符。
      • Default Icon和Splash Image设置妥当。
      • Other Settings:
        • Package Name:符合Android反向域名格式(如com.YourCompany.YourApp)。
        • Minimum API Level和Target API Level设置正确。
        • Scripting Backend:根据项目需求选择IL2CPP(发布)或Mono(快速调试)。
        • ARM64:必须勾选。PICO4是64位设备,不支持32位应用。
        • Graphics APIs:确保包含OpenGLES3。
  4. 执行构建:点击Build,选择一个干净的输出目录(如Builds/Android),生成APK文件。
  5. 安装与测试:使用adb install -r YourApp.apk命令或直接通过PICO设备上的文件管理器安装APK,进行完整的功能测试。

4.2 高级调试技巧

  • 使用Development Build:在Build Settings中勾选Development Build和Autoconnect Profiler。这样打包出的APK会包含调试符号,允许你通过Unity Editor实时连接Profiler、查看Console日志,极大方便了真机调试。
  • 启用Android Logcat:如前所述,Android Logcat包是排查运行时问题的利器。你可以通过过滤器只显示Unity、PXR、Error等标签的日志。
  • 分析符号化崩溃堆栈:如果从PICO设备或用户那里获取到了崩溃堆栈(crash stack trace),但地址都是十六进制无法阅读,你需要符号化(Symbolicate)它们。对于IL2CPP构建,你需要在构建时勾选Create symbols.zip(在Player Settings -> Publishing Settings -> Build区域)。这个zip文件包含了将内存地址映射回C#代码行的符号表,是分析原生层崩溃的关键。

5. 疑难杂症排查清单 (Q&A)

这里汇总了一些不那么常见但一旦遇到就很折磨人的问题。

Q1:打包时提示“Unable to merge android manifests”或“java.exe finished with non-zero exit value 1”,但没有更具体的错误。A1:这通常是Gradle构建的通用错误。尝试以下步骤:

  1. 关闭Unity,删除项目根目录下的Library、Temp、Obj文件夹,然后重新打开Unity。这能清除可能损坏的缓存。
  2. 检查磁盘空间是否充足。
  3. 尝试将Build System从Gradle临时切换为Internal(如果可用),看是否能成功。这能帮助判断问题是否出在Gradle环境本身。
  4. 查看更详细的Gradle日志。在Unity的Preferences -> External Tools下,可以找到Gradle的日志输出路径,打开该文件查看最底部的详细错误。

Q2:应用在PICO4上运行帧率极低,卡顿严重。A2:这属于性能问题,但可能由打包设置引起。

  1. 检查纹理压缩格式:在Player Settings -> Android -> Publishing Settings -> Texture Compression中,对于PICO4(高通XR2平台),选择ASTC格式通常能获得最佳的功耗和性能平衡。避免使用ETC2,除非有特殊兼容性要求。
  2. 检查多线程渲染:确保Player Settings -> Other Settings -> Multithreaded Rendering是开启的。这对于VR应用至关重要。
  3. 使用Unity Profiler连接真机:通过Development Build和Wi-Fi/ADB连接Profiler,分析CPU和GPU的瓶颈所在,可能是某个脚本效率低下、DrawCall过高或存在内存泄漏。

Q3:如何减小APK体积?A3:

  1. 纹理优化:使用合适的Max Size和压缩格式。启用Mipmaps会增加体积,对于UI纹理可以考虑关闭。
  2. 音频优化:将长音频转换为流式加载(Streaming),并选择合适的压缩格式(如Vorbis)。
  3. 代码剥离:如果使用IL2CPP,可以适当调整Player Settings -> Other Settings -> Strip Engine Code和Managed Stripping Level(设置为Low或Medium),但要做好测试,避免因过度裁剪导致运行时错误(此时link.xml文件就派上用场了)。
  4. 使用Asset Bundle:将非首包必需的资源放到Asset Bundle中,通过网络按需下载。

Q4:从Unity 2020升级到2021/2022后,PICO功能全部失效。A4:Unity的XR架构在2020到2021之间发生了重大变化,从旧的“XR Settings”迁移到了新的“XR Plug-in Management”。

  1. 完全移除旧的PICO SDK(如果存在)。
  2. 从PICO官网下载并导入专为Unity 2021+设计的新版SDK。
  3. 确保按照新流程,在XR Plug-in Management中启用PICO插件并配置App ID。
  4. 检查代码中所有与XR输入、追踪相关的API,它们可能已经从UnityEngine.XR命名空间迁移到了UnityEngine.XR.Management或UnityEngine.InputSystem.XR。需要参考Unity和PICO的迁移指南更新代码。

打包的过程,本质上是一个将复杂系统(你的项目)适配到另一个复杂系统(Android/PICO4)的过程。问题虽多,但绝大多数都有清晰的路径可循。核心思路永远是:精确阅读错误信息 -> 理解其所属的问题领域(环境、Gradle、代码、配置)-> 使用针对性的工具和方法进行隔离与修复。建立好稳定的基础环境,遵循标准的打包流程,善用日志和调试工具,你就能将打包的“不确定性”降到最低,把更多精力投入到创造精彩的VR体验本身。

相关新闻

  • TCP与UDP协议对比:核心特性与应用场景解析
  • 2026 年更新:屯昌口碑好的不锈钢洗手池供应商推荐,别再乱买厨房台盆了!这玩意儿居然能用十年不脏还好打理?-丰卓不锈钢厨具设备 - 企业推荐管【认证】
  • Linux rcp 命令超全解析|远程文件复制用法 + 安全避坑指南

最新新闻

  • 2026人体工学椅核心技术解析与选购指南
  • AI写SEO文章到底靠不靠谱?揭秘谷歌算法最新动态下的87%失败率真相
  • SAP FBRA清账凭证冲销原理与J_1B批量冲销程序实战解析
  • 高端家装用什么水管品牌?国际环保称号背书、德系精工五项服务清单逐项核验与交付仪式感对比 - 小橘甄选
  • 2026年装修垃圾资源化处理系统厂家推荐:如何选择靠谱设备与技术支持? - 优质品牌商家
  • 人工智能技术发展现状与应用案例分析

日新闻

  • 5分钟快速搭建智能数字人:Live2D虚拟形象终极部署指南
  • 告别繁简字幕转换烦恼:这款开源工具让你一键搞定影视字幕处理 [特殊字符]
  • GPT-5.4传闻背后:大模型永久记忆与极限推理的技术演进与挑战

周新闻

  • 怀化母婴除甲醛公司测甲醛中心怎么选:康之居母婴除甲醛标准、流程、避坑指南 - 信誉隆金银铂奢回收
  • 三步打造你的终极音乐中心:foobox-cn网络电台功能完整指南
  • Lance湖仓格式:为多模态AI工作流设计的终极数据存储方案

月新闻

  • ClickHouse版本管理深度实战:4步构建零风险升级与回滚体系
  • Java 23 种设计模式:从踩坑到精通 | 番外:责任链模式 —— 物流审批流程实战
  • 华硕笔记本性能解放指南:G-Helper轻量级控制工具全面解析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号