Android應用生死輪回的那些事兒(7) - PackageManager的不公開API
前面,我們花了相當多的篇幅把PackageManager的公開API分門別類,并按版本順序講解了發展的過程。
有的同學問了,既然installer相關的API在Android 5.0才引入,那么Android 4.4及之前的應用安裝的程序是怎么寫出來的呢?
答案是,還有未公開的內部API啊。
這些API有些在未來的版本中就被轉正了。
Android 4.4時代的隱藏API
Android 4.4的不公開API大致分為以下幾類:
- uid相關:uid相關查詢沒有公開
- 多用戶相關:用戶相關的可能不宜公開吧
- 權限相關:提供比公開版更高的權限
- 安裝和清理相關:核心功能在這一版還沒有公開
Uid相關
getPackageUid
這個API我們上節講過,直到Android 7.0才公開。
原型:
int getPackageUid(String packageName, int userHandle) throws NameNotFoundException;
getUidForSharedUser
根據sharedUserNanme來獲取對應的uid
原型:
int getUidForSharedUser(String sharedUserName) throws NameNotFoundException;
跟用戶ID相關
getInstalledPackages(flags,userId)
比起公開的API,可以指定userId.
原型:
List<PackageInfo> getInstalledPackages(int flags, int userId);
resolveActivityAsUser
支持userId的resolveActivity
原型:
ResolveInfo resolveActivityAsUser(Intent intent, int flags, int userId);
queryIntentActivitiesAsUser
支持userId的queryIntentActivities
原型:
List<ResolveInfo> queryIntentActivitiesAsUser(Intent intent,
int flags, int userId);
queryIntentServicesAsUser
支持userID的queryIntentServices
原型:
List<ResolveInfo> queryIntentServicesAsUser(Intent intent,
int flags, int userId);
queryIntentContentProvidersAsUser
支持UserID的queryIntentContentProviders
原型:
List<ResolveInfo> queryIntentContentProvidersAsUser(
Intent intent, int flags, int userId);
queryBroadcastReceivers
雖然沒有叫AsUser,但是還是一個增加了userId的版本。
原型:
List<ResolveInfo> queryBroadcastReceivers(Intent intent,
int flags, int userId);
權限相關
buildPermissionRequestIntent
生成權限操作的Intent
原型:
Intent buildPermissionRequestIntent(String... permissions);
grantPermission
為某個包授權
原型:
void grantPermission(String packageName, String permissionName);
revokePermission
回收grantPermission授予的權限
原型:
void revokePermission(String packageName, String permissionName);
安裝相關
公開的install相關的API要Android 5.0才有。所以Android 4.4的應用只能使用隱藏的系統API來進行install相關的操作。
installPackage
安裝一個包
原型:
void installPackage(
Uri packageURI, IPackageInstallObserver observer, int flags,
String installerPackageName);
installPackageWithVerification
安裝一個包,同時帶校驗
原型:
void installPackageWithVerification(Uri packageURI,
IPackageInstallObserver observer, int flags, String installerPackageName,
Uri verificationURI, ManifestDigest manifestDigest,
ContainerEncryptionParams encryptionParams);
installPackageWithVerificationAndEncryption
不僅帶校驗,而且還加密。
原型:
void installPackageWithVerificationAndEncryption(Uri packageURI,
IPackageInstallObserver observer, int flags, String installerPackageName,
VerificationParams verificationParams,
ContainerEncryptionParams encryptionParams);
installExistingPackage
安裝一個已經存在的包
原型:
int installExistingPackage(String packageName)
throws NameNotFoundException;
deletePackage
uninstall一個應用
原型:
void deletePackage(
String packageName, IPackageDeleteObserver observer, int flags);
清理數據相關
clearApplicationUserData
清理應用數據
原型:
void clearApplicationUserData(String packageName,IPackageDataObserver observer);
deleteApplicationCacheFiles
清理應用緩存
原型:
public void deleteApplicationCacheFiles(String packageName,
IPackageDataObserver observer);
freeStorageAndNotify
清理存儲
原型:
void freeStorageAndNotify(long freeStorageSize, IPackageDataObserver observer);
freeStorage
清理存儲的另一個版本
原型:
void freeStorage(long freeStorageSize, IntentSender pi);
getPackageSizeInfo
獲取包的大小
原型:
void getPackageSizeInfo(String packageName, int userHandle,
IPackageStatsObserver observer);
多用戶版:
原型:
void getPackageSizeInfo(String packageName, IPackageStatsObserver observer);
獲取桌面應用名稱
原型:
ComponentName getHomeActivities(List<ResolveInfo> outActivities);
Block應用相關
雖然不uninstall,但是使應用進入不可用的狀態。
setApplicationBlockedSettingAsUser
設置blocking
原型:
boolean setApplicationBlockedSettingAsUser(String packageName, boolean blocked,
UserHandle userHandle);
getApplicationBlockedSettingAsUser
讀取blocking
boolean getApplicationBlockedSettingAsUser(String packageName,
UserHandle userHandle);
應用在內置和外置存儲中移動 - movePackage
原型:
void movePackage(String packageName, IPackageMoveObserver observer, int flags);
雜項信息獲取類
獲取設備ID - getVerifierDeviceIdentify
原型:
VerifierDeviceIdentity getVerifierDeviceIdentity();
獲取用戶的數據目錄
原型:
static String getDataDirForUser(int userId, String packageName);