Android 获取安装的app

本文介绍了在Android逆向工程中,利用PackageManager、getPackageInfo、getApplicationInfo以及Intent方法获取设备上安装应用列表的几种方式,包括检查应用是否存在和获取应用详细信息。

在Android逆向中,很多目标app会获取设备安装的app列表来判断设备的环境是否干净,下面将会从几个点分析如何获取设备安装的app

PackageManager

使用 PackageManager 可以获取设备上所有已安装的应用程序信息

PackageManager packageManager = getPackageManager();
List<ApplicationInfo> apps = packageManager.getInstalledApplications(PackageManager.GET_META_DATA);
for (ApplicationInfo appInfo : apps) {
    String appName = packageManager.getApplicationLabel(appInfo).toString();
    String packageName = appInfo.packageName;
    // 其他信息如版本号等也可以通过 appInfo 获取
}

调用PackageManager的getPackageInfo来判断app是否存在

public boolean isAppInstalled(String packageName) {
    PackageManager pm = getPackageManager();
    try {
        pm.getPackageInfo(packageName, PackageManager.GET_ACTIVITIES);
        return true;
    } catch (PackageManager.NameNotFoundException e) {
        return false;
    }
}

调用PackageManager的getApplicationInfo来判断app是否存在

PackageManager pm = getPackageManager();
ApplicationInfo appInfo = null;
try {
    appInfo = pm.getApplicationInfo("com.example.myapp", 0);
} catch (PackageManager.NameNotFoundException e) {
    e.printStackTrace();
}
boolean isInstalled = (appInfo != null);

Intent

通过发送一个隐式的 Intent ,你可以请求系统返回已安装应用的信息

Intent intent = new Intent(Intent.ACTION_MAIN, null);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
List<ResolveInfo> apps = getPackageManager().queryIntentActivities(intent, 0);
for (ResolveInfo appInfo : apps) {
    String appName = appInfo.loadLabel(getPackageManager()).toString();
    String packageName = appInfo.activityInfo.packageName;
}

检测单个app是否存在

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setPackage("com.example.myapp");  // 替换成要检查的应用的包名
List<ResolveInfo> activities = getPackageManager().queryIntentActivities(intent, 0);
boolean isInstalled = !activities.isEmpty();

Android 系统中,获取安装 app 列表有不同的实现方法。 一种常见方法是通过 `PackageManager` 来获取,代码示例如下: ```java import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import java.util.ArrayList; import java.util.List; class AppInfo { private String label; private String package_name; private android.graphics.drawable.Drawable icon; public void setIcon(android.graphics.drawable.Drawable icon) { this.icon = icon; } public void setLabel(String label) { this.label = label; } public void setPackage_name(String package_name) { this.package_name = package_name; } } public class AppListUtils { /** * 获取手机已安装应用列表 * @param ctx * @param isFilterSystem 是否过滤系统应用 * @return */ public static ArrayList<AppInfo> getAllAppInfo(Context ctx, boolean isFilterSystem) { ArrayList<AppInfo> appBeanList = new ArrayList<>(); AppInfo bean = null; PackageManager packageManager = ctx.getPackageManager(); List<PackageInfo> list = packageManager.getInstalledPackages(0); for (PackageInfo p : list) { bean = new AppInfo(); bean.setIcon(p.applicationInfo.loadIcon(packageManager)); bean.setLabel(packageManager.getApplicationLabel(p.applicationInfo).toString()); bean.setPackage_name(p.applicationInfo.packageName); int flags = p.applicationInfo.flags; // 判断是否是属于系统的 apk if ((flags & ApplicationInfo.FLAG_SYSTEM) != 0 && isFilterSystem) { // bean.setSystem(true); } else { appBeanList.add(bean); } } return appBeanList; } } ``` 这种方法可以获取手机上已安装应用列表,将获取到的信息用集合返回,还能自己定义是否过滤系统应用,`AppInfo` 是一个实体类,包含应用的名称、包名、图标等信息 [^1]。 不过,从 Android 11 开始,Google Play 不再建议使用这种方式,到 Android 15 开始,该 API 通过 action 方式获取不到 app 列表了。还有一种建议使用的方案(获取到的 app 列表比较少,大部分非系统应用都可以获取,超过半数的系统应用获取不到),即与 action 配合使用,也可以将 action 与白名单混合使用 [^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值