MTK平台相关总结#########[FAQ18279]开机时间慢分析 android 系统重启关机流程分析

恢复出厂设置 卡住10分钟问题 恢复出厂设置 卡住10分钟问题 文章目录恢复出厂设置 卡住10分钟问题1. 信息初步收集1.1 现象描述1.2 问题概率以及实验情况确认2. 分析过程2.1 确认recovery log信息情况2.2 log分析2.2.1 recovery 重启2.2.2 recovery 清除操作2.2.2.1 block 进入逻辑:2.2.2.2 中间调度逻辑:2.2.2.3 block 退出逻辑3. 问题原因以及处理3.1 原因3.2 处理3.3 记录4. 涉及模块4.1 mmc子系统架构4.2 调度策略处理 1. 阅读详情

找MTK相关请查看微博:天川一水的ChinaUnix博客    http://blog.chinaunix.net/uid-29728680-id-5514223.html微笑


下面是一叶梧桐的博客

http://blog.csdn.net/huangyabin001/article/details/44056493  

Andorid屏幕唤醒异常,Power按键无法点亮屏幕的分析

http://blog.csdn.net/huangyabin001/article/details/42777703 

Android开机时间分析

http://blog.csdn.net/huangyabin001/article/details/41210927Android         系统启动过程




[DESCRIPTION]
 
 开机时间分析。
 
[SOLUTION] 

(1)若能抓取mobilelog,则可以在APLog_xxxx文件夹中找到bootprof文件。或者直接cat /proc/bootprof

----------------------------------------
0 BOOT PROF (unit:msec)
----------------------------------------
1077 : preloader         // 这里会记录preloader和lk的执行时间,单位为毫秒。
3667 : lk
----------------------------------------
47.188307 : ON
95.973922 : of_init 16992539 ns
124.732076 : ramoops_init 27976001 ns
155.463384 : init_mtk_governor 28810077 ns
208.009307 : arm64_device_init 40170846 ns
245.649461 : pm_sysrq_init 28632231 ns
305.320923 : event_trace_init 25269538 ns
328.487538 : pmic_mt_init 18462461 ns
398.533231 : populate_rootfs 67385539 ns
481.464077 : mtkfb_init 16279692 ns
631.410616 : modem_cd_init 128015693 ns
817.579693 : md_ccif_init 186129616 ns
894.852462 : gf_init 40584231 ns
940.017616 : mt_i2c_init 45137231 ns
1013.895463 : eem_init 23476462 ns
1059.026771 : acc_init 32313847 ns
1116.455540 : gyro_init 57412308 ns
2363.018851 : fpc1022_init 1232834464 ns
2382.414158 : battery_init 18354616 ns
2417.481312 : clk_debug_init 33775692 ns
2450.348466 : mt_soc_snd_init 32818538 ns
2451.768543 : Kernel_init_done
2875.773313 : INIT: on init start
2881.017236 : INIT:Mount_START
3546.686469 : INIT:Mount_END
3550.746930 : start mobicore (on fs)
3553.768623 : start mobicore end (on fs)
3675.040623 : post-fs-data: on modem start
5971.898167 : BOOT_Animation:START             // 这里表明已经进入上层。
6684.275630 : Zygote:Preload Start
7112.275554 : Zygote:Preload Start
8761.911327 : Zygote:Preload 3831 classes in 1319ms
8847.152943 : Zygote:Preload 3831 classes in 1424ms
9055.208867 : Zygote:Preload 342 obtain resources in 206ms
9059.303559 : Zygote:Preload 41 resources in 2ms
9076.121251 : Zygote:Preload 342 obtain resources in 313ms
9081.294482 : Zygote:Preload 41 resources in 3ms
9323.764175 : Zygote:Preload End
9481.360175 : Zygote:Preload End
9550.741483 : Android:SysServerInit_START
10059.694100 : Android:PackageManagerService_Start
10326.429639 : Android:PMS_scan_START
10516.254332 : Android:PMS_scan_data_done:/system/framework
11297.080180 : Android:PMS_scan_data_done:/system/priv-app
12650.057491 : Android:PMS_scan_data_done:/system/app
12736.916952 : Android:PMS_scan_data_done:/system/vendor/operator/app
12768.057183 : Android:PMS_scan_data_done:/system/plugin
12771.374414 : Android:PMS_scan_data_done:/data/app
12780.415645 : Android:PMS_scan_END
12952.868184 : Android:PMS_READY
22793.776438 : Android:SysServerInit_END
24645.384365 : BOOT_Animation:END                     // 这里表示已经开进home界面。
24646.324673 : OFF
----------------------------------------
================ END of FILE ===============

(2) 若不能抓取mobielog,可以直接用uart log抓取,时间的分析可以参考FAQ14851 进入kernel前开机时间分析方法。

 

Android 系统重启关机流程分析

1.5 Android 系统重启关机流程分析

1.5.1 C语言中调用 reboot 函数

bionic/libc/unistd/reboot.c:33:

int reboot (int mode)

{

return __reboot( LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, mode,NULL );

}

1.5.2 通过 adb 让系统重启

adb reboot recovery 进入 recovery 模式

adb reboot bootloader 进入 fastboot 模式

adb reboot-bootloader

adb reboot 不带参数 系统正常重启

adb 是pc端工具,adbd是服务端,运行在手机

adbd 读取 socket 解析由 adb 传过来的命令串

int service_to_fd(const char *name)

if(!strncmp(name, "reboot:", 7)) {

void* arg = strdup(name + 7);

if(arg == 0) return -1;

ret = create_service_thread(reboot_service, arg);

system/core/adb/services.c:176:

void reboot_service(int fd, void *arg)

{

。。。

ret = __reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2,

LINUX_REBOOT_CMD_RESTART2, (char *)arg);

。。。

}

bionic/libc/kernel/common/Linux/reboot.h

#define LINUX_REBOOT_CMD_RESTART 0x01234567

#define LINUX_REBOOT_CMD_HALT 0xCDEF0123

kernel/include/linux/reboot.h:33:

#define LINUX_REBOOT_CMD_RESTART2 0xA1B2C3D4

arg 对应字符串: recovery bootloader

./kernel/arch/arm/mach-msm/pm2.c

system/core/adb/commandline.c

if (!strcmp(argv[0], "reboot-bootloader"))

snprintf(command, sizeof(command), "reboot:bootloader");

如果输入 adb reboot-bootloader adb 会对该命令进行转换 相当于执行 adb rebootbootloader

1.5.3 fastboot 模式下系统重启

fastboot reboot 系统正常重启

fastboot reboot-bootloader 重启进入fastboot 模式

fastboot 是 appboot 提供的功能,可以用它来烧写 system 等镜像文件

bootable/bootloader/lk/app/aboot/aboot.c

APP_START(aboot)

.init = aboot_init,

void aboot_init(const struct app_descriptor *app)

。。。

fastboot_register("reboot", cmd_reboot);

fastboot_register("reboot-bootloader",cmd_reboot_bootloader);

。。。

void cmd_reboot(const char *arg, void *data, unsigned sz)

{

dprintf(INFO, "rebooting the device\n");

fastboot_okay("");

reboot_device(0);

}

void cmd_reboot_bootloader(const char *arg, void *data, unsignedsz)

{

dprintf(INFO, "rebooting the device\n");

fastboot_okay("");

reboot_device(FASTBOOT_MODE);

}

bootable/bootloader/lk/target/msm7630_surf/init.c:311:

void reboot_device(unsigned reboot_reason)

bootable/bootloader/lk/target/msm7627_ffa/init.c:174:

void reboot_device(unsigned reboot_reason)

void reboot_device(unsigned reboot_reason)

{

reboot(reboot_reason);

}

调用的是c函数:

bionic/libc/unistd/reboot.c:33:

int reboot (int mode)

{

return __reboot( LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, mode,NULL );

}

bootable/bootloader/lk/app/aboot/aboot.c:59:

#define FASTBOOT_MODE 0x77665500

if (!strcmp(cmd, "bootloader")) {

restart_reason = 0x77665500;

}

1.5.4 系统关机

正常按键关机

./frameworks/policies/base/phone/com/android/internal/policy/impl/PhoneWindowManager.Java

void showGlobalActionsDialog()

mGlobalActions.showDialog(keyguardShowing,isDeviceProvisioned());

调用文件:

./frameworks/policies/base/phone/com/android/internal/policy/impl/GlobalActions.java

中的函数:

public void showDialog(boolean keyguardShowing, booleanisDeviceProvisioned)

mDialog = createDialog();

调用本文件中的函数:

private AlertDialog createDialog()

public void onPress() {

ShutdownThread.shutdownAfterDisablingRadio(mContext, true);

}

调用文件:

./frameworks/policies/base/phone/com/android/internal/policy/impl/ShutdownThread.java

中的函数:

public static void shutdownAfterDisablingRadio(final Contextcontext, boolean confirm)

beginShutdownSequence(context)

调用本文件中的函数:

private static void beginShutdownSequence(Context context)

sInstance.start()

进入关机线程的run函数:

public void run() {

首先关蓝牙,关射频,然后再关电源

...

sBluetooth.disable(false)

...

sPhone.setRadio(false)

...

SystemClock.sleep(PHONE_STATE_POLL_SLEEP_MSEC);

...

Power.shutdown()

}

frameworks/base/core/java/android/os/Power.java:92:

public static native void shutdown();

frameworks/base/core/jni/android_os_Power.cpp:107:

{ "shutdown", "()V", (void*)android_os_Power_shutdown },

jni 调用

static void android_os_Power_shutdown(JNIEnv *env, jobjectclazz)

{

sync();

#ifdef HAVE_ANDROID_OS

reboot(RB_POWER_OFF);

#endif

}

因为有 bionic/libc/include/sys/reboot.h:42:

#define RB_POWER_OFF LINUX_REBOOT_CMD_POWER_OFF

所以实际相对执行

reboot(LINUX_REBOOT_CMD_POWER_OFF);

__reboot( LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2,LINUX_REBOOT_CMD_POWER_OFF, NULL );

这里的 __reboot 是libc中的系统调用

bionic/libc/arch-x86/syscalls/__reboot.S

#include<sys/linux-syscalls.h>

.text

.type __reboot, #function

.globl __reboot

.align 4

.fnstart

__reboot:

.save {r4, r7}

stmfd sp!, {r4, r7}

ldr r7, =__NR_reboot

swi #0

ldmfd sp!, {r4, r7}

movs r0, r0

bxpl lr

b __set_syscall_errno

.fnend

1.5.5 内核中的系统调用 reboot

__NR_reboot 执行的是内核中的系统调用:

kernel/kernel/sys.c:310:

SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int,cmd,

void __user *, arg)

{

char buffer[256];

int ret = 0;

if (!capable(CAP_SYS_BOOT))

return -EPERM;

if (magic1 != LINUX_REBOOT_MAGIC1 ||

(magic2 != LINUX_REBOOT_MAGIC2&&

magic2 != LINUX_REBOOT_MAGIC2A&&

magic2 != LINUX_REBOOT_MAGIC2B&&

magic2 != LINUX_REBOOT_MAGIC2C))

return -EINVAL;

if ((cmd == LINUX_REBOOT_CMD_POWER_OFF)&& !pm_power_off)

cmd = LINUX_REBOOT_CMD_HALT;

lock_kernel();

switch (cmd) {

case LINUX_REBOOT_CMD_RESTART:

kernel_restart(NULL);

break;

case LINUX_REBOOT_CMD_CAD_ON:

C_A_D = 1;

break;

case LINUX_REBOOT_CMD_CAD_OFF:

C_A_D = 0;

break;

case LINUX_REBOOT_CMD_HALT:

kernel_halt();

unlock_kernel();

do_exit(0);

panic("cannot halt");

case LINUX_REBOOT_CMD_POWER_OFF:

kernel_power_off();

unlock_kernel();

do_exit(0);

break;

case LINUX_REBOOT_CMD_RESTART2:

if (strncpy_from_user(&buffer[0], arg,sizeof(buffer) - 1) < 0) {

unlock_kernel();

return -EFAULT;

}

buffer[sizeof(buffer) - 1] = '\0';

kernel_restart(buffer);

break;

#ifdef CONFIG_KEXEC

case LINUX_REBOOT_CMD_KEXEC:

ret = kernel_kexec();

break;

#endif

#ifdef CONFIG_HIBERNATION

case LINUX_REBOOT_CMD_SW_SUSPEND:

ret = hibernate();

break;

#endif

default:

ret = -EINVAL;

break;

}

unlock_kernel();

return ret;

}

void kernel_restart(char *cmd)

{

kernel_restart_prepare(cmd);

if (!cmd)

printk(KERN_EMERG "Restarting system.\n");

else

printk(KERN_EMERG "Restarting system with command '%s'.\n",cmd);

machine_restart(cmd);

}

kernel/kernel/sys.c:341:

void kernel_power_off(void)

{

kernel_shutdown_prepare(SYSTEM_POWER_OFF);

if (pm_power_off_prepare)

pm_power_off_prepare();

disable_nonboot_cpus();

sysdev_shutdown();

printk(KERN_EMERG "Power down.\n");

machine_power_off();

}

./kernel/arch/arm/kernel/process.c:219:

void machine_restart(char *cmd)

{

arm_pm_restart(reboot_mode, cmd);

}

void machine_power_off(void)

{

if (pm_power_off)

pm_power_off();

}

因为./kernel/arch/arm/mach-msm/pm2.c:1740:中有:

arm_pm_restart = msm_pm_restart;

pm_power_off = msm_pm_power_off;

所以 arm_pm_restart 调用的是:

static void msm_pm_restart(char str, const char *cmd)

{

msm_rpcrouter_close();

msm_proc_comm(PCOM_RESET_CHIP, &restart_reason,0);

for (;;)

;

}

pm_power_off 调用的是:

static void msm_pm_power_off(void)

{

msm_rpcrouter_close();

msm_proc_comm(PCOM_POWER_DOWN, 0, 0);

for (;;)

;

}

msm_proc_comm 是芯片级别的操作

msm_proc_comm_reset_modem_now 对modem芯片进行重启

kernel/arch/arm/mach-msm/proc_comm.c:98:

int msm_proc_comm(unsigned cmd, unsigned *data1, unsigned*data2)

{

。。。

writel(cmd, base + APP_COMMAND);

writel(data1 ? *data1 : 0, base + APP_DATA1);

writel(data2 ? *data2 : 0, base + APP_DATA2);

。。。

}

内核里面writel是如何实现的

http://blog.chinaunix.NET/u2/77776/showart_1404857.html

补充信息:

static int msm_reboot_call

(struct notifier_block *this, unsigned long code, void*_cmd)

{

if ((code == SYS_RESTART) &&_cmd) {

char *cmd = _cmd;

if (!strcmp(cmd, "bootloader")) {

restart_reason = 0x77665500;

} else if (!strcmp(cmd, "recovery")) {

restart_reason = 0x77665502;

} else if (!strcmp(cmd, "eraseflash")) {

restart_reason = 0x776655EF;

} else if (!strncmp(cmd, "oem-", 4)) {

unsigned code = simple_strtoul(cmd + 4, 0, 16) &0xff;

restart_reason = 0x6f656d00 | code;

} else {

restart_reason = 0x77665501;

}

}

return NOTIFY_DONE;

}

static struct notifier_block msm_reboot_notifier = {

.notifier_call = msm_reboot_call,

};

static int __init msm_pm_init(void)

register_reboot_notifier(&msm_reboot_notifier);

内核编译相关:

kernel/arch/arm/mach-msm/pm2.c:1701: restart_reason =0x77665500;

kernel/arch/arm/mach-msm/pm.c:696: restart_reason =0x77665500;

kernel/arch/arm/mach-msm/Makefile:84:

ifdef CONFIG_MSM_N_WAY_SMSM

obj-$(CONFIG_PM) += pm2.o

else

obj-$(CONFIG_PM) += pm.o

endif

kernel/arch/arm/configs/msm7630-perf_defconfig:256:CONFIG_MSM_N_WAY_SMSM=y

kernel/arch/arm/configs/msm7627-perf_defconfig:247:CONFIG_MSM_N_WAY_SMSM=y

make -C kernelO=../out/target/product/msm7627_ffa/obj/KERNEL_OBJ ARCH=armCROSS_COMPILE=arm-eabi- msm7627-perf_defconfig

out/target/product/msm7627_ffa/obj/KERNEL_OBJ/.config

CONFIG_MSM_N_WAY_SMSM=y



linux之调度管理(8)-SMP cpu 的 psci启动 psci是arm提供的一套电源管理接口,当前一共包含0.1、0.2和1.0三个版本。它可被用于以下场景:(1)cpu的idle管理(2)cpu hotplug以及secondary cpu启动(3)系统shutdown和reset但该接口不包含dvfs和设备电源管理(如像GPU之类的外设电源管理)功能。由于psci与虚拟化以及trust os有一定的关联,为了专注于电源管理相关的实现,故本系列的介绍都不涉及与它们相关的内容。 阅读详情

相关推荐

深度剖析Seata源码

本文详细分析了Seata分布式事务框架从服务端启动到客户端使用的全流程。服务端启动阶段会创建线程池、基于Netty搭建服务端,并初始化协调者处理事务请求。客户端通过@GlobalTransaction注解开启分布式事务,利用Spring Boot自动装配机制扫描配置。文章建议读者使用Seata 1.4.2版本配合源码调试,并提供了具体配置示例和模块调整说明。作者还介绍了源码阅读方法,包括移除特定模块和修改配置文件的步骤。整体内容涵盖Seata AT模式的核心实现,包括服务端协调机制和客户端注解驱动的事务管理

禅与计算机程序设计的艺术 1304

reboot 流程

前言 对于生在智能时代的我们,对关机重启这两个概念肯定不会陌生,尤其经历早期Android智能机的人们,印象最深恐怕就是重启,当然现在不会了,还没有改过来的都被淘汰了。在Linux系统中我们使用reboot完成这个动作。 应用层 重启reboot基本上都是通过一条命令实现,之所以聊一下应用层,主要是新的系统中reboot shutdown halt sleep等,这些操作被systemd统一管理了,我们简单看一下,不做深入研究 ...

我的专栏 7948

CentOS 7下rsyslog日志服务器搭建全攻略:从安装到避坑

本文详细介绍了在CentOS 7系统上搭建rsyslog日志服务器的完整流程,从基础安装到高级配置,包括协议设置、日志模板设计、安全加固和性能优化。特别分享了生产环境中的实战技巧和常见问题解决方案,帮助用户高效构建可靠的日志管理系统

happy2的博客 673

android启动失败,分区metadata没找到

android启动失败,分区metadata没找到

m0_37287937的博客 6492

android 系统重启关机流程分析

1.5 android 系统重启关机流程分析 1.5.1 c语言中调用 reboot 函数 bionic/libc/unistd/reboot.c:33: int reboot (int mode) { return __reboot( LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, mode,NULL ); } 1.5.2 通过 adb 让系统

Linux and C 2949

解决高通刷机进fastboot模式后设备就自动重启的问题

高通刷版本进fastboot后识别不到设备的问题

weixin_42142032的博客 7866

ADB命令

ADB命 此文章内容整合自网络,欢迎转载。 我相信做Android开发的朋友都用过ADB命令,但是也只是限于安装应用push文件和设备重启相关,更深的就不知道了,其实我们完全可以了解多一点,有一些不常用的场景我们至少应该知道它可以做到,比如,我们知道adb install 却不知道

SL_ss123的博客 2226

android 重启应用方式有几种?

4、最有用代码应用定时重启,不需要看门狗。3、adb 命令进行应用重启

七天不过夜的专栏 6911

android 关机 流程_android 关机重启流程

在PowerManager的API文档中,给出了一个关机/重启接口:public void reboot (String reason)对于这个接口的描述很简单,就是几句话。接口的作用就是重启设备,而且,就算重启成功了也没有返回值。需要包含REBOOT权限,也就是android.permission.REBOOT唯一参数reason代表需要的特定重启模式,比如recovery,当然也可以为null...

weixin_30186743的博客 592

新路程------imx6q的reboot过程

之前的看门狗时好时坏,最后发现是输出wdog_B的电容过小导致低电平时间太短,于是看了一下为什么reboot命令最后会以拉低这个gpio为结果,参考代码分析:    reboot先来到 /kernel/sys.c中 void kernel_restart(char *cmd) { kernel_restart_prepare(cmd); if (!cmd) printk(KERN_E

u013308744的专栏 1676

[RK3399][Android7.1] 系统重启调用过程(PSCI)

https://blog.csdn.net/kris_fei/article/details/81207133 Platform: RK3399  OS: Android 7.1  Kernel: v4.4.83 系统重启调用和rk3288基本类似,只是rk3399平台对应的arm_pm_restart不同了。 rk3288的可参考  [RK3288][Android6.0] 系统重启调用过...

9527的专栏 1675

android L 关机流程

do_msm_poweroff()与do_msm_restart()都设置了dload,PMIC,唯一不同的是do_msm_restart()里多了一个__raw_writel的动作,即reason写入IMEM,目的在于重启进入sbl1时判断应该进入那种模式,如我们开发用的bootloader模式,恢复出厂设置的recovery模式等。//也是用bootanim进程,跟开关动画一样的方式。

Venus 的博客 982

Android 系统重启原因分析

重启原因分类 1.上层造成重启 system_server被杀 watchdog重启 重要线程阻塞 2.kernel造成重启 空指针 非法地址 3.kernel watchdog造成重启,原因不确定 内存原因 nand驱动 log查看步骤及关键字 1. 重启后的kernel.log或misc/cmdline.log 在log最前面,会有很长的一段,如: initrd=0x85500000,0x204229 apv="td860-user 4.1.2 MocorDroid4.1.2 ...

qq_25815655的博客 4901

arm64-reboot流程

ARM64-reboot流程 文章目录ARM64-reboot流程1. 用户态reboot 执行流程2. 内核系统调用3. PSCI 电源状态协调接口3.1 kernel发起的`PSCI`复位3.2 TrustZone的异常处理 1. 用户态reboot 执行流程 当命令行输入reboot命令时,busybox会vfork一个子进程,调用reboot函数: 此时,reboot函数进入到libc,libc里面封装了Linux的系统调用: 2. 内核系统调用 这样就进入到了Linux的系统调用部分的代码:校

weixin_38878510的博客 4644

Android启动过程

由于IO操作的过程中,写入文件并非立刻就会真正意义上写入物理磁盘,以及在写入文件的过程中还可能中断或者出错等原因的考虑,采用的策略是先将老的文件package-usage.list,重命为增加后缀package-usage.list.bak;PM.reboot最终也就是setprop sys.powerctl,那么谁来监听sys.powerctl 值呢,是init没错是init,接下来重点介绍init,//根据haltMode 区分,reboot,shutdown,rebootsafemode。

fenghanfenghan的博客 651

Android关机重启流程(三)

一、回顾 前面我们从最开始的PM.reboot(),经过层层调用,最终调用libc库得reboot和syscall,也正式开始从用户空间切到到内核空间。 二、内核重启流程 kernel/reboot.c arch/arm64/kernel/process.c 2.1  SYSCALL_DEFINE4(reboot 内核空间reboot入口 /* * Reboot system c...

anlory的专栏 1895

android睡眠唤醒 一】MTK 唤醒时间分析

mtk唤醒时间分析

frank_zyp的博客 6168

linux reset 分析

遇到个系统reset的问题,简单看了下kernel reset的代码,简单记录下: 简单看下log: [   25.900749] Restarting system with command 'recovery'. [   25.901449] arch_reset: cmd = recovery [   25.901981] wdt_arch_reset called@Kernel

李子的备忘录 4303

linux reboot流程

在kernel根文件系统下做了实验,在命令行输入reboot,加log,跟踪代码。主要用于自己的学习总结。 SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd, void __user *, arg) struct pid_namespace *pid_ns = task_active_pid_ns(cur

helloyizhou的博客 4890
上一篇: android休眠唤醒流程:
下一篇: ARM-Linux移植之(一)——内核启动流程分析
ffmxnjm
博客等级 码龄11年 241粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值