一、通过命令查询和获取应用的Package及Acticity

(一)通过命令查询应用包名及安装信息

以下是常用命令:

命令形式作用
adb shell pm list packages查询系统中所有应用的包名
adb shell pm list packages -s查询系统应用包名
adb shell pm list packages -3查询第三方应用包名
adb shell pm list packages -f查询系统中所有应用的包名及与包相关联的文件信息
adb shell pm list packages -u

查询包和安装信息(安装来源)

组合查询,例如

adb shell pm list packages -s -f

(二)通过命令获取当前应用包名及活动名称

1、常用方法

Linux系统查询命令(Linux 系统采用 grep 命令查询文件中的字符串):

adb shell dumpsys window | grep mCurrentFocus

Windows系统查询命令(Windows 系统采用 findstr 命令查询文件中的字符串):

adb shell dumpsys window | findstr mCurrentFocus

2、其他方法

先使用 adb logcatadb logcat -s ActivityTaskManager 命令打印 log 信息,然后启动应用程序相应的活动,然后在 log 信息中找到含有 ActivityTaskManager 与启动 Activity 相关的信息,例如:

ActivityTaskManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 pkg=com.android.gallery3d cmp=com.android.gallery3d/.app.GalleryActivity bnds=[652,2035][795,2140]} from uid 10067

最后通过上述 log 信息可知,包名为 com.android.gallery3d ,被启动的活动名为 GalleryActivity

二、通过代码查询和获取应用程序的Package及Acticity

注意:在 Android 11 (API 30)中引入了包可见性的概念,即在 Android 11 及以上版本中将不能直接获取或查询到系统已安装的全部应用包名,包括第三方应用。所以,直接调用 PackageManagergetInstalledApplications() getInstalledPackages() 等的方法后需要在清单文件中声明以下权限,否则只能获取或查询到部分已安装应用包名:

<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>

(一)通过查询指定应用包名判断应用是否存在

   
 public boolean isTargetPackageName(Context context, String packageName){
        PackageManager packageManager = context.getPackageManager();
        try {
            packageManager.getApplicationInfo(packageName, 0);
            return true;
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return false;
    }

(二)获取系统所有的应用包名

    public List<String> getAllApplicationPackages(Context context) {
        //1. 创建泛型为String类型的List类型对象packageList,用于缓存所有获取到的应用包名
        List<String> packageList = new ArrayList<String>();
        try{
            //2. 通过getPackageManager()获取PackageManager类型的对象manager
            PackageManager manager = context.getPackageManager();
            //3. 通过调用manager.getInstalledPackages()获取的泛型为PackageInfo类型的List类型对象packageInfoList
            List<PackageInfo> packageInfoList = manager.getInstalledPackages(0);
            //4. 创建PackageInfo类型的变量info,用于接收packageInfoList对象中存储的PackageInfo类型数据
            //,然后通过for循环遍历info
            for (PackageInfo info : packageInfoList) {
                //5.将从info中获取到的应用包名packageName缓存到packageList对象中
                packageList.add(info.packageName);
                Log.i("MainActivity", "----------packageName = " + info.packageName);
            }
        } catch (Exception e){
            e.printStackTrace();
        }
        return packageList;
    }

(三)判断通过 Intent 启动 Acticity 是否存在

 if (getPackageManager().resolveActivity(intent, 0) == null) {  
 
       // 说明系统中不存在这个activity
  }
 
 if (intent.resolveActivity(getPackageManager()) == null) {  
 
       // 说明系统中不存在这个activity
  }
 
  List<ResolveInfo> list = getPackageManager().queryIntentActivities(intent, 0);
  if (list.size() == 0) {   
       // 说明系统中不存在这个activity
  }

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐