adb shell dumpsys 使用命令和来源

这篇具有很好参考价值的文章主要介绍了adb shell dumpsys 使用命令和来源。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、概述

        adb shell dumpsys 在Android开发中经常要用到,平时都是零碎的积累,用到什么的时候就

记录下来,最近看了一些资料,发现可以汇总所有的命令,当带某个参数的时候,就可以查看具体

的信息, 本篇文章中还讲解了如何去找命令的源码和源头,供参考!

二、支持dumpsys命令的服务

1. 列出系统所有支持的dumpsys命令的服务


adb shell dumpsys | grep -i "DUMP OF SERVICE"

2. 支持dumpsys命令的服务

 adb shell service list
Found 203 services:
0	DockObserver: []
1	SurfaceFlinger: [android.ui.ISurfaceComposer]
2	VideoCallEngineService: []
3	accessibility: [android.view.accessibility.IAccessibilityManager]
4	account: [android.accounts.IAccountManager]
5	activity: [android.app.IActivityManager]
6	activity_task: [android.app.IActivityTaskManager]
7	adb: [android.debug.IAdbManager]
8	alarm: [android.app.IAlarmManager]
9	android.hardware.light.ILights/default: []
10	android.hardware.power.IPower/default: []
11	android.hardware.rebootescrow.IRebootEscrow/default: []
12	android.hardware.vibrator.IVibrator/default: []
13	android.os.UpdateEngineService: []
14	android.security.identity: [android.security.identity.ICredentialStoreFactory]
15	android.security.keystore: [android.security.keystore.IKeystoreService]
16	android.service.gatekeeper.IGateKeeperService: []
17	app_binding: []
18	app_integrity: [android.content.integrity.IAppIntegrityManager]
19	appops: [com.android.internal.app.IAppOpsService]
20	appwidget: [com.android.internal.appwidget.IAppWidgetService]
21	audio: [android.media.IAudioService]
22	auth: [android.hardware.biometrics.IAuthService]
23	autofill: [android.view.autofill.IAutoFillManager]
24	backup: [android.app.backup.IBackupManager]
25	battery: []
26	batteryproperties: [android.os.IBatteryPropertiesRegistrar]
27	batterystats: [com.android.internal.app.IBatteryStats]
28	binder_calls_stats: []
29	biometric: [android.hardware.biometrics.IBiometricService]
30	blob_store: [android.app.blob.IBlobStoreManager]
31	bluetooth_manager: [android.bluetooth.IBluetoothManager]
32	broadcastradio: [android.hardware.radio.IRadioService]
33	bugreport: [android.os.IDumpstate]
34	cacheinfo: []
35	carrier_config: [com.android.internal.telephony.ICarrierConfigLoader]
36	clipboard: [android.content.IClipboard]
37	color_display: [android.hardware.display.IColorDisplayManager]
38	companiondevice: [android.companion.ICompanionDeviceManager]
39	connectivity: [android.net.IConnectivityManager]
40	connmetrics: [android.net.IIpConnectivityMetrics]
41	consumer_ir: [android.hardware.IConsumerIrService]
42	content: [android.content.IContentService]
43	country_detector: [android.location.ICountryDetector]
44	cpuinfo: []
45	crossprofileapps: [android.content.pm.ICrossProfileApps]
46	dataloader_manager: [android.content.pm.IDataLoaderManager]
47	dbinfo: []
48	device_config: []
49	device_identifiers: [android.os.IDeviceIdentifiersPolicyService]
50	device_policy: [android.app.admin.IDevicePolicyManager]
51	deviceidle: [android.os.IDeviceIdleController]
52	devicestoragemonitor: []
53	diskstats: []
54	display: [android.hardware.display.IDisplayManager]
55	dnsresolver: []
56	dreams: [android.service.dreams.IDreamManager]
57	drm.drmManager: [drm.IDrmManagerService]
58	dropbox: [com.android.internal.os.IDropBoxManagerService]
59	dynamic_system: [android.os.image.IDynamicSystemService]
60	emergency_affordance: []
61	ethernet: [android.net.IEthernetManager]
62	external_vibrator_service: [android.os.IExternalVibratorService]
63	face: [android.hardware.face.IFaceService]
64	file_integrity: [android.security.IFileIntegrityService]
65	fingerprint: [android.hardware.fingerprint.IFingerprintService]
66	gfxinfo: []
67	gpu: [android.graphicsenv.IGpuService]
68	graphicsstats: [android.view.IGraphicsStats]
69	hardware_properties: [android.os.IHardwarePropertiesManager]
70	imms: [com.android.internal.telephony.IMms]
71	ims_doze_manager: [com.android.ims.internal.IImsDozeManager]
72	ims_ex: [com.android.ims.internal.IImsServiceEx]
73	ims_ut_ex: [com.android.ims.internal.IImsUtEx]
74	incident: []
75	incidentcompanion: [android.os.IIncidentCompanion]
76	incremental: [android.os.incremental.IIncrementalService]
77	input: [android.hardware.input.IInputManager]
78	input_method: [com.android.internal.view.IInputMethodManager]
79	inputflinger: [android.input.IInputFlinger]
80	installd: []
81	ions: [com.android.internal.telephony.IOns]
82	ions_ex: [com.android.unisoc.telephony.aidl.IOperatorNameHandler]
83	iphonesubinfo: [com.android.internal.telephony.IPhoneSubInfo]
84	ipsec: [android.net.IIpSecService]
85	irit: [com.android.unisoc.telephony.aidl.IRadioInteractor]
86	isms: [com.android.internal.telephony.ISms]
87	ismsEx: [com.android.internal.telephony.ISmsEx]
88	isub: [com.android.internal.telephony.ISub]
89	jobscheduler: [android.app.job.IJobScheduler]
90	launcherapps: [android.content.pm.ILauncherApps]
91	ledsrv: [android.os.ILedService]
92	lights: [android.hardware.lights.ILightsManager]
93	linkturbonative: []
94	location: [android.location.ILocationManager]
95	lock_settings: [com.android.internal.widget.ILockSettings]
96	looper_stats: []
97	manager: [android.os.IServiceManager]
98	media.audio_flinger: [android.media.IAudioFlinger]
99	media.audio_policy: [android.media.IAudioPolicyService]
100	media.camera: [android.hardware.ICameraService]
101	media.camera.proxy: [android.hardware.ICameraServiceProxy]
102	media.extractor: [android.IMediaExtractorService]
103	media.metrics: [android.media.IMediaMetricsService]
104	media.player: [android.media.IMediaPlayerService]
105	media.resource_manager: [android.media.IResourceManagerService]
106	media_projection: [android.media.projection.IMediaProjectionManager]
107	media_resource_monitor: [android.media.IMediaResourceMonitor]
108	media_router: [android.media.IMediaRouterService]
109	media_session: [android.media.session.ISessionManager]
110	meminfo: []
111	midi: [android.media.midi.IMidiManager]
112	mount: [android.os.storage.IStorageManager]
113	netd: []
114	netd_listener: [android.net.metrics.INetdEventListener]
115	netpolicy: [android.net.INetworkPolicyManager]
116	netstats: [android.net.INetworkStatsService]
117	network_adapter: [android.os.INetworkAdapterService]
118	network_management: [android.os.INetworkManagementService]
119	network_score: [android.net.INetworkScoreService]
120	network_stack: [android.net.INetworkStackConnector]
121	network_time_update_service: []
122	network_watchlist: [com.android.internal.net.INetworkWatchlistManager]
123	notification: [android.app.INotificationManager]
124	oem_lock: [android.service.oemlock.IOemLockService]
125	otadexopt: [android.content.pm.IOtaDexopt]
126	overlay: [android.content.om.IOverlayManager]
127	package: [android.content.pm.IPackageManager]
128	package_native: [android.content.pm.IPackageManagerNative]
129	performance_fw: [android.app.IPerformanceManagerInternal]
130	performancemanager: []
131	permission: [android.os.IPermissionController]
132	permissionmgr: [android.permission.IPermissionManager]
133	persistent_data_block: [android.service.persistentdata.IPersistentDataBlockService]
134	phone: [com.android.internal.telephony.ITelephony]
135	pinner: []
136	platform_compat: [com.android.internal.compat.IPlatformCompat]
137	platform_compat_native: [com.android.internal.compat.IPlatformCompatNative]
138	power: [android.os.IPowerManager]
139	power_ex: [android.os.sprdpower.IPowerManagerEx]
140	powerguru: [android.app.sprdpower.IPowerGuru]
141	print: [android.print.IPrintManager]
142	processinfo: [android.os.IProcessInfoService]
143	procstats: [com.android.internal.app.procstats.IProcessStats]
144	recovery: [android.os.IRecoverySystem]
145	restrictions: [android.content.IRestrictionsManager]
146	role: [android.app.role.IRoleManager]
147	rollback: [android.content.rollback.IRollbackManager]
148	runtime: []
149	scheduling_policy: [android.os.ISchedulingPolicyService]
150	search: [android.app.ISearchManager]
151	sec_key_att_app_id_provider: [android.security.keymaster.IKeyAttestationApplicationIdProvider]
152	sensor_privacy: [android.hardware.ISensorPrivacyManager]
153	sensorservice: [android.gui.SensorServer]
154	serial: [android.hardware.ISerialManager]
155	servicediscovery: [android.net.nsd.INsdManager]
156	settings: []
157	shortcut: [android.content.pm.IShortcutService]
158	simphonebook: [com.android.internal.telephony.IIccPhoneBookEx]
159	slice: [android.app.slice.ISliceManager]
160	soundtrigger: [com.android.internal.app.ISoundTriggerService]
161	soundtrigger_middleware: [android.media.soundtrigger_middleware.ISoundTriggerMiddlewareService]
162	sprd_power: []
163	sprdssense: [android.os.sprdpower.ISSense]
164	stats: [android.os.IStatsd]
165	statscompanion: [android.os.IStatsCompanionService]
166	statsmanager: [android.os.IStatsManagerService]
167	statusbar: [com.android.internal.statusbar.IStatusBarService]
168	storaged: [android.os.IStoraged]
169	storaged_pri: [android.os.storaged.IStoragedPrivate]
170	storagestats: [android.app.usage.IStorageStatsManager]
171	suspend_control: []
172	system_config: [android.os.ISystemConfig]
173	system_update: [android.os.ISystemUpdateManager]
174	telecom: [com.android.internal.telecom.ITelecomService]
175	telephony.registry: [com.android.internal.telephony.ITelephonyRegistry]
176	telephony_ims: [android.telephony.ims.aidl.IImsRcsController]
177	testharness: []
178	tethering: [android.net.ITetheringConnector]
179	textclassification: [android.service.textclassifier.ITextClassifierService]
180	textservices: [com.android.internal.textservice.ITextServicesManager]
181	thermalservice: [android.os.IThermalService]
182	time_detector: [android.app.timedetector.ITimeDetectorService]
183	time_zone_detector: [android.app.timezonedetector.ITimeZoneDetectorService]
184	trust: [android.app.trust.ITrustManager]
185	uimode: [android.app.IUiModeManager]
186	uni_carrierconfig: [com.android.internal.telephony.IUniCarrierConfigLoader]
187	uni_telephony: [com.android.internal.telephony.IUniTelephony]
188	updatelock: [android.os.IUpdateLock]
189	uri_grants: [android.app.IUriGrantsManager]
190	usagestats: [android.app.usage.IUsageStatsManager]
191	usb: [android.hardware.usb.IUsbManager]
192	user: [android.os.IUserManager]
193	vibrator: [android.os.IVibratorService]
194	voiceinteraction: [com.android.internal.app.IVoiceInteractionManagerService]
195	vold: []
196	wallpaper: [android.app.IWallpaperManager]
197	webviewupdate: [android.webkit.IWebViewUpdateService]
198	wifi: [android.net.wifi.IWifiManager]
199	wifinl80211: []
200	wifip2p: [android.net.wifi.p2p.IWifiP2pManager]
201	wifiscanner: [android.net.wifi.IWifiScanner]
202	window: [android.view.IWindowManager]

上面两条命令的结果相差不大,代表系统中可以通过adb shell dumpsys 服务名 去获取相应信息的命令

三、常用dumpsys命令

1. 查看AMS中所有信息

adb shell dumpsys activity

2. 查看内存信息

adb shell dumpsys meminfo

3. 查看电池信息

adb shell dumpsys battery

4. 显示alarm信息

adb shell dumpsys alarm

5. 显示内存状态

adb shell dumpsys procstats

6. 查看Window的相关信息

adb shell dumpsys window

7. 查看CPU相关信息

adb shell dumpsys cpuinfo

有些服务还可以带参数,如果不是很清楚细节,就加上 -h  参数

比如:

home@ubuntu:~$ adb shell dumpsys activity -h
Activity manager dump options:
  [-a] [-c] [-p PACKAGE] [-h] [WHAT] ...
  WHAT may be one of:
    a[ctivities]: activity stack state
    r[recents]: recent activities state
    b[roadcasts] [PACKAGE_NAME] [history [-s]]: broadcast state
    broadcast-stats [PACKAGE_NAME]: aggregated broadcast statistics
    i[ntents] [PACKAGE_NAME]: pending intent state
    p[rocesses] [PACKAGE_NAME]: process state
    o[om]: out of memory management
    perm[issions]: URI permission grant state
    prov[iders] [COMP_SPEC ...]: content provider state
    provider [COMP_SPEC]: provider client-side state
    s[ervices] [COMP_SPEC ...]: service state
    allowed-associations: current package association restrictions
    as[sociations]: tracked app associations
    exit-info [PACKAGE_NAME]: historical process exit information
    lmk: stats on low memory killer
    lru: raw LRU process list
    binder-proxies: stats on binder objects and IPCs
    settings: currently applied config settings
    service [COMP_SPEC]: service client-side state
    package [PACKAGE_NAME]: all state related to given package
    all: dump all activities
    top: dump the top activity
  WHAT may also be a COMP_SPEC to dump activities.
  COMP_SPEC may be a component name (com.foo/.myApp),
    a partial substring in a component name, a
    hex object identifier.
  -a: include all available server state.
  -c: include client state.
  -p: limit output to given package.
  --checkin: output checkin format, resetting data.
  --C: output checkin format, not resetting data.
  --proto: output dump in protocol buffer format.
  --autofill: dump just the autofill-related state of an activity

然后对照英文注释,带上不同的参数后,可以获取具体的信息:

adb shell dumpsys activity activities----------查看Activity组件信息
adb shell dumpsys activity services-----------查看Service组件信息
adb shell dumpsys activity providers----------产看ContentProvider组件信息
adb shell dumpsys activity broadcasts--------查看BraodcastReceiver信息
adb shell dumpsys activity intents--------------查看Intent信息
adb shell dumpsys activity processes---------查看进程信息
adb shell dumpsys activity intents -------- 查看 PendingIntentRecord 信息

四、命令来源

上述的这些命令都涉及到adb shell 命令,我们看看系统源头类

public abstract class BasicShellCommandHandler {

    //两个重要的方法:
    public abstract int onCommand(String cmd);

    public abstract void onHelp();

​​​​​​​}

onCommand方法 就是各个系统服务 adb shell 直接操作的方法:

比如 AMS 中的  启动一个activity

adb shell am start  -n com.DeviceTest/com.DeviceTest.VersionTestActivity

AMS 中的  启动一个service

adb shell am startservice -n com.tentent.mm/.plugin.acountsync.model.AcountAuthenticatorService
启动微信

AMS 中的 停止一个服务

adb shell am stopservice -n  xxxx

AMS 发送一个广播:

adb shell am broadcast  -a   android.intent.action.BOOT_COMPLETED  -n org.mazhuang.boottimemeasure/.BootCompletedReceiver
表示向 org.mazhuang.boottimemeasure/.BootCompletedReceiver 发送一个 BOOT_COMPLETED 

各系统服务中的 onShellCommand 方法:

adb shell dumpsys,Android 知识储备,dumpsys命令使用

最终都会复写onCommand 方法,比如AMS 中的 onCommand

public int onCommand(String cmd) {
        if (cmd == null) {
            return handleDefaultCommands(cmd);
        }
        final PrintWriter pw = getOutPrintWriter();
        try {
            switch (cmd) {
                case "start":
                case "start-activity":
                    return runStartActivity(pw);
                case "startservice":
                case "start-service":
                    return runStartService(pw, false);
                case "startforegroundservice":
                case "startfgservice":
                case "start-foreground-service":
                case "start-fg-service":
                    return runStartService(pw, true);
                case "stopservice":
                case "stop-service":
                    return runStopService(pw);
                case "broadcast":
                    return runSendBroadcast(pw);
                case "instrument":

到这里,就知道上述 adb shell  am 命令的是从哪里来的

我们在看看 PMS 相关的 命令:

adb shell pm uninstall com.example.MyApp    // 卸载一个应用

adb shell pm path :   查询package的安装位置

adb shell pm enable :使package或component可用。(如:pm enable "package/class")

adb shell pm disable :使package或component不可用。(如:pm disable "package/class")


adb shell pm list packages   :  查看所有应用列表

adb shell pm list packages -s   : 查看系统应用(system)列表

adb shell pm list packages -3  :  查看第三方应用


adb shell pm clear 包名  :   清除应用数据与缓存

同理,先进去 PMS中 看看 onShellCommand 方法, 然后最后也会复写 onCommand 方法:

public int onCommand(String cmd) {
        if (cmd == null) {
            return handleDefaultCommands(cmd);
        }

        final PrintWriter pw = getOutPrintWriter();
        try {
            switch (cmd) {
                case "path":
                    return runPath();
                case "validate":
                    return runValidate();
                case "dump":
                    return runDump();
                case "list":
                    return runList();
                case "resolve-activity":
                    return runResolveActivity();
                case "query-activities":
                    return runQueryIntentActivities();
                case "query-services":
                    return runQueryIntentServices();
                case "query-receivers":
                    return runQueryIntentReceivers();
                case "install":
                    return runInstall();

这样子,就找到命令的出处了,如果想知道原理,就继续去看每个方法中的实现逻辑。

同理,dumpsys 命令相关的源头,同样也可以查看每个服务中的 onHelp() 方法:

【备注】:只有部分服务有帮助打印信息

比如 我们想看看 电池服务(BatteryService)相关的信息,通过adb shell service list

找到电池的服务名:battery

adb shell dumpsys  battery -h   查看该命令的帮助信息:

Battery service (battery) commands:
  help
    Print this help text.
  set [-f] [ac|usb|wireless|status|level|temp|present|invalid] <value>
    Force a battery property value, freezing battery state.
    -f: force a battery change broadcast be sent, prints new sequence.
  unplug [-f]
    Force battery unplugged, freezing battery state.
    -f: force a battery change broadcast be sent, prints new sequence.
  reset [-f]
    Unfreeze battery state, returning to current hardware values.
    -f: force a battery change broadcast be sent, prints new sequence.

然后我们去找 BatteryService.java 中的 onHelp() 方法,可以找到对应的源码,也就知道该命令的源头了,代码如下:文章来源地址https://www.toymoban.com/news/detail-631497.html

 class Shell extends ShellCommand {
        @Override
        public int onCommand(String cmd) {
            return onShellCommand(this, cmd);
        }

        @Override
        public void onHelp() {
            PrintWriter pw = getOutPrintWriter();
            dumpHelp(pw);
        }
    }

    static void dumpHelp(PrintWriter pw) {
        pw.println("Battery service (battery) commands:");
        pw.println("  help");
        pw.println("    Print this help text.");
        pw.println("  set [-f] [ac|usb|wireless|status|level|temp|present|invalid] <value>");
        pw.println("    Force a battery property value, freezing battery state.");
        pw.println("    -f: force a battery change broadcast be sent, prints new sequence.");
        pw.println("  unplug [-f]");
        pw.println("    Force battery unplugged, freezing battery state.");
        pw.println("    -f: force a battery change broadcast be sent, prints new sequence.");
        pw.println("  reset [-f]");
        pw.println("    Unfreeze battery state, returning to current hardware values.");
        pw.println("    -f: force a battery change broadcast be sent, prints new sequence.");
    }

到了这里,关于adb shell dumpsys 使用命令和来源的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • android 通过adb shell命令旋转Android屏幕朝向方向

    注意: 默认0有的为横向,有的为纵向 纵向返回结果: cur 的值 宽 短 x 高 长 init=1080x1920 420dpi cur=1080x1920 app=1080x1794 rng=1080x1017-1794x1731 横向返回结果: cur 的值 宽 长 x 高 短 init=1080x1920 420dpi cur=1920x1080 app=1794x1080 rng=1080x1017-1794x1731

    2024年02月06日
    浏览(61)
  • adb shell date 命令修改Android系统时间

    1.关掉自动时间同步 settings put global auto_time 0 2.关掉自动时区同步 settings put global auto_time_zone 0 3.挂载 adb remount 4.adb shell date “时间格式”    日期格式为 yyyymmdd.hhmmss 或者是 yyyy-mm-dd hh:mm:ss adb shell date \\\"2023-12-05 10:00:00\\\" 5.查看时间是否设置成功 adb shell date 6.设置时区。先将自动

    2024年02月01日
    浏览(47)
  • Android系统 adb shell auth授权使用

    adb shell是Android开发者常用的一个工具,它可以让我们在电脑上通过USB或网络连接到Android设备,并执行一些命令或操作。但是,有时候我们可能不想让任何人都能随意使用adb shell,而是需要一些授权或验证的机制,以保护我们的设备和数据。本文将介绍如何在基于rockchip rk35

    2024年02月07日
    浏览(44)
  • 【adb命令】Android实用技巧之adb命令:getprop,setprop命令使用

    一、getprop 1.1 getprop简介 getprop命令的作用就是从系统的各种配置文件中读取一些设备的信息。这些文件在我们的手机设备中是可以找到的。 1.2 查询所有的配置 会列出所有的配置信息 这些配置中以ro开头的是只读属性。 1.3 查看单个配置信息 可以在adb shell getprop后面加属性名

    2024年02月04日
    浏览(45)
  • Android使用adb命令查看CPU信息

    Android使用adb命令查看CPU信息 在开发和调试Android应用程序的过程中,了解设备的硬件信息是非常重要的。而其中一个关键信息就是设备的CPU信息。通过使用adb命令,我们可以轻松地查看Android设备的CPU信息。本文将介绍如何使用adb命令来查看CPU信息,并附上相应的源代码。 首

    2024年02月07日
    浏览(42)
  • 使用ADB命令查询Android设备的安卓版本信息

    确保你已经安装了ADB并将其添加到系统的路径中。 连接你的Android设备到计算机,并确保启用了开发者选项和USB调试模式。你可以在设备的设置中找到这些选项。 打开终端(命令提示符或终端窗口)。 运行以下ADB命令来获取Android设备的安卓版本信息: 如果你希望获得更详细

    2024年02月08日
    浏览(41)
  • adb shell命令

    前面给大家分享了Airtest,感兴趣的小伙伴,可以前往:手机自动化测试IDE—–Airtest实战篇、手机自动化测试IDE —– 手把手教你用Airtest模拟器来连接手机、手机自动化测试IDE—–Airtest基本操作方法、手机自动化测试IDE —– Airtest的安装和IDE控件详解,任君挑选。 ADB,中文名

    2023年04月18日
    浏览(46)
  • Android13 adb input 调试命令使用和源码解析

    目录 一、概述 二、常用命令 2.1 输入文本 2.2 模拟按键 2.3 模拟点击 2.4 模拟滑动 2.5 模拟长按 2.6 模拟滚动 三、进阶用法 3.1 组合按键的用法 3.2 长按power键 3.3 输入中文 3.4 代码模拟发送按键 1. 方法1: 2. 方法2: 3. 方法3: 四、注意事项 五、源码解析 六、总结 好了 本篇作为And

    2024年01月20日
    浏览(59)
  • adb shell下常见查看命令

    top查看进程信息 ls查看当前目录结构 ls -a 查看当前目录下所有文件 ps data 打印或设置当前系统时间 dumpsys 查看apk所在位置 pm list packages -f | grep apk包名 dumpsys package apk包名 查看栈顶activity dumpsys activity | grep “mFocusedActivity” dumpsys window | grep mCurrentFocus 查看window焦点的活动名称和

    2024年02月09日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包