android resolveinfo查找activity,[Android]教你如何获取未安装应用的ResolveInfo

本文介绍了如何在Android中通过反射技术获取未安装应用的Activity信息,特别是ResolveInfo。作者分析了Android源码,揭示了PackageParser的工作原理,并提供了一段代码示例,演示如何利用反射重新解析PackageParser的包信息,从而获取intent-filter中的action和category。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原理:

查看了下安卓源码,明白了解析过程,只是自己的话就要移植安卓的源码,有人解析成功了,但是我觉得太麻烦。

大概说下安卓的解析过程吧。

public PackageInfo getPackageArchiveInfo(String archiveFilePath, int flags) {

PackageParser packageParser = new PackageParser(archiveFilePath);

DisplayMetrics metrics = new DisplayMetrics();

metrics.setToDefaults();

final File sourceFile = new File(archiveFilePath);

PackageParser.Package pkg = packageParser.parsePackage(

sourceFile, archiveFilePath, metrics, 0);

if (pkg == null) {

return null;

}

if ((flags & GET_SIGNATURES) != 0) {

packageParser.collectCertificates(pkg, 0);

}

return PackageParser.generatePackageInfo(pkg, null, flags, 0, 0);

}

这里是源码,首先通过PackageParser解析,然后通过PackageParser.generatePackageInfo返回PackageInfo,但是PackageInfo里却把intent-filter给去掉了,不知道为啥,不过既然知道了这段代码那么就好好办了。那就是通过反射把PackageParser.Package得到,然后再封装成intentfilter。

解决方案:

直接上代码把。因为完全就是通过反射又重写了一次代码。

try {

// 先得到解析类PackageParser并实例化

Class packageParserClass = Class.forName("android.content.pm.PackageParser");

Object packageParser = packageParserClass.getConstructor(String.class).newInstance(dexPath);

// 构建参数

DisplayMetrics metrics = new DisplayMetrics();

metrics.setToDefaults();

File sourceFile = new File(dexPath);

// 调用PackageParser的parsePackage解析数据

Method method = packageParserClass.getDeclaredMethod("parsePackage", File.class, String.class, DisplayMetrics.class, int.class);

method.setAccessible(true);

Object Package = method.invoke(packageParser, sourceFile, dexPath, metrics, 0);

// 反射得到结果

Field activities = Package.getClass().getDeclaredField("activities");

activities.setAccessible(true);

ArrayList filters = (ArrayList) activities.get(Package);

for (int i = 0; i < filters.size(); i++) {

Object activity = filters.get(i);

Field intentsField = activity.getClass().getField("intents");

intentsField.setAccessible(true);

ArrayList intents = (ArrayList) intentsField.get(activity);

for (int j = 0; j < intents.size(); j++) {

if (intents.iterator().hasNext()) {

String actionString = intents.get(0).getAction(0);

String categoryString = intents.get(0).getCategory(0);

System.out.println(actionString + " " + categoryString);

}

}

}

} catch (Exception e) {

}dexPath就是你要解析的APK的路径。intentfilter里有action和category。这样就实现了得到一个activity的ResolveInfo,至于为什么要类型转来转去,那就具体看安卓源码吧。

原文:http://blog.youkuaiyun.com/windowsxp2014/article/details/44698663

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值