Android 응용 프로그램 목록 가 져 오기

3405 단어 Android
머리말
현재 안 드 로 이 드 11 이 곧 발 표 될 시기 입 니 다. 현재 안 드 로 이 드 핸드폰 에서 응용 프로그램 설치 목록 을 가 져 오 려 면 세 가지 차원 에서 가 져 오 는 방법, 시스템 버 전, 시스템 응용 여 부 를 구분 해 야 합 니 다.
  • 획득 방법: 적어도 두 가지 방법 이 있 는데, 그들의 행동 결 과 는 차이 가 있 을 수 있다
  • 시스템 버 전: Android 11 부터 응용 목록 가 져 오기 제한
  • 시스템 응용 여부: 시스템 응용 과 비 시스템 응용 에서 얻 은 결과 도 다 릅 니 다
  • 획득 방법 소개
    모든 응용 목록 (시스템 응용 + 비 시스템 응용) 을 가 져 옵 니 다. 자주 사용 하 는 방법 은 셸 명령 행, 시스템 API 입 니 다.
    시스템 응용 여 부 를 좀 더 구분 하려 면 상기 결 과 를 한 번 여과 하면 된다.다음은 각각 소개 한다.
    1. 셸 명령 행
    pm list packages
    

    예제 코드:
    private List getPkgList() {
    	List packages = new ArrayList();
    	try {
    		Process p = Runtime.getRuntime().exec("pm list packages");
    		InputStreamReader isr = new InputStreamReader(p.getInputStream(), "utf-8");
    		BufferedReader br = new BufferedReader(isr);
    		String line = br.readLine();
    		while (line != null) {
    			line = line.trim();
    			if (line.length() > 8) {
    				String prefix = line.substring(0, 8);
    				if (prefix.equalsIgnoreCase("package:")) {
    					line = line.substring(8).trim();
    					if (!TextUtils.isEmpty(line)) {
    						packages.add(line);
    					}
    				}
    			}
    			line = br.readLine();
    		}
    		br.close();
    		p.destroy();
    	} catch (Throwable t) {
    		t.printStacktraces();
    	}
    	return packages;
    }
    

    2. 시스템 API
    PackageManager.getInstalledPackages()
    

    예제 코드:
    private List getPkgListNew() {
    	List packages = new ArrayList();
    	try {
    		List packageInfos = context.getPackageManager().getInstalledPackages(PackageManager.GET_ACTIVITIES |
    				PackageManager.GET_SERVICES);
    		for (PackageInfo info : packageInfos) {
    			String pkg = info.packageName;
    			packages.add(pkg);
    		}
    	} catch (Throwable t) {
    		t.printStackTrace();;
    	}
    	return packages;
    }
    

    시스템 적용 여부 판단
    // 通过packName得到PackageInfo,作为参数传入即可
    private boolean isSystemApp(PackageInfo pi) {
    	boolean isSysApp = (pi.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 1;
    	boolean isSysUpd = (pi.applicationInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) == 1;
    	return isSysApp || isSysUpd;
    }
    

    총화 대비
  • 테스트 기: Google Pixel 3 XL
  • 시스템 응용: 262 개
  • 비 시스템 응용: 2 개 (테스트 데모 포함)
  • 획득 방법
    시스템 응용
    비 시스템 응용
    < Android 11
    >= Android 11
    < Android 11
    >= Android 11
    셸 명령
    - 사용 가능 - 권한 필요 없 음
    - 조건 사용 가능 - 권한 없 음: 결과 감소 (99 개) - 권한 있 음: 모든 응용 프로그램 획득 (262 개)
    - 사용 가능 - 권한 필요 없 음
    - 조건 부 사용 가능 - 권한 없 음: 자신 만 (1 개) - 권한 있 음: 모든 적용 가능 (2 개)
    시스템 API
    - 사용 가능 - 권한 필요 없 음
    - 조건 사용 가능 - 권한 없 음: 결과 감소 (99 개) - 권한 있 음: 모든 응용 프로그램 획득 (262 개)
    - 사용 가능 - 권한 필요 없 음
    - 조건 부 사용 가능 - 권한 없 음: 자신 만 (1 개) - 권한 있 음: 모든 적용 가능 (2 개)
    설명:
  • 여기 서 말 하 는 권한 은: QUERYALL_PACKAGES, Android 11 신규 권한, 동적 신청 없 음
  • 여기 서 말 하 는 >= Android 11 은 targetSdkVersion 이 Android 11 이 고 11 장치 에서 실 행 됩 니 다
  • .
    추가: 방송 감청 애플 리 케 이 션 설치/마 운 트 해제 행위 변화
    라디오, 감청 애플 리 케 이 션 설치 와 마 운 트 해제 동작 을 사용 했다 면 안 드 로 이 드 11 에서 도 행동 변화 가 있 었 다.
    요약 하면 안 드 로 이 드 11 에서 QUERY 가 없 으 면ALL_PACKAGES 권한 은 설치 동작 을 감지 할 수 없습니다.
    Android 11 이전
  • 설치/마 운 트 해제
  • 를 감청 할 수 있 습 니 다.
    Android 11 시작
  • QUERY 없 으 면ALL_PACKAGES 권한: 마 운 트 해제 만 들 을 수 있 습 니 다
  • QUERYALL_PACKAGES 권한: 설치/마 운 트 해제
  • 좋은 웹페이지 즐겨찾기