Android Kotlin中不使用getProtectionDomain获取当前类文件路径的方法
Android 平台采用 ART 虚拟机运行应用,所有业务类都会被编译后打包进 APK 内的 dex 文件,不存在传统 JVM 环境下独立的 .class 实体文件,你需要的「类对应文件路径」可根据实际使用场景选择对应方案:
场景1:获取当前应用 APK 的设备存储路径
所有运行时加载的类都来自当前 APK 包,可直接通过系统 API 获取 APK 完整路径:
// 上下文可直接传入当前 Activity 实例 val apkPath = packageManager.getApplicationInfo(packageName, 0).sourceDir
场景2:调试阶段获取类对应源码的本地路径(仅调试可用)
如果是开发过程中需要定位类对应的源码文件,可通过栈信息获取:
val currentStack = Thread.currentThread().stackTrace val targetStackElement = currentStack.firstOrNull { it.className == this::class.java.name } // 调试模式下编译会默认保留源文件全路径,正式打包后仅保留文件名 val sourceFilePath = targetStackElement?.fileName
场景3:获取类所属的 dex 文件路径(适配多 dex、动态加载 dex 场景)
可通过类加载器的资源查找能力获取类对应的 dex 位置:
val classResourcePath = this::class.java.name.replace('.', '/') + ".class" val resource = this::class.java.classLoader?.getResource(classResourcePath) // 返回格式示例:jar:file:/data/app/你的包名-xxx.apk!/classes2.dex val dexFullPath = resource?.path
补充说明:Android 系统为了性能和安全优化,默认不会填充类的 ProtectionDomain 相关信息,所以 getProtectionDomain() 方法在 Android 平台必然返回空,不要在 Android 项目中使用该 API。
内容的提问来源于stack exchange,提问作者Liker
相关产品推荐
相关产品推荐

