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);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容