Commit Graph

2588 Commits

Author SHA1 Message Date
v-tangmeng dd7c846d70 apps/system: fix the compile error
error: 'CONFIG_NSH_LINELEN' undeclared (first use in this function);
did you mean 'CONFIG_NSH_PIPELINE'?

Signed-off-by: v-tangmeng <v-tangmeng@xiaomi.com>
2026-04-27 10:33:25 +08:00
zhaoxingyu1 b78ebdfd0d system/cfgdata: ajust cfgdata dependency configuration
cfgdata shall depends on !MTD_CONFIG_NONE

Signed-off-by: zhaoxingyu1 <zhaoxingyu1@xiaomi.com>
2026-04-20 15:20:24 +08:00
zhangyuan20 fe663ef352 Android-Vela: rename kernel_modules_headers.
Rootcause: android 15 shoud use apex.

Signed-off-by: zhangyuan20 <zhangyuan20@xiaomi.com>
2026-04-20 15:20:24 +08:00
fangpeina a06620345c system: Add stty utility for terminal control
This commit adds a systen utily 'stty' to NuttX, providing a standard
Unix-like interface for configuring terminal (TTY) device settings.
The command allows runtime configuration of termios attributes for
serial ports and other character devices.

Usage examples:

  # Set raw mode on ttyS0 (for binary communication)
  nsh> stty -F /dev/ttyS0 raw -echo

  # Set console mode for interactive terminal
  nsh> stty -F /dev/ttyS0 cooked

  # Display current settings
  nsh> stty -F /dev/ttyS0

  # Configure stdin (if it's a TTY)
  nsh> stty echo icanon

  # Set baudrate (if driver support)
  nsh> stty -F /dev/ttyS1 speed 115200

Signed-off-by: fangpeina <fangpeina@xiaomi.com>
2026-04-20 15:20:24 +08:00
fangpeina 1903bf29e5 system/readline: Add software echo for normal characters
Background:
Previously, when CONFIG_READLINE_ECHO was enabled, it only handled
special cases like:
- Tab completion output
- Backspace character echo
- VT100 control sequences (e.g., erase to end of line)

Normal character echoing relied entirely on the hardware ECHO flag in
the underlying serial driver (termios).This caused issues when NSH
stdout was redirected to syslog via CONFIG_NSH_ALTSTDOUT="/dev/log":

now no more output interleaving when using syslog redirection.

Signed-off-by: fangpeina <fangpeina@xiaomi.com>
2026-04-20 15:20:24 +08:00
v-lichenxi7 021080c4d0 uorb: Increase the waiting time at the publish end so that the subscrib end has time to process.
Signed-off-by: v-lichenxi7 <v-lichenxi7@xiaomi.com>
2026-04-20 15:20:23 +08:00
zhengyu16 86c4344d03 system/libarchive: add config of ppmd
Add config of ppmd and default to n.
This saves flash size of about 6K when enabling libarchive.

Signed-off-by: zhengyu16 <zhengyu16@xiaomi.com>
2026-04-20 15:20:23 +08:00
zhengyu16 4c11152a79 system/libarchive: add config which enables error strings
Add a config which enables error strings, and default it to n.
This saves flash size of about 4K when enabling libarchive.

Signed-off-by: zhengyu16 <zhengyu16@xiaomi.com>
2026-04-20 15:20:23 +08:00
zhengyu16 2389ad74c4 system/libarchive: fix coding style check error
Signed-off-by: zhengyu16 <zhengyu16@xiaomi.com>
2026-04-20 15:20:23 +08:00
zhengyu16 dc3edfdb55 libarchive: optimize code size
1. add UTILS_LIBARCHIVE_UNICODE_NORMALIZATION
    Enable Unicode NFC/NFD normalization for filename handling.
    Disabling it can reduce the size of about 17K code (under LTO),
    or 29K without LTO.
2. disable HAVE_LANGINFO, HAVE_ICONV according to CONFIG_LIBC_LOCALE

Signed-off-by: zhengyu16 <zhengyu16@xiaomi.com>
2026-04-20 15:20:22 +08:00
likun17 b1fd31076b uorb_unit_test: Raise priority.
Signed-off-by: likun17 <likun17@xiaomi.com>
2026-04-20 15:20:22 +08:00
dongjiuzhu1 7ee8b75d8a libuv/test: add TLS_NCLEANUP dependency about libuv test
The libuv test frameworks sends a SIG_TERM signal when shutting down
test server. As the epoll_wait of the test server needs to release
resource through TLS cleanup, this dependency has been added.

Signed-off-by: dongjiuzhu1 <dongjiuzhu1@xiaomi.com>
2026-04-20 15:20:21 +08:00
wangjianyu3 d51bb7230e system/init: Fix multi-event action triggering
Action triggered on any event before this fix (e.g. both opposite actions in
init.rc below triggered when event "boot" triggered).

init.rc

  on boot && property:sys.boot.reason=bootloader
     echo "On boot, the reason is BL."

  on boot && property:sys.boot.reason!=bootloader
     echo "On boot, the reason is not BL."

Signed-off-by: wangjianyu3 <wangjianyu3@xiaomi.com>
2026-04-20 15:20:20 +08:00
wangjianyu3 0e8744c2e2 system/init: Fix action event parsing loss
init.rc

  on boot && property:sys.boot.reason!=bootloader
     echo "On boot, the reason is not BL."

Before fixing

    init_main: action 0x40436120
    init_main:   sys.boot.reason!=bootloader
    init_main:   argv[0] 'echo'
    init_main:   argv[1] 'On boot, the reason is not BL.'

After fixing

    init_main: action 0x40436120
    init_main:   sys.boot.reason!=bootloader
  + init_main:   default==boot
    init_main:   argv[0] 'echo'
    init_main:   argv[1] 'On boot, the reason is not BL.'

Signed-off-by: wangjianyu3 <wangjianyu3@xiaomi.com>
2026-04-20 15:20:20 +08:00
fangpeina eb18662240 system/init: support compound command execution
Example in init.rc:
  echo "start" && hello && echo "done"
  ls /missing || echo "not found"
  echo "A" && echo "B" || echo "fallback"

Signed-off-by: fangpeina <fangpeina@xiaomi.com>
2026-04-20 15:20:20 +08:00
fangpeina 6d2c93e106 system/init: prevent parser from reading past string boundry
Any string ending with whitespace passed to init_parse_arguments()
could cause the parser to advance past the string boundary and read
unintended memory content.
 - " echo "A" \0& echo "B" should be parsed
   as a command with two argvs instand of five.
 - "command arg  " may lead to uncertain results.

Signed-off-by: fangpeina <fangpeina@xiaomi.com>
2026-04-20 15:20:20 +08:00
guoshichao 46161c428f cu: make the cu exit procedure decouple from signal
Signed-off-by: guoshichao <guoshichao@xiaomi.com>
2026-04-20 15:20:20 +08:00
guanyi3 15a85cbf7b apps/zmodem: fix multiple definition
we should put common .c to lib

Signed-off-by: guanyi3 <guanyi3@xiaomi.com>
2026-04-20 15:20:19 +08:00
wangjianyu3 e015d545c1 system/init: Add subreason for sys.boot.reason
init.rc

  on init && property:sys.boot.reason=watchdog,4
     ...

  on init && property:sys.boot.reason=bootloader|recovery|thermal
     ...

Test

  cause->cause = BOARDIOC_RESETCAUSE_CPU_RWDT;
  cause->flag  = 4
  init_main: setprop key:sys.boot.reason value:watchdog,4

  cause->cause = BOARDIOC_RESETCAUSE_CPU_SOFT;
  cause->flag  = BOARDIOC_SOFTRESETCAUSE_ENTER_BOOTLOADER;
  init_main: setprop key:sys.boot.reason value:bootloader

Signed-off-by: wangjianyu3 <wangjianyu3@xiaomi.com>
2026-04-20 15:20:19 +08:00
wangjianyu3 5b3df8492b system/init: Add resetcause for triggers
Add built-in property sys.boot.reason, which allows action triggers to be
executed on specific reset cause.

For example:
  ```
  on property:sys.boot.reason=cpu_soft_reset(bootloader)
      echo "bootloader mode ..."
      start fastboot
  ```

Signed-off-by: wangjianyu3 <wangjianyu3@xiaomi.com>
2026-04-20 15:20:19 +08:00
wangjianyu3 589f0b21a3 system/init: Add support for action triggers
Previously only supported event trigger, now added support for
action triggers (property setting).

Steps to enable action triggers:
  - Define all init_property_*() interfaces declared in this file.
  - Data structures or functions that will likely be used:
    - struct action_trigger_s
    - init_action_for_every()

Example
  ```
  on boot
     setprop key_test
     setprop key_test value_test  /* property changed and matched */
     trigger event_test

  on event_test && property:key_test=value_test
     echo "on event_test, property changed!"

  on property:key_test=value_test
     echo "property changed!"
  ```

Signed-off-by: wangjianyu3 <wangjianyu3@xiaomi.com>
2026-04-20 15:20:19 +08:00
fangpeina 4f0194bf6e system/init: Add setprop support for action
Signed-off-by: fangpeina <fangpeina@xiaomi.com>
Signed-off-by: wangjianyu3 <wangjianyu3@xiaomi.com>
2026-04-20 15:20:19 +08:00
wangjianyu3 f6998f005e system/init: Fix timespec incomplete error in action.h
/.../apps/system/init/action.h:72:19: error: field 'time_run' has incomplete type
    72 |   struct timespec time_run;
       |                   ^~~~~~~~

Signed-off-by: wangjianyu3 <wangjianyu3@xiaomi.com>
2026-04-20 15:20:19 +08:00
chenxiaoyi 290ebfd0c3 uorb/test: fix build error with clang
apps/system/uorb/test/unit_test.c:503:48: error: variable 'sample' is uninitialized when passed as a const pointer argument here [-Werror,-Wuninitialized-const-pointer]

Signed-off-by: chenxiaoyi <chenxiaoyi@xiaomi.com>
2026-04-20 15:20:19 +08:00
chenxiaoyi b29dbb6b03 libuv: fix build error with clang
apps/system/libuv/libuv/src/unix/linux.c:1490:25: error: declaration shadows a local variable [-Werror,-Wshadow]
apps/system/libuv/libuv/src/unix/fs.c:1012:9: error: variable 'r' is used uninitialized whenever 'if' condition is false [-Werror,-Wsometimes-uninitialized]

Signed-off-by: chenxiaoyi <chenxiaoyi@xiaomi.com>
2026-04-20 15:20:19 +08:00
wangjianyu3 d0b724859f system/init: Fix event-board timing
Fix the timing issue between preset event initialization and board initialization.

Signed-off-by: wangjianyu3 <wangjianyu3@xiaomi.com>
2026-04-20 15:20:19 +08:00
wangjianyu3 662b80286c system/init: Extract init_parse_config_buffer()
Extract the init_parse_config_buffer() interface from the init_parse_config_file() function.

Signed-off-by: wangjianyu3 <wangjianyu3@xiaomi.com>
2026-04-20 15:20:19 +08:00
wenquan1 3de1e5039b ping6: fix illegal address access due to struct not init
Signed-off-by: wenquan1 <wenquan1@xiaomi.com>
2026-04-20 15:20:18 +08:00
jingfei 9a11d0a815 system/init: Add start_cpu support for action
Add support for starting a cpu's software.
Depends on `BOARDCTL_START_CPU`.

Signed-off-by: jingfei <jingfei@xiaomi.com>
2026-04-20 15:20:18 +08:00
chejinxian1 d6f4612437 Android-Vela: Update Android.bp to utilise the RPMSG service
Rootcause: RPMSG path updates require the adoption of a new method for
adding RPMSG.

Signed-off-by: chejinxian1 <chejinxian1@xiaomi.com>
2026-04-20 15:20:18 +08:00
yangsong8 68c3df741f apps/fastboot: add O_DIRECT param when open
No need to read back when writing Flash and it is more effiecntly
when use O_DIRECT.

Signed-off-by: yangsong8 <yangsong8@xiaomi.com>
2026-04-20 15:20:18 +08:00
xuxingliang e455e30e0a Revert "apps/coredump.c:coredump func prototype is modified regs and sync the call site"
This reverts commit 50f62e37a7561623e232a7fc166878492083eb65.
There's no need to special handling tricore registers, thus revert this
patch.

Signed-off-by: xuxingliang <xuxingliang@xiaomi.com>
2026-04-20 15:20:17 +08:00
zhangyu117 1f1ade2beb system/debugpoint: prevent compiler optimizations to ensure debugpoints are triggered
Signed-off-by: zhangyu117 <zhangyu117@xiaomi.com>
2026-04-20 15:20:17 +08:00
zhaoyiming5 d2a29645f6 system/spi: fix tasking compile error
Signed-off-by: zhaoyiming5 <zhaoyiming5@xiaomi.com>
2026-04-20 15:20:17 +08:00
fangpeina e613d33281 system/init: fix uninitialized 'wstatus' warning
Signed-off-by: fangpeina <fangpeina@xiaomi.com>
2026-04-20 15:20:17 +08:00
fangpeina 53b45dc65d system/init: fix compilation errors in action.c
Signed-off-by: fangpeina <fangpeina@xiaomi.com>
2026-04-20 15:20:17 +08:00
zhengyu16 0e866add56 fs: rename PSEUDOFS_SOFTLINKS to FS_LINKS
Signed-off-by: zhengyu16 <zhengyu16@xiaomi.com>
2026-04-20 15:20:16 +08:00
yangsong8 8d606f5688 apps/spitool: Support multiple trans
Signed-off-by: yangsong8 <yangsong8@xiaomi.com>
2026-04-20 15:20:16 +08:00
likun17 19e8fe6a90 uORB:orb_info and orb_fprintf add flockfile to print log.
When multiple threads call printf and uorb listener to print logs,
the logs will be garbled because the orb output is not locked.

normal:
ap>
ap> uORB note: sub copy, kill -9 ->unsub

abnormal:
[24/10/25 01:56:42.898500] [207] [ap] ******mq received msg!msg.type = 0, msg.cmd = 6
[24/10/25 01:56:42.899400] [207] [ap] [media][media_parcel_send:281] send parcel: 0x18a16140, code: 2, total_len: 31, chunk->len: 23
ub copy, kill -9 ->unsub

p>

Signed-off-by: likun17 <likun17@xiaomi.com>
2026-04-20 15:20:14 +08:00
wangjianyu3 b62ae43ee2 system/init: Parse default cpu-specific configs
On the basis of init.rc, add default parsing of cpu-specific configs.
- /etc/init.d/init.rc
- /etc/init.d/init.cpu${CPUID}.rc

Refactor function `init_parse_configs()` to parse files from the default path
instead of identifying and parsing directories or files, as the functionality
is unnecessary.

Signed-off-by: wangjianyu3 <wangjianyu3@xiaomi.com>
2026-04-20 15:20:14 +08:00
wangjianyu3 187f092207 system/init: Handle trailing file '\0'
When ETC_ROMFS is disabled to reduce the bin size, we can provide the init.rc
file via a pseudo-file in the boards/vendor directory. For example:
  - CONFIG_ETC_ROMFS=n
  - CONFIG_PSEUDOFS_FILE=y
  - CONFIG_DISABLE_PSEUDOFS_OPERATIONS=n
  ```C
  FAR const char *init_rc =
    "on init\n"
    "    start console\n";
    "service console sh\n"
    "    restart_period 100\n";

  int fd = open("/etc/init.d/init.rc", O_WRONLY | O_CREAT);
  /* ... */
  ssize_t n = write(fd, init_rc, strlen(init_rc) + 1);
  /* ... */
  close(fd);
  ```

The last character '\0' in the file content will be treated as a new line,
and the number of parsed parameters will be zero (abnormal, there should be
at least one keyword).

Signed-off-by: wangjianyu3 <wangjianyu3@xiaomi.com>
2026-04-20 15:20:14 +08:00
wangjianyu3 8051f5cb66 system/init: Add boot support for action
Add support for booting a new application firmware image.
Depends on `BOARDCTL_BOOT_IMAGE`.

When the built-in boot command of nsh is enabled, the built-in boot
command of Init will take precedence (see init_builtin_run()). To use
the built-in boot command of nsh, use: `exec -- sh boot [args...]`.

Referred to nshlib/nsh_syscmds.c: cmd_boot()

Signed-off-by: wangjianyu3 <wangjianyu3@xiaomi.com>
2026-04-20 15:20:14 +08:00
v-tangmeng 0f5b502859 sched: fix the compile error
error: implicit declaration of function 'sched_lock'
error: implicit declaration of function 'sched_unlock'

Signed-off-by: v-tangmeng <v-tangmeng@xiaomi.com>
2026-04-20 15:20:13 +08:00
wangmingrong1 bbfd6bde03 apps/perf-tools: fix compile error
apps/system/perf-tools/builtin-write.c:58:17: error: implicit declaration of function 'getopt' [-Werror=implicit-function-declaration]
   58 |   while ((opt = getopt(argc, (char **)argv, "a:s:")) != ERROR)
      |                 ^~~~~~
apps/system/perf-tools/builtin-write.c:63:28: error: 'optarg' undeclared (first use in this function)
   63 |             addr = strtoul(optarg, NULL, 16);

Signed-off-by: wangmingrong1 <wangmingrong1@xiaomi.com>
2026-04-20 15:20:13 +08:00
hujun5 2fc983e2a8 fix compile error
Signed-off-by: hujun5 <hujun5@xiaomi.com>
2026-04-20 15:20:13 +08:00
wangjianyu3 3e893c4287 system/init: Add reboot_on_failure for service
Add support for the reboot_on_failure option to the service.

When the execution of a command within a certain action fails (returning
a non-zero status code), init will continue to execute subsequent commands or
actions and will not proactively terminate the startup process. To implement
the functionality of "terminating the startup process after a command
execution fails", there are two methods:
a. Execute conditional statements (if/then/else/fi) via exec command,
   but this depends on sh:
   ```
   on init
       exec -- set +e; \
               mount -t fatfs /dev/data /data ; \
               if [ $? -ne 0 ] ; \
               then \
                 echo "failed" ; \
                 reboot ; \
               else \
                 echo "succeed" ; \
               fi;
   ```
b. Via service's oneshot + reboot_on_failure:
   /* Although the example uses sh, it does not depend on it and can be
    * replaced with any other Builtin Apps.
    */
   ```
   on init
       exec_start mkdir_tmp
       ls /tmp

   service mkdir_tmp sh -c "mkdir /tmp"
       reboot_on_failure 0
       oneshot
   ```

Test
  - RC
      service console sh
          class core
          override
    >     reboot_on_failure 0
          restart_period 10000
  - Runtime
      [    0.150000] [ 3] [ 0] init_main: == Dump Services ==
      ...
      [    0.170000] [ 3] [ 0] init_main: Service 0x40486ea0 name 'console' path 'sh'
      [    0.170000] [ 3] [ 0] init_main:   pid: 0
      [    0.170000] [ 3] [ 0] init_main:   arguments:
      [    0.170000] [ 3] [ 0] init_main:       [0] 'service'
      [    0.170000] [ 3] [ 0] init_main:       [1] 'console'
      [    0.170000] [ 3] [ 0] init_main:       [2] 'sh'
      [    0.170000] [ 3] [ 0] init_main:   classes:
      [    0.170000] [ 3] [ 0] init_main:     'core'
      [    0.170000] [ 3] [ 0] init_main:   restart_period: 10000
    > [    0.170000] [ 3] [ 0] init_main:   reboot_on_failure: 0
      [    0.170000] [ 3] [ 0] init_main:   flags:
      [    0.170000] [ 3] [ 0] init_main:     'override'
      ...
      [    0.380000] [ 3] [ 0] init_main: started service 'console' pid 4
      ...
      nsh> kill -9 4
      [    8.060000] [ 3] [ 0] init_main: service 'console' flag 0x20000004 add 0x4
      [    8.060000] [ 3] [ 0] init_main:   -flag 'running'
      [    8.060000] [ 3] [ 0] init_main: service 'console' flag 0x20000000 add 0x8
      [    8.060000] [ 3] [ 0] init_main:   +flag 'restarting'
    > [    8.060000] [ 3] [ 0] init_main: Error reboot on failure of service 'console' reason 0

Signed-off-by: wangjianyu3 <wangjianyu3@xiaomi.com>
2026-04-20 15:20:13 +08:00
wangjianyu3 cfa510dc5c system/init: Add exec_start support for action
Format: exec_start <service>

Start the specified service and pause the processing of any additional
initialization commands until the service completes its execution. This
command operates similarly to the `exec` command; the key difference is
that it utilizes an existing service definition rather than requiring
the `exec` argument vector.

This feature is particularly intended for use with the `reboot_on_failure`
built-in command to perform all types of essential checks during system boot.

Signed-off-by: wangjianyu3 <wangjianyu3@xiaomi.com>
2026-04-20 15:20:13 +08:00
wangjianyu3 c2f5897063 system/init: Add oneshot support for service
Add support for the oneshot option to the service.

Test
  - RC
      service telnet telnetd
          class test
    >     oneshot
          restart_period 3000
  - Runtime
      [    0.150000] [ 3] [ 0] init_main: == Dump Services ==
      ...
      [    0.160000] [ 3] [ 0] init_main: Service 0x40486aa8 name 'telnet' path 'telnetd'
      [    0.160000] [ 3] [ 0] init_main:   pid: 0
      [    0.160000] [ 3] [ 0] init_main:   arguments:
      [    0.160000] [ 3] [ 0] init_main:       [0] 'service'
      [    0.160000] [ 3] [ 0] init_main:       [1] 'telnet'
      [    0.160000] [ 3] [ 0] init_main:       [2] 'telnetd'
      [    0.160000] [ 3] [ 0] init_main:   classes:
      [    0.160000] [ 3] [ 0] init_main:     'test'
      [    0.170000] [ 3] [ 0] init_main:   restart_period: 3000
      [    0.170000] [ 3] [ 0] init_main:   reboot_on_failure: -1
      [    0.170000] [ 3] [ 0] init_main:   flags:
    > [    0.170000] [ 3] [ 0] init_main:     'oneshot'
      ...
      [    0.370000] [ 3] [ 0] init_main: starting service 'telnet' ...
      [    0.380000] [ 3] [ 0] init_main: service 'telnet' flag 0x2 add 0x4
      [    0.380000] [ 3] [ 0] init_main:   +flag 'running'
      [    0.380000] [ 3] [ 0] init_main: service 'telnet' flag 0x6 add 0x8
      [    0.380000] [ 3] [ 0] init_main:   -flag 'restarting'
      [    0.380000] [ 3] [ 0] init_main: service 'telnet' flag 0x6 add 0x1
      [    0.380000] [ 3] [ 0] init_main:   -flag 'disabled'
      [    0.380000] [ 3] [ 0] init_main: started service 'telnet' pid 9
      ...
      nsh> kill -9 9
      nsh> [    7.350000] [ 3] [ 0] init_main: service 'telnet' flag 0x6 add 0x4
      [    7.350000] [ 3] [ 0] init_main:   -flag 'running'
      [    7.350000] [ 3] [ 0] init_main: service 'telnet' flag 0x2 add 0x80000001
      [    7.350000] [ 3] [ 0] init_main:   +flag 'disabled'
      [    7.350000] [ 3] [ 0] init_main:   +flag 'remove'
      [    7.350000] [ 3] [ 0] init_main: service 'telnet' pid 9 exited status 1
    > [    7.360000] [ 3] [ 0] init_main: removing service 'telnet' ...

Signed-off-by: wangjianyu3 <wangjianyu3@xiaomi.com>
2026-04-20 15:20:13 +08:00
wangjianyu3 743e6a6d96 system/init: Warning for long commands
If the command of an action takes too long (greater than
CONFIG_SYSTEM_INIT_ACTION_WARN_SLOW milliseconds, 50 ms by default),
a warning log will be output for analysis and debugging.

For example:

  a. sleep 1
       [    0.340000] [ 3] [ 0] init_main: executing NSH command 'sleep 1'
       [    1.360000] [ 3] [ 0] init_main: NSH command 'sleep 1' exited 0
     > [    1.360000] [ 3] [ 0] init_main: command 'sleep' took 1020 ms

  b. hello (add sleep(1) to examples/hello)

       [    1.390000] [ 3] [ 0] init_main: executed command 'hello' pid 14
       [    1.390000] [ 3] [ 0] init_main: waiting 'hello' pid 14
       Hello, World!!
     > [    2.400000] [ 3] [ 0] init_main: command 'hello' pid 14 took 1010 ms
       [    2.400000] [ 3] [ 0] init_main: command 'hello' pid 14 exited status 0

Signed-off-by: wangjianyu3 <wangjianyu3@xiaomi.com>
2026-04-20 15:20:12 +08:00
wangjianyu3 7b8cd56bc3 system/init: Add NSH builtin support for action
Enable CONFIG_SYSTEM_SYSTEM to support nsh builtins, which depends on nsh.

Signed-off-by: wangjianyu3 <wangjianyu3@xiaomi.com>
2026-04-20 15:20:12 +08:00