Android中有点特殊,用网上普遍的办法(通过File balabala)是没法成功的。
Android中就要用Android的方法,通过DexFile来找。
private fun getClassesNameListInPackage(packageName: String, context: Context): List<String> {
val realPackageName = "${context.packageName}.$packageName"
val df = DexFile(context.packageCodePath)
val enumration = df.entries()
val list = mutableListOf<String>()
while (enumration.hasMoreElements()) {
val className = enumration.nextElement()
if (className.contains(realPackageName)) {
list.add(className)
}
}
return list
}
fun getClassesInPackage(packageName: String, context: Context)
= getClassesNameListInPackage(packageName, context).mapNotNull { Class.forName(it) }
这个方法原来是可行的,但是在高版本的AS中就不行了,Google之后发现是Instant Run惹的祸,IntstantRun把本来暴露出来的文件放在了一个叫instant-run.zip的压缩包中,导致上面的方法找不到了。所以,Settings->Build->Instant Run->Disable,就可以愉快的使用了。
网友评论