要判斷一個 Android 應用是否使用了 KMM(Kotlin Multiplatform Mobile) 框架,可以通過以下方法逐步驗證:
一、安裝包結構分析
-
解壓 APK
將.apk
文件重命名為.zip
并解壓,檢查以下特征:
?kotlin/
目錄:包含 Kotlin 標準庫文件(如kotlin-stdlib-common.jar
、kotlinx-coroutines-core
的多平臺版本)。?
lib/
目錄:包含 KMM 生成的共享模塊原生庫(如libshared.so
或libkmmmodule.so
)。?
assets/
目錄:若共享模塊包含資源文件,可能存放在此處。 -
檢查
AndroidManifest.xml
KMM 應用可能通過共享模塊聲明權限或服務(需結合代碼邏輯)。
二、代碼特征驗證
-
反編譯 Java/Kotlin 代碼
使用 JADX 或 Bytecode Viewer 檢查是否包含以下關鍵標識:
? 共享模塊包名:共享代碼通常位于commonMain
或shared
包路徑下(如com.example.shared.*
)。? KMM 多平臺語法:
?
expect
/actual
關鍵字:用于跨平臺接口聲明與實現:```kotlin // 共享模塊聲明(commonMain) expect class Platform() {fun getPlatform(): String }// Android 實現(androidMain) actual class Platform actual constructor() {actual fun getPlatform(): String = "Android" } ```
? 多平臺依賴庫:如
kotlinx-datetime
、ktor-client
(跨平臺網絡庫)。 -
查看 Gradle 依賴(如有源碼)
若可訪問項目源碼,檢查build.gradle.kts
或build.gradle
是否包含 KMM 配置:// 共享模塊的 build.gradle.kts plugins {id("com.android.library")id("org.jetbrains.kotlin.multiplatform") }kotlin {android() // Android 目標平臺ios() // iOS 目標平臺sourceSets {commonMain {dependencies {implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.0") // 多平臺協程}}} }
三、依賴庫與資源
-
檢查多平臺庫依賴
KMM 應用通常依賴以下多平臺庫:
?kotlinx-coroutines-core
:跨平臺協程支持。?
ktor-client
:跨平臺網絡請求庫。?
kotlinx-serialization
:跨平臺數據序列化。 -
共享資源文件
共享模塊可能包含多平臺通用的資源(如 JSON 配置文件、國際化字符串),路徑類似:
?shared/src/commonMain/resources/
四、運行時檢測
-
Logcat 日志過濾
運行應用時,通過adb logcat
過濾 KMM 相關日志(如共享模塊的初始化或跨平臺調用):adb logcat | grep -iE "KMM|shared|common" # 示例輸出: # D/KMM: Initializing shared module... # I/SharedModule: Fetching data from common logic.
-
調試符號檢查
若應用未混淆,共享模塊的類名或方法名可能包含Common
、Shared
等標識:// 共享模塊中的類 class CommonDataRepository { ... }
五、構建產物分析
-
共享模塊編譯輸出
KMM 的共享模塊在編譯后會生成以下文件:
? Android:.aar
或.jar
(如shared-release.aar
)。? iOS:
.framework
(如SharedModule.framework
,但僅存在于 iOS 構建中)。 -
跨平臺代碼復用
? Android 代碼調用共享模塊:val platform = Platform() // 來自共享模塊 val osName = platform.getPlatform() // 輸出 "Android"
六、與其他跨平臺框架的區分
框架 | 關鍵特征 |
---|---|
KMM | expect/actual 語法、commonMain 目錄、多平臺庫(如 kotlinx-coroutines-core )。 |
Flutter | libflutter.so 、Dart 代碼、assets/flutter_assets 目錄。 |
React Native | index.android.bundle 、com.facebook.react 包路徑、JSX 語法。 |
Xamarin | Mono.Android.dll 、Xamarin.Forms 命名空間、C# 代碼。 |
總結步驟
- 解壓 APK:檢查是否存在
kotlin/
目錄和多平臺依賴庫(如kotlinx-coroutines-core
)。 - 反編譯代碼:查找
expect/actual
關鍵字和共享模塊包名(如com.example.shared
)。 - 分析構建配置:確認是否使用
kotlin-multiplatform
插件和跨平臺目標聲明。 - 運行時日志:過濾
KMM
或shared
關鍵詞,觀察跨平臺邏輯調用。
若滿足上述 至少兩項,即可確認應用基于 KMM 開發。