怎么判断一个Android APP使用了KMM这个跨端框架
要判断一个 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 开发。