From b3c4f24e333fe2eea6e050957109e4f8762fe5f0 Mon Sep 17 00:00:00 2001
From: Him188 <Him188@mamoe.net>
Date: Sat, 7 Mar 2020 18:48:07 +0800
Subject: [PATCH] Revert "Use `io.ktor.utils.io` than `kotlinx.io`"

This reverts commit 6a85769e
---
 .../net/mamoe/mirai/qqandroid/ContactImpl.kt  |   2 +-
 .../mirai/qqandroid/io/serialization/Jce.kt   |   4 +-
 .../mirai/qqandroid/io/serialization/utils.kt |   5 +-
 .../mamoe/mirai/qqandroid/message/messages.kt |   5 +-
 .../qqandroid/network/QQAndroidClient.kt      |   4 +-
 .../network/highway/HighwayHelper.kt          |  10 +-
 .../qqandroid/network/highway/highway.kt      |   5 +-
 .../network/protocol/data/proto/Cmd0x857.kt   | 408 ------------------
 .../network/protocol/packet/EncryptMethod.kt  |   5 +-
 .../protocol/packet/OutgoingPacketAndroid.kt  |  19 +-
 .../network/protocol/packet/PacketFactory.kt  |   4 +-
 .../qqandroid/network/protocol/packet/Tlv.kt  |   5 +-
 .../protocol/packet/chat/PbMessageSvc.kt      |   2 +-
 .../protocol/packet/chat/TroopManagement.kt   |   7 +-
 .../protocol/packet/chat/image/ImgStore.kt    |   2 +-
 .../protocol/packet/chat/image/LongConn.kt    |   2 +-
 .../packet/chat/receive/MessageSvc.kt         |   3 +-
 .../protocol/packet/list/FriendList.kt        |   2 +-
 .../protocol/packet/login/ConfigPushSvc.kt    |   2 +-
 .../network/protocol/packet/login/StatSvc.kt  |   2 +-
 .../network/protocol/packet/login/WtLogin.kt  |   9 +-
 .../src/commonTest/kotlin/test/printing.kt    |  10 +-
 .../JceDecoderTest.kt                         |   2 +-
 .../kotlin/test/ProtoBufDataClassGenerator.kt |   2 +-
 .../mamoe/mirai/utils/ExternalImageAndroid.kt |   1 +
 .../net/mamoe/mirai/utils/SystemDeviceInfo.kt |   2 +-
 .../io/PlatformDatagramChannelAndroid.kt      |   8 +-
 .../mamoe/mirai/utils/io/PlatformSocket.kt    |  10 +-
 .../net/mamoe/mirai/utils/platformAndroid.kt  |   2 +-
 .../kotlin/net.mamoe.mirai/BotAccount.kt      |   2 +-
 .../kotlin/net.mamoe.mirai/data/ImageLink.kt  |   4 +-
 .../net.mamoe.mirai/event/events/BotEvents.kt |   1 -
 .../net.mamoe.mirai/utils/ExternalImage.kt    |   4 +-
 .../kotlin/net.mamoe.mirai/utils/channels.kt  |   7 +-
 .../net.mamoe.mirai/utils/cryptor/TEA.kt      |   5 +-
 .../utils/io/PlatformDatagramChannel.kt       |   4 +-
 .../utils/io/PlatformSocket.kt                |   4 +-
 .../net.mamoe.mirai/utils/io/byteArrays.kt    |  10 +-
 .../net.mamoe.mirai/utils/io/chunked.kt       |   8 +-
 .../net.mamoe.mirai/utils/io/conversion.kt    |  12 +
 .../kotlin/net.mamoe.mirai/utils/io/output.kt |   2 +-
 .../kotlin/net.mamoe.mirai/utils/platform.kt  |   2 +-
 .../net/mamoe/mirai/message/MessagePacket.kt  |   4 +-
 .../mamoe/mirai/message/SendImageUtilsJvm.kt  |   2 +-
 .../mamoe/mirai/utils/BotConfigurationJvm.kt  |   2 +-
 .../net/mamoe/mirai/utils/ExternalImageJvm.kt |  10 +-
 .../net/mamoe/mirai/utils/PlatformUtilsJvm.kt |   2 +-
 .../net/mamoe/mirai/utils/SystemDeviceInfo.kt |   2 +-
 .../mamoe/mirai/utils/io/PlatformSocket.kt    |  10 +-
 .../mamoe/mirai/utils/io/PlatformSocketJvm.kt |   8 +-
 50 files changed, 132 insertions(+), 517 deletions(-)
 delete mode 100644 mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/data/proto/Cmd0x857.kt

diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/ContactImpl.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/ContactImpl.kt
index b1ee9c6fd..9580ed3e0 100644
--- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/ContactImpl.kt
+++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/ContactImpl.kt
@@ -9,9 +9,9 @@
 
 package net.mamoe.mirai.qqandroid
 
-import io.ktor.utils.io.core.Closeable
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.withTimeoutOrNull
+import kotlinx.io.core.Closeable
 import net.mamoe.mirai.LowLevelAPI
 import net.mamoe.mirai.contact.*
 import net.mamoe.mirai.data.*
diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/io/serialization/Jce.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/io/serialization/Jce.kt
index 87ec126c1..bf381f7ea 100644
--- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/io/serialization/Jce.kt
+++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/io/serialization/Jce.kt
@@ -9,8 +9,8 @@
 
 package net.mamoe.mirai.qqandroid.io.serialization
 
-import io.ktor.utils.io.charsets.Charset
-import io.ktor.utils.io.core.*
+import kotlinx.io.charsets.Charset
+import kotlinx.io.core.*
 import kotlinx.serialization.*
 import kotlinx.serialization.internal.*
 import kotlinx.serialization.modules.EmptyModule
diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/io/serialization/utils.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/io/serialization/utils.kt
index 3b3856cb7..fe8e46dd8 100644
--- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/io/serialization/utils.kt
+++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/io/serialization/utils.kt
@@ -12,10 +12,7 @@
 
 package net.mamoe.mirai.qqandroid.io.serialization
 
-import io.ktor.utils.io.core.BytePacketBuilder
-import io.ktor.utils.io.core.ByteReadPacket
-import io.ktor.utils.io.core.readBytes
-import io.ktor.utils.io.core.writeFully
+import kotlinx.io.core.*
 import kotlinx.serialization.DeserializationStrategy
 import kotlinx.serialization.SerialDescriptor
 import kotlinx.serialization.SerializationStrategy
diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/message/messages.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/message/messages.kt
index e23516c3b..bfa2ac150 100644
--- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/message/messages.kt
+++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/message/messages.kt
@@ -9,7 +9,10 @@
 
 package net.mamoe.mirai.qqandroid.message
 
-import io.ktor.utils.io.core.*
+import kotlinx.io.core.buildPacket
+import kotlinx.io.core.discardExact
+import kotlinx.io.core.readBytes
+import kotlinx.io.core.readUInt
 import net.mamoe.mirai.LowLevelAPI
 import net.mamoe.mirai.contact.Member
 import net.mamoe.mirai.message.data.*
diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/QQAndroidClient.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/QQAndroidClient.kt
index 76df1763d..9a507ab35 100644
--- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/QQAndroidClient.kt
+++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/QQAndroidClient.kt
@@ -11,9 +11,9 @@
 
 package net.mamoe.mirai.qqandroid.network
 
-import io.ktor.utils.io.core.*
 import kotlinx.atomicfu.AtomicInt
 import kotlinx.atomicfu.atomic
+import kotlinx.io.core.*
 import net.mamoe.mirai.BotAccount
 import net.mamoe.mirai.RawAccountIdUse
 import net.mamoe.mirai.data.OnlineStatus
@@ -315,7 +315,7 @@ internal class Pt4Token(data: ByteArray, creationTime: Long, expireTime: Long) :
 internal typealias PSKeyMap = MutableMap<String, PSKey>
 internal typealias Pt4TokenMap = MutableMap<String, Pt4Token>
 
-internal inline fun Input.readUShortLVString(): String = io.ktor.utils.io.core.String(this.readUShortLVByteArray())
+internal inline fun Input.readUShortLVString(): String = kotlinx.io.core.String(this.readUShortLVByteArray())
 
 internal inline fun Input.readUShortLVByteArray(): ByteArray = this.readBytes(this.readUShort().toInt())
 
diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/highway/HighwayHelper.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/highway/HighwayHelper.kt
index 61dd755c2..c219a9881 100644
--- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/highway/HighwayHelper.kt
+++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/highway/HighwayHelper.kt
@@ -18,14 +18,14 @@ import io.ktor.http.content.OutgoingContent
 import io.ktor.http.userAgent
 import io.ktor.utils.io.ByteReadChannel
 import io.ktor.utils.io.copyAndClose
-import io.ktor.utils.io.core.Input
-import io.ktor.utils.io.core.readAvailable
-import io.ktor.utils.io.core.readInt
-import io.ktor.utils.io.core.use
-import io.ktor.utils.io.pool.useInstance
 import kotlinx.coroutines.InternalCoroutinesApi
 import kotlinx.coroutines.flow.collect
 import kotlinx.io.InputStream
+import kotlinx.io.core.Input
+import kotlinx.io.core.discardExact
+import kotlinx.io.core.readAvailable
+import kotlinx.io.core.use
+import kotlinx.io.pool.useInstance
 import net.mamoe.mirai.qqandroid.io.serialization.readProtoBuf
 import net.mamoe.mirai.qqandroid.network.QQAndroidClient
 import net.mamoe.mirai.qqandroid.network.protocol.data.proto.CSDataHighwayHead
diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/highway/highway.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/highway/highway.kt
index cf13c882a..b84834661 100644
--- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/highway/highway.kt
+++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/highway/highway.kt
@@ -12,10 +12,13 @@
 package net.mamoe.mirai.qqandroid.network.highway
 
 import io.ktor.utils.io.ByteReadChannel
-import io.ktor.utils.io.core.*
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.map
 import kotlinx.io.InputStream
+import kotlinx.io.core.ByteReadPacket
+import kotlinx.io.core.Input
+import kotlinx.io.core.buildPacket
+import kotlinx.io.core.writeFully
 import net.mamoe.mirai.qqandroid.io.serialization.toByteArray
 import net.mamoe.mirai.qqandroid.network.QQAndroidClient
 import net.mamoe.mirai.qqandroid.network.protocol.data.proto.CSDataHighwayHead
diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/data/proto/Cmd0x857.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/data/proto/Cmd0x857.kt
deleted file mode 100644
index 2586189c4..000000000
--- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/data/proto/Cmd0x857.kt
+++ /dev/null
@@ -1,408 +0,0 @@
-/*
- * Copyright 2020 Mamoe Technologies and contributors.
- *
- * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
- * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
- *
- * https://github.com/mamoe/mirai/blob/master/LICENSE
- */
-
-@file:Suppress("SpellCheckingInspection")
-
-package net.mamoe.mirai.qqandroid.network.protocol.data.proto
-
-import kotlinx.serialization.SerialId
-import kotlinx.serialization.Serializable
-import kotlinx.serialization.protobuf.ProtoNumberType
-import kotlinx.serialization.protobuf.ProtoType
-import net.mamoe.mirai.qqandroid.io.ProtoBuf
-import net.mamoe.mirai.qqandroid.network.protocol.packet.EMPTY_BYTE_ARRAY
-
-class GroupOpenSysMsg : ProtoBuf {
-    @Serializable
-    class LightApp(
-        @SerialId(1) val app: String = "",
-        @SerialId(2) val view: String = "",
-        @SerialId(3) val desc: String = "",
-        @SerialId(4) val prompt: String = "",
-        @SerialId(5) val ver: String = "",
-        @SerialId(6) val meta: String = "",
-        @SerialId(7) val config: String = "",
-        @SerialId(8) val source: Source? = null
-    ) : ProtoBuf
-
-    @Serializable
-    class RichMsg(
-        @SerialId(1) val title: String = "",
-        @SerialId(2) val desc: String = "",
-        @SerialId(3) val brief: String = "",
-        @SerialId(4) val cover: String = "",
-        @SerialId(5) val url: String = "",
-        @SerialId(6) val source: Source? = null
-    ) : ProtoBuf
-
-    @Serializable
-    class Sender(
-        @SerialId(1) val uin: Long = 0L,
-        @SerialId(2) val nick: String = "",
-        @SerialId(3) val avatar: String = "",
-        @SerialId(4) val url: String = ""
-    ) : ProtoBuf
-
-    @Serializable
-    class Source(
-        @SerialId(1) val name: String = "",
-        @SerialId(2) val icon: String = "",
-        @SerialId(3) val url: String = ""
-    ) : ProtoBuf
-
-    @Serializable
-    class SysMsgBody(
-        @SerialId(1) val groupId: Long = 0L,
-        @SerialId(2) val appid: Long = 0L,
-        @SerialId(3) val sender: Sender? = null,
-        @SerialId(4) val msgType: Int = 0,
-        @SerialId(5) val content: String = "",
-        @SerialId(6) val richMsg: RichMsg? = null,
-        @SerialId(7) val lightApp: LightApp? = null
-    ) : ProtoBuf
-}
-
-@Serializable
-class TroopTips0x857 : ProtoBuf {
-    @Serializable
-    class AIOGrayTipsInfo(
-        @SerialId(1) val optUint32ShowLastest: Int = 0,
-        @SerialId(2) val optBytesContent: ByteArray = EMPTY_BYTE_ARRAY,
-        @SerialId(3) val optUint32Remind: Int = 0,
-        @SerialId(4) val optBytesBrief: ByteArray = EMPTY_BYTE_ARRAY,
-        @SerialId(5) val receiverUin: Long = 0L,
-        @SerialId(6) val reliaoAdminOpt: Int = 0,
-        @SerialId(7) val robotGroupOpt: Int = 0
-    ) : ProtoBuf
-
-    @Serializable
-    class AIOTopTipsInfo(
-        @SerialId(1) val optBytesContent: ByteArray = EMPTY_BYTE_ARRAY,
-        @SerialId(2) val optUint32Icon: Int = 0,
-        @SerialId(3) val optEnumAction: Int /* enum */ = 1,
-        @SerialId(4) val optBytesUrl: ByteArray = EMPTY_BYTE_ARRAY,
-        @SerialId(5) val optBytesData: ByteArray = EMPTY_BYTE_ARRAY,
-        @SerialId(6) val optBytesDataI: ByteArray = EMPTY_BYTE_ARRAY,
-        @SerialId(7) val optBytesDataA: ByteArray = EMPTY_BYTE_ARRAY,
-        @SerialId(8) val optBytesDataP: ByteArray = EMPTY_BYTE_ARRAY
-    ) : ProtoBuf
-
-    @Serializable
-    class FloatedTipsInfo(
-        @SerialId(1) val optBytesContent: ByteArray = EMPTY_BYTE_ARRAY
-    ) : ProtoBuf
-
-    @Serializable
-    class GeneralGrayTipInfo(
-        @SerialId(1) val busiType: Long = 0L,
-        @SerialId(2) val busiId: Long = 0L,
-        @SerialId(3) val ctrlFlag: Int = 0,
-        @SerialId(4) val c2cType: Int = 0,
-        @SerialId(5) val serviceType: Int = 0,
-        @SerialId(6) val templId: Long = 0L,
-        @SerialId(7) val msgTemplParam: List<TemplParam>? = null,
-        @SerialId(8) val content: ByteArray = EMPTY_BYTE_ARRAY,
-        @SerialId(10) val tipsSeqId: Long = 0L,
-        @SerialId(100) val pbReserv: ByteArray = EMPTY_BYTE_ARRAY
-    ) : ProtoBuf
-
-    @Serializable
-    class GoldMsgTipsElem(
-        @SerialId(1) val type: Int = 0,
-        @SerialId(2) val billno: String = "",
-        @SerialId(3) val result: Int = 0,
-        @SerialId(4) val amount: Int = 0,
-        @SerialId(5) val total: Int = 0,
-        @SerialId(6) val interval: Int = 0,
-        @SerialId(7) val finish: Int = 0,
-        @SerialId(8) val uin: List<Long>? = null,
-        @SerialId(9) val action: Int = 0
-    ) : ProtoBuf
-
-    @Serializable
-    class GroupInfoChange(
-        @SerialId(1) val groupHonorSwitch: Int = 0
-    ) : ProtoBuf
-
-    @Serializable
-    class GroupNotifyInfo(
-        @SerialId(1) val optUint32AutoPullFlag: Int = 0,
-        @SerialId(2) val optBytesFeedsId: ByteArray = EMPTY_BYTE_ARRAY
-    ) : ProtoBuf
-
-    @Serializable
-    class InstCtrl(
-        @SerialId(1) val msgSendToInst: List<InstInfo>? = null,
-        @SerialId(2) val msgExcludeInst: List<InstInfo>? = null,
-        @SerialId(3) val msgFromInst: InstInfo? = null
-    ) : ProtoBuf
-
-    @Serializable
-    class InstInfo(
-        @SerialId(1) val apppid: Int = 0,
-        @SerialId(2) val instid: Int = 0,
-        @SerialId(3) val platform: Int = 0,
-        @SerialId(4) val openAppid: Int = 0,
-        @SerialId(5) val productid: Int = 0,
-        @SerialId(6) val ssoBid: Int = 0,
-        @SerialId(7) val guid: ByteArray = EMPTY_BYTE_ARRAY,
-        @SerialId(8) val verMin: Int = 0,
-        @SerialId(9) val verMax: Int = 0
-    ) : ProtoBuf
-
-    @Serializable
-    class LbsShareChangePushInfo(
-        @SerialId(1) val msgType: Int = 0,
-        @SerialId(2) val msgInfo: ByteArray = EMPTY_BYTE_ARRAY,
-        @SerialId(3) val versionCtrl: ByteArray = EMPTY_BYTE_ARRAY,
-        @SerialId(4) val groupId: Long = 0L,
-        @SerialId(5) val operUin: Long = 0L,
-        @SerialId(6) val grayTips: ByteArray = EMPTY_BYTE_ARRAY,
-        @SerialId(7) val msgSeq: Long = 0L,
-        @SerialId(8) val joinNums: Int = 0,
-        @SerialId(99) val pushType: Int = 0,
-        @SerialId(100) val extInfo: ByteArray = EMPTY_BYTE_ARRAY
-    ) : ProtoBuf
-
-    @Serializable
-    class LuckyBagNotify(
-        @SerialId(1) val msgTips: ByteArray = EMPTY_BYTE_ARRAY
-    ) : ProtoBuf
-
-    @Serializable
-    class MediaChangePushInfo(
-        @SerialId(1) val msgType: Int = 0,
-        @SerialId(2) val msgInfo: ByteArray = EMPTY_BYTE_ARRAY,
-        @SerialId(3) val versionCtrl: ByteArray = EMPTY_BYTE_ARRAY,
-        @SerialId(4) val groupId: Long = 0L,
-        @SerialId(5) val operUin: Long = 0L,
-        @SerialId(6) val grayTips: ByteArray = EMPTY_BYTE_ARRAY,
-        @SerialId(7) val msgSeq: Long = 0L,
-        @SerialId(8) val joinNums: Int = 0,
-        @SerialId(9) val msgPerSetting: PersonalSetting? = null,
-        @SerialId(10) val playMode: Int = 0,
-        @SerialId(99) val mediaType: Int = 0,
-        @SerialId(100) val extInfo: ByteArray = EMPTY_BYTE_ARRAY
-    ) : ProtoBuf {
-        @Serializable
-        class PersonalSetting(
-            @SerialId(1) val themeId: Int = 0,
-            @SerialId(2) val playerId: Int = 0,
-            @SerialId(3) val fontId: Int = 0
-        ) : ProtoBuf
-    }
-
-    @Serializable
-    class MessageBoxInfo(
-        @SerialId(1) val optBytesContent: ByteArray = EMPTY_BYTE_ARRAY,
-        @SerialId(2) val optBytesTitle: ByteArray = EMPTY_BYTE_ARRAY,
-        @SerialId(3) val optBytesButton: ByteArray = EMPTY_BYTE_ARRAY
-    ) : ProtoBuf
-
-    @Serializable
-    class MessageRecallReminder(
-        @SerialId(1) val uin: Long = 0L,
-        @SerialId(2) val nickname: ByteArray = EMPTY_BYTE_ARRAY,
-        @SerialId(3) val recalledMsgList: List<MessageMeta> = listOf(),
-        @SerialId(4) val reminderContent: ByteArray = EMPTY_BYTE_ARRAY,
-        @SerialId(5) val userdef: ByteArray = EMPTY_BYTE_ARRAY,
-        @SerialId(6) val groupType: Int = 0,
-        @SerialId(7) val opType: Int = 0
-    ) : ProtoBuf {
-        @Serializable
-        class MessageMeta(
-            @SerialId(1) val seq: Int = 0,
-            @SerialId(2) val time: Int = 0,
-            @SerialId(3) val msgRandom: Int = 0,
-            @SerialId(4) val msgType: Int = 0,
-            @SerialId(5) val msgFlag: Int = 0,
-            @SerialId(6) val authorUin: Long = 0L
-        ) : ProtoBuf
-    }
-
-    @Serializable
-    class MiniAppNotify(
-        @SerialId(1) val msg: ByteArray = EMPTY_BYTE_ARRAY
-    ) : ProtoBuf
-
-    @Serializable
-    class NotifyMsgBody(
-        @SerialId(1) val optEnumType: Int /* enum */ = 1,
-        @SerialId(2) val optUint64MsgTime: Long = 0L,
-        @SerialId(3) val optUint64MsgExpires: Long = 0L,
-        @SerialId(4) val optUint64GroupCode: Long = 0L,
-        @SerialId(5) val optMsgGraytips: AIOGrayTipsInfo? = null,
-        @SerialId(6) val optMsgMessagebox: MessageBoxInfo? = null,
-        @SerialId(7) val optMsgFloatedtips: FloatedTipsInfo? = null,
-        @SerialId(8) val optMsgToptips: AIOTopTipsInfo? = null,
-        @SerialId(9) val optMsgRedtips: RedGrayTipsInfo? = null,
-        @SerialId(10) val optMsgGroupNotify: GroupNotifyInfo? = null,
-        @SerialId(11) val optMsgRecall: MessageRecallReminder? = null,
-        @SerialId(12) val optMsgThemeNotify: ThemeStateNotify? = null,
-        @SerialId(13) val serviceType: Int = 0,
-        @SerialId(14) val optMsgObjmsgUpdate: NotifyObjmsgUpdate? = null,
-        @SerialId(15) val optMsgWerewolfPush: WereWolfPush? = null,
-        // @SerialId(16) val optStcmGameState: ApolloGameStatus.STCMGameMessage? = null,
-        // @SerialId(17) val aplloMsgPush: ApolloPushMsgInfo.STPushMsgElem? = null,
-        @SerialId(18) val optMsgGoldtips: GoldMsgTipsElem? = null,
-        @SerialId(20) val optMsgMiniappNotify: MiniAppNotify? = null,
-        @SerialId(21) val optUint64SenderUin: Long = 0L,
-        @SerialId(22) val optMsgLuckybagNotify: LuckyBagNotify? = null,
-        @SerialId(23) val optMsgTroopformtipsPush: TroopFormGrayTipsInfo? = null,
-        @SerialId(24) val optMsgMediaPush: MediaChangePushInfo? = null,
-        @SerialId(26) val optGeneralGrayTip: GeneralGrayTipInfo? = null,
-        @SerialId(27) val optMsgVideoPush: VideoChangePushInfo? = null,
-        @SerialId(28) val optLbsShareChangePlusInfo: LbsShareChangePushInfo? = null,
-        @SerialId(29) val optMsgSingPush: SingChangePushInfo? = null,
-        @SerialId(30) val optMsgGroupInfoChange: GroupInfoChange? = null
-    ) : ProtoBuf
-
-    @Serializable
-    class NotifyObjmsgUpdate(
-        @SerialId(1) val objmsgId: ByteArray = EMPTY_BYTE_ARRAY,
-        @SerialId(2) val updateType: Int = 0,
-        @SerialId(3) val extMsg: ByteArray = EMPTY_BYTE_ARRAY
-    ) : ProtoBuf
-
-    @Serializable
-    class RedGrayTipsInfo(
-        @SerialId(1) val optUint32ShowLastest: Int = 0,
-        @SerialId(2) val senderUin: Long = 0L,
-        @SerialId(3) val receiverUin: Long = 0L,
-        @SerialId(4) val senderRichContent: ByteArray = EMPTY_BYTE_ARRAY,
-        @SerialId(5) val receiverRichContent: ByteArray = EMPTY_BYTE_ARRAY,
-        @SerialId(6) val authkey: ByteArray = EMPTY_BYTE_ARRAY,
-        @ProtoType(ProtoNumberType.SIGNED) @SerialId(7) val sint32Msgtype: Int = 0,
-        @SerialId(8) val luckyFlag: Int = 0,
-        @SerialId(9) val hideFlag: Int = 0,
-        @SerialId(10) val pcBody: ByteArray = EMPTY_BYTE_ARRAY,
-        @SerialId(11) val icon: Int = 0,
-        @SerialId(12) val luckyUin: Long = 0L,
-        @SerialId(13) val time: Int = 0,
-        @SerialId(14) val random: Int = 0,
-        @SerialId(15) val broadcastRichContent: ByteArray = EMPTY_BYTE_ARRAY,
-        @SerialId(16) val idiom: ByteArray = EMPTY_BYTE_ARRAY,
-        @SerialId(17) val idiomSeq: Int = 0,
-        @SerialId(18) val idiomAlpha: ByteArray = EMPTY_BYTE_ARRAY,
-        @SerialId(19) val jumpurl: ByteArray = EMPTY_BYTE_ARRAY
-    ) : ProtoBuf
-
-    @Serializable
-    class ReqBody(
-        @SerialId(1) val optUint64GroupCode: Long = 0L,
-        @SerialId(2) val uint64Memberuins: List<Long>? = null,
-        @SerialId(3) val optUint32Offline: Int = 0,
-        @SerialId(4) val msgInstCtrl: InstCtrl? = null,
-        @SerialId(5) val optBytesMsg: ByteArray = EMPTY_BYTE_ARRAY,
-        @SerialId(6) val optUint32BusiType: Int = 0
-    ) : ProtoBuf
-
-    @Serializable
-    class RspBody(
-        @SerialId(1) val optUint64GroupCode: Long = 0L
-    ) : ProtoBuf
-
-    @Serializable
-    class SingChangePushInfo(
-        @SerialId(1) val seq: Long = 0L,
-        @SerialId(2) val actionType: Int = 0,
-        @SerialId(3) val groupId: Long = 0L,
-        @SerialId(4) val operUin: Long = 0L,
-        @SerialId(5) val grayTips: ByteArray = EMPTY_BYTE_ARRAY,
-        @SerialId(6) val joinNums: Int = 0
-    ) : ProtoBuf
-
-    @Serializable
-    class TemplParam(
-        @SerialId(1) val name: ByteArray = EMPTY_BYTE_ARRAY,
-        @SerialId(2) val value: ByteArray = EMPTY_BYTE_ARRAY
-    ) : ProtoBuf
-
-    @Serializable
-    class ThemeStateNotify(
-        @SerialId(1) val state: Int = 0,
-        @SerialId(2) val feedsId: ByteArray = EMPTY_BYTE_ARRAY,
-        @SerialId(3) val themeName: ByteArray = EMPTY_BYTE_ARRAY,
-        @SerialId(4) val actionUin: Long = 0L,
-        @SerialId(5) val createUin: Long = 0L
-    ) : ProtoBuf
-
-    @Serializable
-    class TroopFormGrayTipsInfo(
-        @SerialId(1) val writerUin: Long = 0L,
-        @SerialId(2) val creatorUin: Long = 0L,
-        @SerialId(3) val richContent: ByteArray = EMPTY_BYTE_ARRAY,
-        @SerialId(4) val optBytesUrl: ByteArray = EMPTY_BYTE_ARRAY,
-        @SerialId(5) val creatorNick: ByteArray = EMPTY_BYTE_ARRAY
-    ) : ProtoBuf
-
-    @Serializable
-    class VideoChangePushInfo(
-        @SerialId(1) val seq: Long = 0L,
-        @SerialId(2) val actionType: Int = 0,
-        @SerialId(3) val groupId: Long = 0L,
-        @SerialId(4) val operUin: Long = 0L,
-        @SerialId(5) val grayTips: ByteArray = EMPTY_BYTE_ARRAY,
-        @SerialId(6) val joinNums: Int = 0,
-        @SerialId(100) val extInfo: ByteArray = EMPTY_BYTE_ARRAY
-    ) : ProtoBuf
-
-    @Serializable
-    class WereWolfPush(
-        @SerialId(1) val pushType: Int = 0,
-        @SerialId(2) val gameRoom: Long = 0L,
-        @SerialId(3) val enumGameState: Int = 0,
-        @SerialId(4) val gameRound: Int = 0,
-        @SerialId(5) val roles: List<Role>? = null,
-        @SerialId(6) val speaker: Long = 0L,
-        @SerialId(7) val judgeUin: Long = 0L,
-        @SerialId(8) val judgeWords: ByteArray = EMPTY_BYTE_ARRAY,
-        @SerialId(9) val enumOperation: Int = 0,
-        @SerialId(10) val srcUser: Long = 0L,
-        @SerialId(11) val dstUser: Long = 0L,
-        @SerialId(12) val deadUsers: List<Long>? = null,
-        @SerialId(13) val gameResult: Int = 0,
-        @SerialId(14) val timeoutSec: Int = 0,
-        @SerialId(15) val killConfirmed: Int = 0,
-        @SerialId(16) val judgeNickname: ByteArray = EMPTY_BYTE_ARRAY,
-        @SerialId(17) val votedTieUsers: List<Long>? = null
-    ) : ProtoBuf {
-        @Serializable
-        class GameRecord(
-            @SerialId(1) val total: Int = 0,
-            @SerialId(2) val win: Int = 0,
-            @SerialId(3) val lose: Int = 0,
-            @SerialId(4) val draw: Int = 0
-        ) : ProtoBuf
-
-        @Serializable
-        class Role(
-            @SerialId(1) val uin: Long = 0L,
-            @SerialId(2) val enumType: Int = 0,
-            @SerialId(3) val enumState: Int = 0,
-            @SerialId(4) val canSpeak: Int = 0,
-            @SerialId(5) val canListen: Int = 0,
-            @SerialId(6) val position: Int = 0,
-            @SerialId(7) val canVote: Int = 0,
-            @SerialId(8) val canVoted: Int = 0,
-            @SerialId(9) val alreadyChecked: Int = 0,
-            @SerialId(10) val alreadySaved: Int = 0,
-            @SerialId(11) val alreadyPoisoned: Int = 0,
-            @SerialId(12) val playerState: Int = 0,
-            @SerialId(13) val enumDeadOp: Int = 0,
-            @SerialId(14) val enumOperation: Int = 0,
-            @SerialId(15) val dstUser: Long = 0L,
-            @SerialId(16) val operationRound: Int = 0,
-            @SerialId(17) val msgGameRecord: GameRecord? = null,
-            @SerialId(18) val isWerewolf: Int = 0,
-            @SerialId(19) val defendedUser: Long = 0L,
-            @SerialId(20) val isSheriff: Int = 0
-        ) : ProtoBuf
-    }
-}
\ No newline at end of file
diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/EncryptMethod.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/EncryptMethod.kt
index 697028560..80d0d6141 100644
--- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/EncryptMethod.kt
+++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/EncryptMethod.kt
@@ -9,7 +9,10 @@
 
 package net.mamoe.mirai.qqandroid.network.protocol.packet
 
-import io.ktor.utils.io.core.*
+import kotlinx.io.core.BytePacketBuilder
+import kotlinx.io.core.ByteReadPacket
+import kotlinx.io.core.buildPacket
+import kotlinx.io.core.writeFully
 import net.mamoe.mirai.qqandroid.network.QQAndroidClient
 import net.mamoe.mirai.utils.cryptor.ECDH
 import net.mamoe.mirai.utils.cryptor.ECDHKeyPair
diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/OutgoingPacketAndroid.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/OutgoingPacketAndroid.kt
index 45485aa7a..f13ec933d 100644
--- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/OutgoingPacketAndroid.kt
+++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/OutgoingPacketAndroid.kt
@@ -10,7 +10,10 @@
 package net.mamoe.mirai.qqandroid.network.protocol.packet
 
 
-import io.ktor.utils.io.core.*
+import kotlinx.io.core.BytePacketBuilder
+import kotlinx.io.core.ByteReadPacket
+import kotlinx.io.core.buildPacket
+import kotlinx.io.core.writeFully
 import net.mamoe.mirai.qqandroid.network.QQAndroidClient
 import net.mamoe.mirai.utils.MiraiInternalAPI
 import net.mamoe.mirai.utils.io.encryptAndWrite
@@ -43,7 +46,6 @@ internal inline fun OutgoingPacketFactory<*>.buildOutgoingUniPacket(
     body: BytePacketBuilder.(sequenceId: Int) -> Unit
 ): OutgoingPacket {
 
-    @Suppress("DuplicatedCode")
     return OutgoingPacket(name, commandName, sequenceId, buildPacket {
         writeIntLVPacket(lengthOffset = { it + 4 }) {
             writeInt(0x0B)
@@ -52,7 +54,7 @@ internal inline fun OutgoingPacketFactory<*>.buildOutgoingUniPacket(
             writeByte(0)
             client.uin.toString().let {
                 writeInt(it.length + 4)
-                writeText(it)
+                writeStringUtf8(it)
             }
             encryptAndWrite(key) {
                 writeUniPacket(commandName, client.outgoingPacketSessionId, extraData) {
@@ -75,7 +77,6 @@ internal inline fun IncomingPacketFactory<*>.buildResponseUniPacket(
     sequenceId: Int = client.nextSsoSequenceId(),
     body: BytePacketBuilder.(sequenceId: Int) -> Unit
 ): OutgoingPacket {
-    @Suppress("DuplicatedCode")
     return OutgoingPacket(name, commandName, sequenceId, buildPacket {
         writeIntLVPacket(lengthOffset = { it + 4 }) {
             writeInt(0x0B)
@@ -84,7 +85,7 @@ internal inline fun IncomingPacketFactory<*>.buildResponseUniPacket(
             writeByte(0)
             client.uin.toString().let {
                 writeInt(it.length + 4)
-                writeText(it)
+                writeStringUtf8(it)
             }
             encryptAndWrite(key) {
                 writeUniPacket(commandName, client.outgoingPacketSessionId, extraData) {
@@ -105,7 +106,7 @@ internal inline fun BytePacketBuilder.writeUniPacket(
     writeIntLVPacket(lengthOffset = { it + 4 }) {
         commandName.let {
             writeInt(it.length + 4)
-            writeText(it)
+            writeStringUtf8(it)
         }
 
         writeInt(4 + 4)
@@ -152,7 +153,7 @@ internal inline fun OutgoingPacketFactory<*>.buildLoginOutgoingPacket(
 
             client.uin.toString().let {
                 writeInt(it.length + 4)
-                writeText(it)
+                writeStringUtf8(it)
             }
 
             if (key === NO_ENCRYPT) {
@@ -207,7 +208,7 @@ internal inline fun BytePacketBuilder.writeSsoPacket(
         }
         commandName.let {
             writeInt(it.length + 4)
-            writeText(it)
+            writeStringUtf8(it)
         }
 
         writeInt(4 + 4)
@@ -215,7 +216,7 @@ internal inline fun BytePacketBuilder.writeSsoPacket(
 
         client.device.imei.let {
             writeInt(it.length + 4)
-            writeText(it)
+            writeStringUtf8(it)
         }
 
         writeInt(4)
diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/PacketFactory.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/PacketFactory.kt
index 1f62d375b..020a45d2d 100644
--- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/PacketFactory.kt
+++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/PacketFactory.kt
@@ -9,8 +9,8 @@
 
 package net.mamoe.mirai.qqandroid.network.protocol.packet
 
-import io.ktor.utils.io.core.*
-import io.ktor.utils.io.pool.useInstance
+import kotlinx.io.core.*
+import kotlinx.io.pool.useInstance
 import net.mamoe.mirai.data.Packet
 import net.mamoe.mirai.event.Event
 import net.mamoe.mirai.qqandroid.QQAndroidBot
diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/Tlv.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/Tlv.kt
index 0e83f4817..7f5d44ac1 100644
--- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/Tlv.kt
+++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/Tlv.kt
@@ -9,7 +9,10 @@
 
 package net.mamoe.mirai.qqandroid.network.protocol.packet
 
-import io.ktor.utils.io.core.*
+import kotlinx.io.core.BytePacketBuilder
+import kotlinx.io.core.ByteReadPacket
+import kotlinx.io.core.toByteArray
+import kotlinx.io.core.writeFully
 import net.mamoe.mirai.qqandroid.network.protocol.LoginType
 import net.mamoe.mirai.qqandroid.utils.NetworkType
 import net.mamoe.mirai.utils.currentTimeMillis
diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/PbMessageSvc.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/PbMessageSvc.kt
index 7cfb9fc93..71e593cac 100644
--- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/PbMessageSvc.kt
+++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/PbMessageSvc.kt
@@ -9,7 +9,7 @@
 
 package net.mamoe.mirai.qqandroid.network.protocol.packet.chat
 
-import io.ktor.utils.io.core.ByteReadPacket
+import kotlinx.io.core.ByteReadPacket
 import net.mamoe.mirai.data.Packet
 import net.mamoe.mirai.qqandroid.QQAndroidBot
 import net.mamoe.mirai.qqandroid.io.serialization.readProtoBuf
diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/TroopManagement.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/TroopManagement.kt
index 50faee7e5..b958354d7 100644
--- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/TroopManagement.kt
+++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/TroopManagement.kt
@@ -9,7 +9,10 @@
 
 package net.mamoe.mirai.qqandroid.network.protocol.packet.chat
 
-import io.ktor.utils.io.core.*
+import kotlinx.io.core.ByteReadPacket
+import kotlinx.io.core.buildPacket
+import kotlinx.io.core.readBytes
+import kotlinx.io.core.toByteArray
 import net.mamoe.mirai.contact.Group
 import net.mamoe.mirai.contact.Member
 import net.mamoe.mirai.data.Packet
@@ -375,7 +378,7 @@ internal class TroopManagement {
         OutgoingPacketFactory<EditGroupNametag.Response>("friendlist.ModifyGroupCardReq") {
         object Response : Packet
 
-        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Response {
+        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): EditGroupNametag.Response {
             return Response
         }
 
diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/image/ImgStore.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/image/ImgStore.kt
index 6b46fc0e2..6ac6e0b69 100644
--- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/image/ImgStore.kt
+++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/image/ImgStore.kt
@@ -9,7 +9,7 @@
 
 package net.mamoe.mirai.qqandroid.network.protocol.packet.chat.image
 
-import io.ktor.utils.io.core.ByteReadPacket
+import kotlinx.io.core.ByteReadPacket
 import net.mamoe.mirai.data.Packet
 import net.mamoe.mirai.qqandroid.QQAndroidBot
 import net.mamoe.mirai.qqandroid.io.serialization.readProtoBuf
diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/image/LongConn.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/image/LongConn.kt
index 743f3e103..b4cf13881 100644
--- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/image/LongConn.kt
+++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/image/LongConn.kt
@@ -9,7 +9,7 @@
 
 package net.mamoe.mirai.qqandroid.network.protocol.packet.chat.image
 
-import io.ktor.utils.io.core.ByteReadPacket
+import kotlinx.io.core.ByteReadPacket
 import net.mamoe.mirai.data.Packet
 import net.mamoe.mirai.qqandroid.QQAndroidBot
 import net.mamoe.mirai.qqandroid.io.serialization.readProtoBuf
diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/receive/MessageSvc.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/receive/MessageSvc.kt
index 38a148d35..0a83fb747 100644
--- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/receive/MessageSvc.kt
+++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/receive/MessageSvc.kt
@@ -9,9 +9,10 @@
 
 package net.mamoe.mirai.qqandroid.network.protocol.packet.chat.receive
 
-import io.ktor.utils.io.core.ByteReadPacket
 import kotlinx.coroutines.FlowPreview
 import kotlinx.coroutines.flow.*
+import kotlinx.io.core.ByteReadPacket
+import kotlinx.io.core.discardExact
 import net.mamoe.mirai.contact.Group
 import net.mamoe.mirai.contact.MemberPermission
 import net.mamoe.mirai.data.MemberInfo
diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/list/FriendList.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/list/FriendList.kt
index 0c218bf7c..f2ab4eef9 100644
--- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/list/FriendList.kt
+++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/list/FriendList.kt
@@ -9,7 +9,7 @@
 
 package net.mamoe.mirai.qqandroid.network.protocol.packet.list
 
-import io.ktor.utils.io.core.ByteReadPacket
+import kotlinx.io.core.ByteReadPacket
 import net.mamoe.mirai.data.Packet
 import net.mamoe.mirai.qqandroid.QQAndroidBot
 import net.mamoe.mirai.qqandroid.io.serialization.decodeUniPacket
diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/login/ConfigPushSvc.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/login/ConfigPushSvc.kt
index 0ea8c4ec5..1341f7f7b 100644
--- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/login/ConfigPushSvc.kt
+++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/login/ConfigPushSvc.kt
@@ -9,7 +9,7 @@
 
 package net.mamoe.mirai.qqandroid.network.protocol.packet.login
 
-import io.ktor.utils.io.core.ByteReadPacket
+import kotlinx.io.core.ByteReadPacket
 import net.mamoe.mirai.qqandroid.QQAndroidBot
 import net.mamoe.mirai.qqandroid.io.serialization.JceCharset
 import net.mamoe.mirai.qqandroid.io.serialization.decodeUniPacket
diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/login/StatSvc.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/login/StatSvc.kt
index f46297e34..c513076b4 100644
--- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/login/StatSvc.kt
+++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/login/StatSvc.kt
@@ -9,7 +9,7 @@
 
 package net.mamoe.mirai.qqandroid.network.protocol.packet.login
 
-import io.ktor.utils.io.core.ByteReadPacket
+import kotlinx.io.core.ByteReadPacket
 import net.mamoe.mirai.data.Packet
 import net.mamoe.mirai.qqandroid.QQAndroidBot
 import net.mamoe.mirai.qqandroid.io.serialization.*
diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/login/WtLogin.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/login/WtLogin.kt
index 36d7b5857..6ee16aa42 100644
--- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/login/WtLogin.kt
+++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/login/WtLogin.kt
@@ -11,7 +11,7 @@ package net.mamoe.mirai.qqandroid.network.protocol.packet.login
 
 
 import io.ktor.util.InternalAPI
-import io.ktor.utils.io.core.*
+import kotlinx.io.core.*
 import net.mamoe.mirai.data.Packet
 import net.mamoe.mirai.qqandroid.QQAndroidBot
 import net.mamoe.mirai.qqandroid.network.*
@@ -288,7 +288,7 @@ internal class WtLogin {
                 }
 
                 class Picture(
-                    val data: ByteArray,
+                    val data: IoBuffer,
                     val sign: ByteArray
                 ) : Captcha() {
                     override fun toString(): String = "LoginPacketResponse.Captcha.Picture"
@@ -394,8 +394,11 @@ internal class WtLogin {
                 imageData.discardExact(2)//image Length
                 val sign = imageData.readBytes(signInfoLength.toInt())
 
+
+                val buffer = IoBuffer.Pool.borrow()
+                imageData.readAvailable(buffer)
                 return LoginPacketResponse.Captcha.Picture(
-                    data = imageData.readBytes(),
+                    data = buffer,
                     sign = sign
                 )
                 // } else error("UNKNOWN CAPTCHA QUESTION: ${question.toUHexString()}, tlvMap=" + tlvMap.contentToString())
diff --git a/mirai-core-qqandroid/src/commonTest/kotlin/test/printing.kt b/mirai-core-qqandroid/src/commonTest/kotlin/test/printing.kt
index f2fc92dac..043d67d47 100644
--- a/mirai-core-qqandroid/src/commonTest/kotlin/test/printing.kt
+++ b/mirai-core-qqandroid/src/commonTest/kotlin/test/printing.kt
@@ -11,11 +11,11 @@
 
 package test
 
-import io.ktor.utils.io.core.ByteReadPacket
-import io.ktor.utils.io.core.Input
-import io.ktor.utils.io.core.readAvailable
-import io.ktor.utils.io.core.use
-import io.ktor.utils.io.pool.useInstance
+import kotlinx.io.core.ByteReadPacket
+import kotlinx.io.core.Input
+import kotlinx.io.core.readAvailable
+import kotlinx.io.core.use
+import kotlinx.io.pool.useInstance
 import net.mamoe.mirai.utils.DefaultLogger
 import net.mamoe.mirai.utils.MiraiInternalAPI
 import net.mamoe.mirai.utils.MiraiLoggerWithSwitch
diff --git a/mirai-core-qqandroid/src/jvmTest/kotlin/net.mamoe.mirai.qqandroid.io.serialization/JceDecoderTest.kt b/mirai-core-qqandroid/src/jvmTest/kotlin/net.mamoe.mirai.qqandroid.io.serialization/JceDecoderTest.kt
index 2f67a7195..a782d38f3 100644
--- a/mirai-core-qqandroid/src/jvmTest/kotlin/net.mamoe.mirai.qqandroid.io.serialization/JceDecoderTest.kt
+++ b/mirai-core-qqandroid/src/jvmTest/kotlin/net.mamoe.mirai.qqandroid.io.serialization/JceDecoderTest.kt
@@ -11,7 +11,7 @@ package net.mamoe.mirai.qqandroid.io.serialization
 
 /*
 
-import io.ktor.utils.io.core.readBytes
+import kotlinx.io.core.readBytes
 import kotlinx.serialization.SerialId
 import kotlinx.serialization.Serializable
 import net.mamoe.mirai.qqandroid.io.JceOutput
diff --git a/mirai-core-qqandroid/src/jvmTest/kotlin/test/ProtoBufDataClassGenerator.kt b/mirai-core-qqandroid/src/jvmTest/kotlin/test/ProtoBufDataClassGenerator.kt
index 860aa0b78..b456838cb 100644
--- a/mirai-core-qqandroid/src/jvmTest/kotlin/test/ProtoBufDataClassGenerator.kt
+++ b/mirai-core-qqandroid/src/jvmTest/kotlin/test/ProtoBufDataClassGenerator.kt
@@ -28,7 +28,7 @@ fun main() {
     println(
         File(
             """
-            E:\Projects\QQAndroidFF\app\src\main\java\tencent\im\oidb\cmd0x857
+            E:\Projects\QQAndroidFF\app\src\main\java\tencent\im\msgrevoke
         """.trimIndent()
         )
             .generateUnarrangedClasses().toMutableList().arrangeClasses().joinToString("\n\n")
diff --git a/mirai-core/src/androidMain/kotlin/net/mamoe/mirai/utils/ExternalImageAndroid.kt b/mirai-core/src/androidMain/kotlin/net/mamoe/mirai/utils/ExternalImageAndroid.kt
index 328af2a50..06eaee34e 100644
--- a/mirai-core/src/androidMain/kotlin/net/mamoe/mirai/utils/ExternalImageAndroid.kt
+++ b/mirai-core/src/androidMain/kotlin/net/mamoe/mirai/utils/ExternalImageAndroid.kt
@@ -53,6 +53,7 @@ fun File.toExternalImage(): ExternalImage {
         md5 = this.inputStream().use { it.md5() },
         imageFormat = this.nameWithoutExtension,
         input = this.inputStream(),
+        inputSize = this.length(),
         filename = this.name
     )
 }
diff --git a/mirai-core/src/androidMain/kotlin/net/mamoe/mirai/utils/SystemDeviceInfo.kt b/mirai-core/src/androidMain/kotlin/net/mamoe/mirai/utils/SystemDeviceInfo.kt
index 88b572239..11990fa36 100644
--- a/mirai-core/src/androidMain/kotlin/net/mamoe/mirai/utils/SystemDeviceInfo.kt
+++ b/mirai-core/src/androidMain/kotlin/net/mamoe/mirai/utils/SystemDeviceInfo.kt
@@ -13,7 +13,7 @@ import android.annotation.SuppressLint
 import android.net.wifi.WifiManager
 import android.os.Build
 import android.telephony.TelephonyManager
-import io.ktor.utils.io.core.toByteArray
+import kotlinx.io.core.toByteArray
 import kotlinx.serialization.Serializable
 import kotlinx.serialization.Transient
 import kotlinx.serialization.UnstableDefault
diff --git a/mirai-core/src/androidMain/kotlin/net/mamoe/mirai/utils/io/PlatformDatagramChannelAndroid.kt b/mirai-core/src/androidMain/kotlin/net/mamoe/mirai/utils/io/PlatformDatagramChannelAndroid.kt
index 801a19299..ed02843f3 100644
--- a/mirai-core/src/androidMain/kotlin/net/mamoe/mirai/utils/io/PlatformDatagramChannelAndroid.kt
+++ b/mirai-core/src/androidMain/kotlin/net/mamoe/mirai/utils/io/PlatformDatagramChannelAndroid.kt
@@ -9,12 +9,12 @@
 
 package net.mamoe.mirai.utils.io
 
-import io.ktor.utils.io.core.ByteReadPacket
-import io.ktor.utils.io.core.Closeable
-import io.ktor.utils.io.nio.readPacketAtMost
-import io.ktor.utils.io.nio.writePacket
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.withContext
+import kotlinx.io.core.ByteReadPacket
+import kotlinx.io.core.Closeable
+import kotlinx.io.nio.readPacketAtMost
+import kotlinx.io.nio.writePacket
 import java.net.InetSocketAddress
 import java.nio.channels.DatagramChannel
 import java.nio.channels.ReadableByteChannel
diff --git a/mirai-core/src/androidMain/kotlin/net/mamoe/mirai/utils/io/PlatformSocket.kt b/mirai-core/src/androidMain/kotlin/net/mamoe/mirai/utils/io/PlatformSocket.kt
index 063565c1d..f6c1d2513 100644
--- a/mirai-core/src/androidMain/kotlin/net/mamoe/mirai/utils/io/PlatformSocket.kt
+++ b/mirai-core/src/androidMain/kotlin/net/mamoe/mirai/utils/io/PlatformSocket.kt
@@ -9,13 +9,13 @@
 
 package net.mamoe.mirai.utils.io
 
-import io.ktor.utils.io.core.ByteReadPacket
-import io.ktor.utils.io.core.Closeable
-import io.ktor.utils.io.core.ExperimentalIoApi
-import io.ktor.utils.io.streams.readPacketAtMost
-import io.ktor.utils.io.streams.writePacket
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.withContext
+import kotlinx.io.core.ByteReadPacket
+import kotlinx.io.core.Closeable
+import kotlinx.io.core.ExperimentalIoApi
+import kotlinx.io.streams.readPacketAtMost
+import kotlinx.io.streams.writePacket
 import net.mamoe.mirai.utils.MiraiInternalAPI
 import java.io.BufferedInputStream
 import java.io.BufferedOutputStream
diff --git a/mirai-core/src/androidMain/kotlin/net/mamoe/mirai/utils/platformAndroid.kt b/mirai-core/src/androidMain/kotlin/net/mamoe/mirai/utils/platformAndroid.kt
index 9adb9aa12..8430ce7e8 100644
--- a/mirai-core/src/androidMain/kotlin/net/mamoe/mirai/utils/platformAndroid.kt
+++ b/mirai-core/src/androidMain/kotlin/net/mamoe/mirai/utils/platformAndroid.kt
@@ -12,7 +12,7 @@ package net.mamoe.mirai.utils
 import io.ktor.client.HttpClient
 import io.ktor.client.engine.cio.CIO
 import io.ktor.util.KtorExperimentalAPI
-import io.ktor.utils.io.pool.useInstance
+import kotlinx.io.pool.useInstance
 import net.mamoe.mirai.utils.io.ByteArrayPool
 import java.io.ByteArrayOutputStream
 import java.io.DataInput
diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/BotAccount.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/BotAccount.kt
index b4c84333a..1f0a2ebe6 100644
--- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/BotAccount.kt
+++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/BotAccount.kt
@@ -11,7 +11,7 @@
 
 package net.mamoe.mirai
 
-import io.ktor.utils.io.core.toByteArray
+import kotlinx.io.core.toByteArray
 import net.mamoe.mirai.utils.MiraiExperimentalAPI
 import net.mamoe.mirai.utils.MiraiInternalAPI
 import net.mamoe.mirai.utils.md5
diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/data/ImageLink.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/data/ImageLink.kt
index 713ff08a1..3cef0c4a3 100644
--- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/data/ImageLink.kt
+++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/data/ImageLink.kt
@@ -10,8 +10,8 @@
 package net.mamoe.mirai.data
 
 import io.ktor.client.request.get
-import io.ktor.utils.io.core.ByteReadPacket
-import io.ktor.utils.io.core.readBytes
+import kotlinx.io.core.ByteReadPacket
+import kotlinx.io.core.readBytes
 import net.mamoe.mirai.utils.Http
 
 interface ImageLink {
diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/events/BotEvents.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/events/BotEvents.kt
index 64a6b9e5e..ac2c51b43 100644
--- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/events/BotEvents.kt
+++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/events/BotEvents.kt
@@ -21,7 +21,6 @@ import net.mamoe.mirai.event.events.ImageUploadEvent.Failed
 import net.mamoe.mirai.event.events.ImageUploadEvent.Succeed
 import net.mamoe.mirai.message.data.Image
 import net.mamoe.mirai.message.data.MessageChain
-import net.mamoe.mirai.message.data.MessageSource
 import net.mamoe.mirai.utils.ExternalImage
 import net.mamoe.mirai.utils.MiraiExperimentalAPI
 
diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/ExternalImage.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/ExternalImage.kt
index 59a07668c..b26e7163e 100644
--- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/ExternalImage.kt
+++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/ExternalImage.kt
@@ -12,9 +12,9 @@
 package net.mamoe.mirai.utils
 
 import io.ktor.utils.io.ByteReadChannel
-import io.ktor.utils.io.core.ByteReadPacket
-import io.ktor.utils.io.core.Input
 import kotlinx.io.InputStream
+import kotlinx.io.core.ByteReadPacket
+import kotlinx.io.core.Input
 import net.mamoe.mirai.contact.Contact
 import net.mamoe.mirai.contact.Group
 import net.mamoe.mirai.contact.QQ
diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/channels.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/channels.kt
index e2c480e16..c544f09c4 100644
--- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/channels.kt
+++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/channels.kt
@@ -15,13 +15,10 @@ package net.mamoe.mirai.utils
 
 
 import io.ktor.utils.io.ByteReadChannel
-import io.ktor.utils.io.ByteWriteChannel
-import io.ktor.utils.io.close
-import io.ktor.utils.io.core.Output
-import io.ktor.utils.io.core.writeFully
-import io.ktor.utils.io.pool.useInstance
 import io.ktor.utils.io.readAvailable
 import kotlinx.io.OutputStream
+import kotlinx.io.core.Output
+import kotlinx.io.pool.useInstance
 import net.mamoe.mirai.utils.io.ByteArrayPool
 import kotlin.jvm.JvmMultifileClass
 import kotlin.jvm.JvmName
diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/cryptor/TEA.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/cryptor/TEA.kt
index 4a98d4441..3e43b3fde 100644
--- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/cryptor/TEA.kt
+++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/cryptor/TEA.kt
@@ -9,9 +9,8 @@
 
 package net.mamoe.mirai.utils.cryptor
 
-import io.ktor.utils.io.core.ByteReadPacket
-import io.ktor.utils.io.core.readFully
-import io.ktor.utils.io.pool.useInstance
+import kotlinx.io.core.ByteReadPacket
+import kotlinx.io.pool.useInstance
 import net.mamoe.mirai.utils.MiraiInternalAPI
 import net.mamoe.mirai.utils.io.ByteArrayPool
 import net.mamoe.mirai.utils.io.toByteArray
diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/io/PlatformDatagramChannel.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/io/PlatformDatagramChannel.kt
index 057670f01..9e4b98f1a 100644
--- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/io/PlatformDatagramChannel.kt
+++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/io/PlatformDatagramChannel.kt
@@ -9,8 +9,8 @@
 
 package net.mamoe.mirai.utils.io
 
-import io.ktor.utils.io.core.ByteReadPacket
-import io.ktor.utils.io.core.Closeable
+import kotlinx.io.core.ByteReadPacket
+import kotlinx.io.core.Closeable
 import net.mamoe.mirai.utils.MiraiInternalAPI
 
 /**
diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/io/PlatformSocket.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/io/PlatformSocket.kt
index 24a6d7d86..70b411fae 100644
--- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/io/PlatformSocket.kt
+++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/io/PlatformSocket.kt
@@ -9,8 +9,8 @@
 
 package net.mamoe.mirai.utils.io
 
-import io.ktor.utils.io.core.ByteReadPacket
-import io.ktor.utils.io.core.Closeable
+import kotlinx.io.core.ByteReadPacket
+import kotlinx.io.core.Closeable
 import net.mamoe.mirai.utils.MiraiInternalAPI
 
 /**
diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/io/byteArrays.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/io/byteArrays.kt
index 970a71a7d..6a191ce29 100644
--- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/io/byteArrays.kt
+++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/io/byteArrays.kt
@@ -13,11 +13,11 @@
 
 package net.mamoe.mirai.utils.io
 
-import io.ktor.utils.io.charsets.Charset
-import io.ktor.utils.io.charsets.Charsets
-import io.ktor.utils.io.core.ByteReadPacket
-import io.ktor.utils.io.core.String
-import io.ktor.utils.io.core.use
+import kotlinx.io.charsets.Charset
+import kotlinx.io.charsets.Charsets
+import kotlinx.io.core.ByteReadPacket
+import kotlinx.io.core.String
+import kotlinx.io.core.use
 import net.mamoe.mirai.utils.checkOffsetAndLength
 import kotlin.contracts.ExperimentalContracts
 import kotlin.contracts.InvocationKind
diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/io/chunked.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/io/chunked.kt
index e9c3a0dfc..fc0b54515 100644
--- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/io/chunked.kt
+++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/io/chunked.kt
@@ -10,16 +10,14 @@
 package net.mamoe.mirai.utils.io
 
 import io.ktor.utils.io.ByteReadChannel
-import io.ktor.utils.io.core.ByteReadPacket
-import io.ktor.utils.io.core.Input
-import io.ktor.utils.io.core.isNotEmpty
-import io.ktor.utils.io.core.readAvailable
-import io.ktor.utils.io.pool.useInstance
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.flow
 import kotlinx.coroutines.flow.flowOf
 import kotlinx.io.InputStream
+import kotlinx.io.core.ByteReadPacket
+import kotlinx.io.core.Input
+import kotlinx.io.pool.useInstance
 import net.mamoe.mirai.utils.MiraiInternalAPI
 
 
diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/io/conversion.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/io/conversion.kt
index dfd11e4df..c47f22772 100644
--- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/io/conversion.kt
+++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/io/conversion.kt
@@ -11,6 +11,8 @@
 
 package net.mamoe.mirai.utils.io
 
+import kotlinx.io.core.IoBuffer
+import kotlinx.io.pool.ObjectPool
 import kotlin.random.Random
 import kotlin.random.nextInt
 
@@ -200,3 +202,13 @@ fun ByteArray.toInt(): Int =
     (this[0].toInt().and(255) shl 24) + (this[1].toInt().and(255) shl 16) + (this[2].toInt().and(255) shl 8) + (this[3].toInt().and(
         255
     ) shl 0)
+
+/**
+ * 从 [IoBuffer.Pool] [borrow][ObjectPool.borrow] 一个 [IoBuffer] 然后将 [this] 写入.
+ * 注意回收 ([ObjectPool.recycle])
+ */
+fun ByteArray.toIoBuffer(
+    offset: Int = 0,
+    length: Int = this.size - offset,
+    pool: ObjectPool<IoBuffer> = IoBuffer.Pool
+): IoBuffer = pool.borrow().let { it.writeFully(this, offset, length); it }
\ No newline at end of file
diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/io/output.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/io/output.kt
index 837541e2a..671e023b3 100644
--- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/io/output.kt
+++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/io/output.kt
@@ -13,7 +13,7 @@
 
 package net.mamoe.mirai.utils.io
 
-import io.ktor.utils.io.core.*
+import kotlinx.io.core.*
 import net.mamoe.mirai.utils.MiraiInternalAPI
 import net.mamoe.mirai.utils.coerceAtMostOrFail
 import net.mamoe.mirai.utils.cryptor.TEA
diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/platform.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/platform.kt
index cd9188012..c4b730d91 100644
--- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/platform.kt
+++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/platform.kt
@@ -12,7 +12,7 @@
 package net.mamoe.mirai.utils
 
 import io.ktor.client.HttpClient
-import io.ktor.utils.io.core.toByteArray
+import kotlinx.io.core.toByteArray
 
 /**
  * 时间戳
diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/MessagePacket.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/MessagePacket.kt
index e36d3bd19..9e2b6c493 100644
--- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/MessagePacket.kt
+++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/MessagePacket.kt
@@ -12,9 +12,9 @@
 package net.mamoe.mirai.message
 
 import io.ktor.utils.io.ByteWriteChannel
-import io.ktor.utils.io.core.Input
+import kotlinx.io.core.Input
 import io.ktor.utils.io.core.Output
-import io.ktor.utils.io.core.use
+import kotlinx.io.core.use
 import net.mamoe.mirai.contact.Contact
 import net.mamoe.mirai.contact.QQ
 import net.mamoe.mirai.message.data.Image
diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/SendImageUtilsJvm.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/SendImageUtilsJvm.kt
index 63e246166..a28d13071 100644
--- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/SendImageUtilsJvm.kt
+++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/SendImageUtilsJvm.kt
@@ -11,9 +11,9 @@
 
 package net.mamoe.mirai.message
 
-import io.ktor.utils.io.core.Input
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.withContext
+import kotlinx.io.core.Input
 import net.mamoe.mirai.contact.Contact
 import net.mamoe.mirai.message.data.Image
 import net.mamoe.mirai.message.data.OfflineImage
diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/BotConfigurationJvm.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/BotConfigurationJvm.kt
index 8f62dc5a8..3b7726efe 100644
--- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/BotConfigurationJvm.kt
+++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/BotConfigurationJvm.kt
@@ -9,7 +9,6 @@
 
 package net.mamoe.mirai.utils
 
-import io.ktor.utils.io.core.use
 import kotlinx.coroutines.CoroutineName
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.GlobalScope
@@ -21,6 +20,7 @@ import kotlinx.coroutines.io.writeFully
 import kotlinx.coroutines.sync.Mutex
 import kotlinx.coroutines.sync.withLock
 import kotlinx.coroutines.withContext
+import kotlinx.io.core.use
 import net.mamoe.mirai.Bot
 import net.mamoe.mirai.network.BotNetworkHandler
 import java.awt.Image
diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/ExternalImageJvm.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/ExternalImageJvm.kt
index f6b9f8441..4f500aac4 100644
--- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/ExternalImageJvm.kt
+++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/ExternalImageJvm.kt
@@ -12,13 +12,13 @@
 package net.mamoe.mirai.utils
 
 import io.ktor.utils.io.ByteReadChannel
-import io.ktor.utils.io.core.Input
-import io.ktor.utils.io.core.buildPacket
-import io.ktor.utils.io.core.copyTo
-import io.ktor.utils.io.errors.IOException
-import io.ktor.utils.io.streams.asOutput
 import kotlinx.coroutines.Dispatchers.IO
 import kotlinx.coroutines.withContext
+import kotlinx.io.core.Input
+import kotlinx.io.core.buildPacket
+import kotlinx.io.core.copyTo
+import kotlinx.io.errors.IOException
+import kotlinx.io.streams.asOutput
 import net.mamoe.mirai.utils.io.getRandomString
 import java.awt.image.BufferedImage
 import java.io.File
diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/PlatformUtilsJvm.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/PlatformUtilsJvm.kt
index 49472129a..46d10fe8c 100644
--- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/PlatformUtilsJvm.kt
+++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/PlatformUtilsJvm.kt
@@ -13,7 +13,7 @@ package net.mamoe.mirai.utils
 
 import io.ktor.client.HttpClient
 import io.ktor.client.engine.cio.CIO
-import io.ktor.utils.io.pool.useInstance
+import kotlinx.io.pool.useInstance
 import net.mamoe.mirai.utils.io.ByteArrayPool
 import java.io.*
 import java.net.InetAddress
diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/SystemDeviceInfo.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/SystemDeviceInfo.kt
index e71cbbfdd..8bcbf6f42 100644
--- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/SystemDeviceInfo.kt
+++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/SystemDeviceInfo.kt
@@ -9,7 +9,7 @@
 
 package net.mamoe.mirai.utils
 
-import io.ktor.utils.io.core.toByteArray
+import kotlinx.io.core.toByteArray
 import kotlinx.serialization.Serializable
 import kotlinx.serialization.Transient
 import kotlinx.serialization.UnstableDefault
diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/io/PlatformSocket.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/io/PlatformSocket.kt
index 063565c1d..f6c1d2513 100644
--- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/io/PlatformSocket.kt
+++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/io/PlatformSocket.kt
@@ -9,13 +9,13 @@
 
 package net.mamoe.mirai.utils.io
 
-import io.ktor.utils.io.core.ByteReadPacket
-import io.ktor.utils.io.core.Closeable
-import io.ktor.utils.io.core.ExperimentalIoApi
-import io.ktor.utils.io.streams.readPacketAtMost
-import io.ktor.utils.io.streams.writePacket
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.withContext
+import kotlinx.io.core.ByteReadPacket
+import kotlinx.io.core.Closeable
+import kotlinx.io.core.ExperimentalIoApi
+import kotlinx.io.streams.readPacketAtMost
+import kotlinx.io.streams.writePacket
 import net.mamoe.mirai.utils.MiraiInternalAPI
 import java.io.BufferedInputStream
 import java.io.BufferedOutputStream
diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/io/PlatformSocketJvm.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/io/PlatformSocketJvm.kt
index db26ec821..1cf48c36f 100644
--- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/io/PlatformSocketJvm.kt
+++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/io/PlatformSocketJvm.kt
@@ -9,12 +9,12 @@
 
 package net.mamoe.mirai.utils.io
 
-import io.ktor.utils.io.core.ByteReadPacket
-import io.ktor.utils.io.core.Closeable
-import io.ktor.utils.io.nio.readPacketAtMost
-import io.ktor.utils.io.nio.writePacket
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.withContext
+import kotlinx.io.core.ByteReadPacket
+import kotlinx.io.core.Closeable
+import kotlinx.io.nio.readPacketAtMost
+import kotlinx.io.nio.writePacket
 import java.net.InetSocketAddress
 import java.nio.channels.DatagramChannel
 import java.nio.channels.ReadableByteChannel