通过ApplicationInfo下的sourceDir获取APK所有的class

今天,在学习注解处理器 AnnotationProcess 时,学习到了一点新知,记录下来,以备日后查阅,也让书友中的Android新人们可以了解了解,并能够应用到项目中去。

对于 android.content.pm.ApplicationInfo类,Android开发者应该都不陌生,通过这个类我们可以获取应用的如下常用属性,这些属性通常来自于AndroidManifest中。

backupAgentName 备份的类
className 应用程序类
processName 进程名
dataDir 数据所在目录
sourceDir 应用apk所在目录
publicSourceDir 应用apk所在目录
nativeLibraryDir 本地lib库目录(c/c++库)
enabled 是否启用应用所有组件,默认true
flags 应用关联标志
targetSdkVersion 最小SDK版本
descriptionRes 应用描述资源
theme 主题资源

今天,我主要讲一下 sourceDir。

通过这个目录,我们可以获取到apk的所有class,拿到想要的class,我们就可以通过反射机制 “干坏事” 了。

直接上干货吧:

String path = context.getPackageManager().getApplicationInfo(context.getPackageName(), 0).sourceDir;
DexFile dexfile = new DexFile(path);
Enumeration entries = dexfile.entries();
while(entries.hasMoreElements()) {
  String name = (String)entries.nextElement();
  if(name.contains(packageName)){
    classList.add(name);
  }
}

上述代码片段,遍历所有class,找到指定包名packageName下的class,加入列表,然后,我们就可以在注解处理器中干点“坏事”了,哈哈。

知识点虽小,但日积月累,一定能够厚积薄发!!!

你可能感兴趣的:(通过ApplicationInfo下的sourceDir获取APK所有的class)