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);