解决method ID not in [0, 0xffff]: 65536错误的方法

本文解决了图片加载时出现的DexIndexOverflowException错误。通过在build.gradle中启用multiDex并添加multidex依赖来解决64k方法数量限制问题。

最近在做图片加载的时候出现Error:Execution failed for task ‘:app:transformClassesWithDexForDebug’.

com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536不知道怎么解决,于是百度了很久才找到答案,在此记录一下,好像是出现了超出了64k的限制
在 app 的build.gradle下添加两句就可以了

 defaultConfig {
...
multiDexEnabled true
    }`

dependencies {
compile ‘com.android.support:multidex:’
}
“`
点击一下Sync Now重新编译一下就可以

root@imx91-11x11-lpddr4-evk:~# GST_DEBUG=3 gst-launch-1.0 -v --gst-debug=qos:5 alsasrc device=hw:CARD=imxaudioxcvr,DEV=0 do-timestamp=true !emux ! decodebin ! audioconvert ! audioresample ! audio/x-raw,format=F32LE,channels=2,rate=48000 ! usrpp ! audioconvert ! identity ! alsasinD=otk6263bmaudio,DEV=0 sync=true qos=true spdif parser version: SPDIFPARSER_00.00.03 build on Mar 19 2025 10:47:37 file: /usr/lib/imx-mm/parser/libspdifparser.so information 1 gst_usrpp_init stat failed: No such file or directory read sona paras. successed! sona in normal mode!! stat failed: No such file or directory saef parse default config ok saef use user paramStr V1 sona init, inch/outCH: 2/2, fs:48000, framelen:480 ############################################# load audio flow topology from config [flow]: input:2,output:2,subflow:2, fir-options;0 audio load params from user buffer ############################################# @@#######fade out:960, mute:960, 0xe6bf78c0####@@ audioaef create ok saef init OK! [sona]aef update==> sample_rate:48000 group_mode:0 set_voice_enhance_vol:0 usr_set_voice_gain:0 Setting pipeline to PAUSED ... usrpp-GST_STATE_CHANGE_NULL_TO_READY usrpp-GST_STATE_CHANGE_READY_TO_PAUSED 0:00:00.095550708 1172 0xffff90000eb0 FIXME default gstutils.c:4089:gst_element_decorate_stream_id_internal:<alsasrc0> Creating random stream-id, consider implementing a deterministic way of creating a stream-id Pipeline is live and does not need PREROLL ... Pipeline is PREROLLED ... Setting pipeline to PLAYING ... usrpp-GST_STATE_CHANGE_PAUSED_TO_PLAYING New clock: GstAudioSrcClock /GstPipeline:pipeline0/GstAlsaSrc:alsasrc0: actual-buffer-time = 203174 /GstPipeline:pipeline0/GstAlsaSrc:alsasrc0: actual-latency-time = 10158 Redistribute latency... /GstPipeline:pipeline0/GstAlsaSrc:alsasrc0.GstPad:src: caps = audio/x-iec958, format=(string)U32LE, layout=(string)interleaved, rate=(int)44100, channels=(int)2, channel-mask=(bitmask)0x0000000000000003 /GstPipeline:pipeline0/GstQueue:queue0.GstPad:src: caps = audio/x-iec958, format=(string)U32LE, layout=(string)interleaved, rate=(int)44100, channels=(int)2, channel-mask=(bitmask)0x0000000000000003 /GstPipeline:pipeline0/GstSpdifDemux:spdifdemux0.GstPad:sink: caps = audio/x-iec958, format=(string)U32LE, layout=(string)interleaved, rate=(int)44100, channels=(int)2, channel-mask=(bitmask)0x0000000000000003 /GstPipeline:pipeline0/GstQueue:queue0.GstPad:sink: caps = audio/x-iec958, format=(string)U32LE, layout=(string)interleaved[29941.360445] set sysclk tx_id = 1 , rate=(int)44100[29941.365644] otk6263bm_hw_params: fs = 48000, bit_width = 32 , channels=(int)2, channel-mask=(bitmask)0x0000000000000003 /GstPipeline:pipeline0/GstSpdifDemux:spdifdemux0.GstPad:src: caps = audio/x-raw, format=(string)S16LE, channels=(int)2, rate=(int)48000, layout=(string)interleaved /GstPipeline:pipeline0/GstDecodeBin:decodebin0.GstGhostPad:sink.GstProxyPad:proxypad0: caps = audio/x-raw, format=(string)S16LE, channels=(int)2, rate=(int)48000, layout=(string)interleaved /GstPipeline:pipeline0/GstDecodeBin:decodebin0/GstTypeFindElement:typefind.GstPad:src: caps = audio/x-raw, format=(string)S16LE, channels=(int)2, rate=(int)48000, layout=(string)interleaved /GstPipeline:pipeline0/GstAudioConvert:audioconvert0.GstPad:src: caps = audio/x-raw, rate=(int)48000, format=(string)F32LE, channels=(int)2, layout=(string)interleaved, channel-mask=(bitmask)0x0000000000000003 /GstPipeline:pipeline0/GstAudioResample:audioresample0.GstPad:src: caps = audio/x-raw, rate=(int)48000, format=(string)F32LE, channels=(int)2, layout=(string)interleaved, channel-mask=(bitmask)0x0000000000000003 /GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:src: caps = audio/x-raw, rate=(int)48000, format=(string)F32LE, channels=(int)2, layout=(string)interleaved, channel-mask=(bitmask)0x0000000000000003 /GstPipeline:pipeline0/GstUsrpp:usrpp0.GstPad:src: caps = audio/x-raw, rate=(int)48000, format=(string)F32LE, channels=(int)2, layout=(string)interleaved, channel-mask=(bitmask)0x0000000000000003 /GstPipeline:pipeline0/GstAudioConvert:audioconvert1.GstPad:src: caps = audio/x-raw, rate=(int)48000, format=(string)S32LE, channels=(int)2, layout=(string)interleaved, channel-mask=(bitmask)0x0000000000000003 /GstPipeline:pipeline0/GstIdentity:identity0.GstPad:src: caps = audio/x-raw, rate=(int)48000, format=(string)S32LE, channels=(int)2, layout=(string)interleaved, channel-mask=(bitmask)0x0000000000000003 0:00:00.274451417 1172 0xffff90000d10 WARN alsa pcm_hw.c:1429:snd_pcm_hw_get_chmap: alsalib error: Cannot read Channel Map ctl: No such file or directory Redistribute latency... /GstPipeline:pipeline0/GstAlsaSink:alsasink0.GstPad:sink: caps = audio/x-raw, rate=(int)48000, format=(string)S32LE, channels=(int)2, layout=(string)interleaved, channel-mask=(bitmask)0x0000000000000003 /GstPipeline:pipeline0/GstIdentity:identity0.GstPad:sink: caps = audio/x-raw, rate=(int)48000, format=(string)S32LE, channels=(int)2, layout=(string)interleaved, channel-mask=(bitmask)0x0000000000000003 /GstPipeline:pipeline0/GstAudioConvert:audioconvert1.GstPad:sink: caps = audio/x-raw, rate=(int)48000, format=(string)F32LE, channels=(int)2, layout=(string)interleaved, channel-mask=(bitmask)0x0000000000000003 /GstPipeline:pipeline0/GstUsrpp:usrpp0.GstPad:sink: caps = audio/x-raw, rate=(int)48000, format=(string)F32LE, channels=(int)2, layout=(string)interleaved, channel-mask=(bitmask)0x0000000000000003 /GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:sink: caps = audio/x-raw, rate=(int)48000, format=(string)F32LE, channels=(int)2, layout=(string)interleaved, channel-mask=(bitmask)0x0000000000000003 /GstPipeline:pipeline0/GstAudioResample:audioresample0.GstPad:sink: caps = audio/x-raw, rate=(int)48000, format=(string)F32LE, channels=(int)2, layout=(string)interleaved, channel-mask=(bitmask)0x0000000000000003 /GstPipeline:pipeline0/GstAudioConvert:audioconvert0.GstPad:sink: caps = audio/x-raw, format=(string)S16LE, channels=(int)2, rate=(int)48000, layout=(string)interleaved /GstPipeline:pipeline0/GstDecodeBin:decodebin0.GstDecodePad:src_0.GstProxyPad:proxypad1: caps = audio/x-raw, format=(string)S16LE, channels=(int)2, rate=(int)48000, layout=(string)interleaved /GstPipeline:pipeline0/GstDecodeBin:decodebin0/GstTypeFindElement:typefind.GstPad:sink: caps = audio/x-raw, format=(string)S16LE, channels=(int)2, rate=(int)48000, layout=(string)interleaved /GstPipeline:pipeline0/GstDecodeBin:decodebin0.GstGhostPad:sink: caps = audio/x-raw, format=(string)S16LE, channels=(int)2, rate=(int)48000, layout=(string)interleaved Redistribute latency... 0:17:34.6 / 99:99:99. 0:17:34.8 / 99:99:99. 0:17:35.0 / 99:99:99. 0:17:35.2 / 99:99:99. 0:17:35.5 / 99:99:99. 0:17:35.6 / 99:99:99. 0:56:36.593882786 1172 0xffff80003290 WARN alsa gstalsasrc.c:916:xrun_recovery:<alsasrc0> xrun recovery -32: Broken pipe 1:36:18.105354672 1172 0xffff80003290 WARN alsa gstalsasrc.c:916:xrun_recovery:<alsasrc0> xrun recovery -32: Broken pipe 2:23:04.037127385 1172 0xffff80003290 WARN alsa gstalsasrc.c:916:xrun_recovery:<alsasrc0> xrun recovery -32: Broken pipe 3:12:32.093806633 1172 0xffff80003290 WARN alsa gstalsasrc.c:916:xrun_recovery:<alsasrc0> xrun recovery -32: Broken pipe 3:12:53.462586893 1172 0xffff80003290 WARN alsa gstalsasrc.c:916:xrun_recovery:<alsasrc0> xrun recovery -32: Broken pipe 4:53:28.957369271 1172 0xffff80003290 WARN alsa gstalsasrc.c:916:xrun_recovery:<alsasrc0> xrun recovery -32: Broken pipe 6:08:30.637897668 1172 0xffff80003290 WARN alsa gstalsasrc.c:916:xrun_recovery:<alsasrc0> xrun recovery -32: Broken pipe 7:47:17.561681994 1172 0xffff80003290 WARN alsa gstalsasrc.c:916:xrun_recovery:<alsasrc0> xrun recovery -32: Broken pipe 8:54:17.309300453 1172 0xffff80003290 WARN alsa gstalsasrc.c:916:xrun_recovery:<alsasrc0> xrun recovery -32: Broken pipe 9:27:44.202534076 1172 0xffff80003290 WARN alsa gstalsasrc.c:916:xrun_recovery:<alsasrc0> xrun recovery -32: Broken pipe 16:58:00.213858000 1172 0xffff80003290 WARN alsa gstalsasrc.c:916:xrun_recovery:<alsasrc0> xrun recovery -32: Broken pipe 20:40:25.685133364 1172 0xffff80003290 WARN alsa gstalsasrc.c:916:xrun_recovery:<alsasrc0> xrun recovery -32: Broken pipe 23:04:20.393014481 1172 0xffff80003290 WARN alsa gstalsasrc.c:916:xrun_recovery:<alsasrc0> xrun recovery -32: Broken pipe 25:08:08.286040648 1172 0xffff80003290 WARN alsa gstalsasrc.c:916:xrun_recovery:<alsasrc0> xrun recovery -32: Broken pipe 26:48:10.393934093 1172 0xffff80003290 WARN alsa gstalsasrc.c:916:xrun_recovery:<alsasrc0> xrun recovery -32: Broken pipe 26:54:09.333771514 1172 0xffff80003290 WARN alsa gstalsasrc.c:916:xrun_recovery:<alsasrc0> xrun recovery -32: Broken pipe 28:30:05.385358926 1172 0xffff80003290 WARN alsa gstalsasrc.c:916:xrun_recovery:<alsasrc0> xrun recovery -32: Broken pipe 29:02:14.717139804 1172 0xffff80003290 WARN alsa gstalsasrc.c:916:xrun_recovery:<alsasrc0> xrun recovery -32: Broken pipe 30:23:02.305647824 1172 0xffff80003290 WARN alsa gstalsasrc.c:916:xrun_recovery:<alsasrc0> xrun recovery -32: Broken pipe 30:44:59.414007910 1172 0xffff80003290 WARN alsa gstalsasrc.c:916:xrun_recovery:<alsasrc0> xrun recovery -32: Broken pipe 31:45:06.964985381 1172 0xffff80003290 WARN alsa gstalsasrc.c:916:xrun_recovery:<alsasrc0> xrun recovery -32: Broken pipe 34:21:45.503275195 1172 0xffff80003290 WARN alsa gstalsasrc.c:916:xrun_recovery:<alsasrc0> xrun recovery -32: Broken pipe 36:40:34.797645542 1172 0xffff80003290 WARN alsa gstalsasrc.c:916:xrun_recovery:<alsasrc0> xrun recovery -32: Broken pipe 36:58:24.432937302 1172 0xffff80003290 WARN alsa gstalsasrc.c:916:xrun_recovery:<alsasrc0> xrun recovery -32: Broken pipe 37:47:03.209638027 1172 0xffff80003290 WARN alsa gstalsasrc.c:916:xrun_recovery:<alsasrc0> xrun recovery -32: Broken pipe 40:05:21.925010651 1172 0xffff80003290 WARN alsa gstalsasrc.c:916:xrun_recovery:<alsasrc0> xrun recovery -32: Broken pipe 40:06:14.460266801 1172 0xffff80003290 WARN alsa gstalsasrc.c:916:xrun_recovery:<alsasrc0> xrun recovery -32: Broken pipe 41:09:52.553906913 1172 0xffff80003290 WARN alsa gstalsasrc.c:916:xrun_recovery:<alsasrc0> xrun recovery -32: Broken pipe 41:57:22.249710064 1172 0xffff80003290 WARN alsa gstalsasrc.c:916:xrun_recovery:<alsasrc0> xrun recovery -32: Broken pipe 42:04:09.052643300 1172 0xffff80003290 WARN alsa gstalsasrc.c:916:xrun_recovery:<alsasrc0> xrun recovery -32: Broken pipe 44:21:20.304274683 1172 0xffff80003290 WARN alsa gstalsasrc.c:916:xrun_recovery:<alsasrc0> xrun recovery -32: Broken pipe 47:56:42.396928386 1172 0xffff80003290 WARN alsa gstalsasrc.c:916:xrun_recovery:<alsasrc0> xrun recovery -32: Broken pipe 48:28:39.573733509 1172 0xffff80003290 WARN alsa gstalsasrc.c:916:xrun_recovery:<alsasrc0> xrun recovery -32: Broken pipe 49:28:00.823168415 1172 0xffff80003290 WARN alsa gstalsasrc.c:916:xrun_recovery:<alsasrc0> xrun recovery -32: Broken pipe 52:58:01.645041049 1172 0xffff80003290 WARN alsa gstalsasrc.c:916:xrun_recovery:<alsasrc0> xrun recovery -32: Broken pipe 53:34:14.833761502 1172 0xffff80003290 WARN alsa gstalsasrc.c:916:xrun_recovery:<alsasrc0> xrun recovery -32: Broken pipe 53:48:45.809662959 1172 0xffff80003290 WARN alsa gstalsasrc.c:916:xrun_recovery:<alsasrc0> xrun recovery -32: Broken pipe 54:29:09.743465615 1172 0xffff80003290 WARN alsa gstalsasrc.c:916:xrun_recovery:<alsasrc0> xrun recovery -32: Broken pipe 57:48:14.481363310 1172 0xffff80003290 WARN alsa gstalsasrc.c:916:xrun_recovery:<alsasrc0> xrun recovery -32: Broken pipe 58:41:28.665126542 1172 0xffff80003290 WARN alsa gstalsasrc.c:916:xrun_recovery:<alsasrc0> xrun recovery -32: Broken pipe 58:49:33.065980814 1172 0xffff80003290 WARN alsa gstalsasrc.c:916:xrun_recovery:<alsasrc0> xrun recovery -32: Broken pipe 60:03:16.941792174 1172 0xffff80003290 WARN alsa gstalsasrc.c:916:xrun_recovery:<alsasrc0> xrun recovery -32: Broken pipe 60:53:36.428675572 1172 0xffff80003290 WARN alsa gstalsasrc.c:916:xrun_recovery:<alsasrc0> xrun recovery -32: Broken pipe 61:36:58.643994438 1172 0xffff80003290 WARN alsa gstalsasrc.c:916:xrun_recovery:<alsasrc0> xrun recovery -32: Broken pipe 62:04:50.211562943 1172 0xffff80003290 WARN alsa gstalsasrc.c:916:xrun_recovery:<alsasrc0> xrun recovery -32: Broken pipe 62:47:12.736412447 1172 0xffff80003290 WARN alsa gstalsasrc.c:916:xrun_recovery:<alsasrc0> xrun recovery -32: Broken pipe 62:48:11.822958809 1172 0xffff80003290 WARN alsa gstalsasrc.c:916:xrun_recovery:<alsasrc0> xrun recovery -32: Broken pipe 63:53:25.727241383 1172 0xffff80003290 WARN alsa gst alsasrc.c:916:xrun_recovery:<alsasrc0> xrun recovery -32: Broken pipe 帮我分析下这个log
12-09
from scapy.all import * from scapy.packet import Packet, bind_layers from scapy.layers.inet import IP, UDP from scapy.fields import * import threading import time import struct import random import secrets import logging # 配置日志 logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) # 定义常量 SOMEIP_PORT = 30490 DEFAULT_SRC_PORT_RANGE = (30000, 40000) MAX_SESSION_ID = 0xFFFF MSG_TYPE_REQUEST = 0x01 MSG_TYPE_REQUEST_NO_RET = 0x02 MSG_TYPE_NOTIFICATION = 0x80 RETURN_CODE_OK = 0x00 # 自定义SOME/IP协议层 class SOMEIP(Packet): name = "SOME/IP" fields_desc = [ XShortField("service_id", 0x1234), XShortField("method_id", 0x0001), IntField("length", None), # 设置为None,在post_build中自动计算 XShortField("client_id", 0x0003), XShortField("session_id", 0x0001), ByteField("proto_ver", 0x01), ByteField("iface_ver", 0x01), ByteField("msg_type", MSG_TYPE_REQUEST_NO_RET), ByteField("return_code", RETURN_CODE_OK) ] def post_build(self, p, pay): """自动计算并填充长度字段""" if self.length is None: length = len(pay) + 8 # 计算长度 p = p[:4] + struct.pack("!I", length) + p[8:] return p + pay # 将SOME/IP协议绑定到UDP端口 bind_layers(UDP, SOMEIP, dport=SOMEIP_PORT) bind_layers(UDP, SOMEIP, sport=SOMEIP_PORT) class SomeIPSender: """SOME/IP 报文发送类""" def __init__(self, dst_ip, dst_port=SOMEIP_PORT, src_ip=None, src_port=None): """ 初始化发送器 :param dst_ip: 目标IP地址 :param dst_port: 目标端口 (默认 SOMEIP_PORT) :param src_ip: 源IP地址 (可选) :param src_port: 源端口 (可选) """ self.dst_ip = dst_ip self.dst_port = dst_port self.src_ip = src_ip self.src_port = src_port self.session_id = 0x0001 # 初始会话ID self.lock = threading.Lock() # 确保线程安全 def build_someip_packet(self, service_id, method_id, payload=None): """ 构建SOME/IP报文 :param service_id: 服务ID (16位) :param method_id: 方法ID (16位) :param payload: 有效载荷数据 (bytes格式) :return: 完整的SOME/IP报文 """ with self.lock: # 创建自定义的SOME/IP头 someip = SOMEIP( service_id=service_id, method_id=method_id, session_id=self.session_id, client_id=secrets.randbelow(0xFFFF) + 1, # 使用加密安全随机数 msg_type=MSG_TYPE_REQUEST ) # 增加会话ID用于下一个报文 self.session_id = (self.session_id + 1) % MAX_SESSION_ID # 构建完整报文 ip_layer = IP(dst=self.dst_ip, src=self.src_ip) if self.src_ip else IP(dst=self.dst_ip) udp_layer = UDP(dport=self.dst_port, sport=self.src_port or secrets.randbelow(10000) + DEFAULT_SRC_PORT_RANGE[0]) return ip_layer / udp_layer / someip / Raw(load=payload if payload else b'') def send_packet(self, service_id, method_id, payload=None, count=1, interval=0.1): """ 发送SOME/IP报文 :param service_id: 服务ID :param method_id: 方法ID :param payload: 有效载荷 :param count: 发送次数 :param interval: 发送间隔(秒) """ for _ in range(count): try: packet = self.build_someip_packet(service_id, method_id, payload) send(packet, verbose=False) time.sleep(interval) except Exception as e: logger.error(f"发送报文失败: {e}") class SomeIPReceiver: """SOME/IP 报文接收类""" def __init__(self, listen_ip="0.0.0.0", listen_port=SOMEIP_PORT): """ 初始化接收器 :param listen_ip: 监听IP (默认所有接口) :param listen_port: 监听端口 (默认 SOMEIP_PORT) """ self.listen_ip = listen_ip self.listen_port = listen_port self.running = False self.thread = None self.lock = threading.Lock() def _packet_handler(self, packet): """处理接收到的SOME/IP报文""" if not packet.haslayer(SOMEIP): return try: someip = packet[SOMEIP] src_port = packet[UDP].sport if UDP in packet else "N/A" logger.info(f"\n[+] 收到SOME/IP报文") logger.info(f" 来源: {packet[IP].src}:{src_port} → {packet[IP].dst}:{packet[UDP].dport}") logger.info(f" 服务ID: 0x{someip.service_id:04X}") logger.info(f" 方法ID: 0x{someip.method_id:04X}") logger.info(f" 客户端ID: 0x{someip.client_id:04X}") logger.info(f" 会话ID: 0x{someip.session_id:04X}") logger.info(f" 消息类型: 0x{someip.msg_type:02X}") logger.info(f" 返回码: 0x{someip.return_code:02X}") if packet.haslayer(Raw): payload = bytes(packet[Raw]) logger.info(f" 有效载荷 ({len(payload)}字节): {payload.hex()}") try: decoded = payload.decode('utf-8', errors='replace') logger.info(f" 解码内容: {decoded}") except UnicodeDecodeError: logger.warning("无法解码有效载荷为UTF-8字符串") except Exception as e: logger.error(f"处理报文时发生错误: {e}") def start(self): """启动接收线程""" with self.lock: if self.running: logger.warning("接收器已在运行") return self.running = True self.thread = threading.Thread(target=self._run_sniffer) self.thread.daemon = True self.thread.start() logger.info(f"监听SOME/IP报文于 {self.listen_ip}:{self.listen_port}...") def _run_sniffer(self): """运行报文捕获循环""" filter_str = f"udp port {self.listen_port}" try: sniff( filter=filter_str, prn=self._packet_handler, store=0, stop_filter=lambda _: not self.running ) except Exception as e: logger.error(f"报文捕获异常: {e}") def stop(self): """停止接收线程""" with self.lock: if not self.running: return self.running = False if self.thread and self.thread.is_alive(): self.thread.join(timeout=2) logger.info("接收器已停止") if __name__ == "__main__": # 创建发送器实例 sender = SomeIPSender(dst_ip="192.168.201.101", dst_port=30490, src_ip="192.168.201.11", src_port=13400) recver=SomeIPReceiver(listen_ip='200') try: # 示例:发送SOME/IP报文 logger.info("\n发送测试报文...") sender.send_packet( service_id=0x0901, method_id=0x8001, payload=b"\01\02\03\04\01\02\03\04", count=300, interval=0.02 ) logger.info("\n发送另一个测试报文...") sender.send_packet( service_id=0x0901, method_id=0x0001, payload=bytes.fromhex("00112233445566778899AABBCCDDEEFF"), count=200, interval=0.01 ) except KeyboardInterrupt: logger.info("\n停止程序...") 优化一下代码,在接收到someip offer报文后,发送someip报文
最新发布
12-23
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值