Android应用生死轮回的那些事儿(7) - PackageManager的不公开API

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);
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Android系统中的PackageManager(包管理器)是一个系统级别的服务,它是一个应用程序包的管理器,可以用来安装、卸载、查询应用程序包信息等操作。PackageManager APIAndroid系统中非常重要的一个API,它可以让开发者获取应用程序包的信息,比如版本号、权限等等。 常用的PackageManager命令有: 1. 查询已安装应用的信息 ``` pm list packages // 列出所有已安装的应用的包名 pm list packages -s // 列出所有已安装的系统应用的包名 pm list packages -3 // 列出所有已安装的第三方应用的包名 pm list packages -f // 列出所有已安装应用的APK路径 pm list packages -d // 只列出已禁用的应用 pm list packages -e // 只列出系统已启用的应用 ``` 2. 安装应用 ``` pm install /path/to/app.apk // 安装应用 pm install -r /path/to/app.apk // 重新安装应用,保留应用数据 pm install -t /path/to/app.apk // 允许安装覆盖其他应用 pm install -i <installer_package_name> /path/to/app.apk // 指定应用安装包的安装来源 ``` 3. 卸载应用 ``` pm uninstall com.package.name // 卸载应用 pm uninstall -k com.package.name // 卸载应用,保留应用数据和缓存 ``` 4. 查询应用信息 ``` pm dump com.package.name // 输出应用信息 pm path com.package.name // 输出应用APK路径 pm list features // 列出系统支持的特性 pm list instrumentation // 列出所有已安装的Instrumentation ``` 5. 其他命令 ``` pm enable com.package.name // 启用应用 pm disable com.package.name // 禁用应用 pm clear com.package.name // 清除应用数据和缓存 ``` 以上是一些常用的PackageManager命令,使用时需要注意权限问题,部分命令需要root权限才能执行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jtag特工

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值