もちろん、私は間違っているかもしれませんが、短い答えが「いいえ、ありません」と思われます。
もう少し延長答え: はここApplicationPackageManagerのコードです:
MPM
@Override
public boolean isPermissionRevokedByPolicy(String permName, String pkgName) {
try {
return mPM.isPermissionRevokedByPolicy(permName, pkgName, mContext.getUserId());
} catch (RemoteException e) {
throw new RuntimeException("Package manager has died", e);
}
}
-
private final IPackageManager mPM;
それはContextImpl.getPackageManager(によって呼び出されるコンストラクタで初期化されています) :
@Override
public PackageManager getPackageManager() {
if (mPackageManager != null) {
return mPackageManager;
}
IPackageManager pm = ActivityThread.getPackageManager();
if (pm != null) {
// Doesn't matter if we make more than one instance.
return (mPackageManager = new ApplicationPackageManager(this, pm));
}
return null;
}
(source code)
)より深く行くとActivityThread.getPackageManager(に探して:
public static IPackageManager getPackageManager() {
if (sPackageManager != null) {
//Slog.v("PackageManager", "returning cur default = " + sPackageManager);
return sPackageManager;
}
IBinder b = ServiceManager.getService("package");
//Slog.v("PackageManager", "default service binder = " + b);
sPackageManager = IPackageManager.Stub.asInterface(b);
//Slog.v("PackageManager", "default service = " + sPackageManager);
return sPackageManager;
}
(source code)
私はisPermissionRevokedByPolicyところでの実際の実装を見つけるためにやっていたすべての手順。それから、IPackageManager.Stubを拡張するのは、PackageManagerService(source code)です。だからここ
が実際の実装である:潜在的
@Override
public boolean isPermissionRevokedByPolicy(String permission, String packageName, int userId) {
if (UserHandle.getCallingUserId() != userId) {
mContext.enforceCallingPermission(
android.Manifest.permission.INTERACT_ACROSS_USERS_FULL,
"isPermissionRevokedByPolicy for user " + userId);
}
if (checkPermission(permission, packageName, userId)
== PackageManager.PERMISSION_GRANTED) {
return false;
}
final long identity = Binder.clearCallingIdentity();
try {
final int flags = getPermissionFlags(permission, packageName, userId);
return (flags & PackageManager.FLAG_PERMISSION_POLICY_FIXED) != 0;
} finally {
Binder.restoreCallingIdentity(identity);
}
}
「偽物」とは、特定の許可の状況をに、あなたはのcheckPermissionとgetPermissionFlags方法をハックする必要があると思います。問題は、私は心配していますが、ApplicationPackageManagerにオーバーライドされたPackageManagerServiceを少なくともどのように反映させるかについての明確な方法はありません。
あなたはそれについて何かを見つけましたか?私はテストする唯一の方法は、テストDPCアプリケーションを使用することができると思います。それはオープンソースですが、1つのメソッドをテストするだけの多くの作業があります。 https://github.com/googlesamples/android-testdpc – fasteque
@fasteque:いいえ、私は賞金がまだ未払いである理由は何も答えていません。私はテストDPCを「Android for Workセット全体」にまとめました。テスト用のDPCは明らかに文書化されていません。「管理用のアプリケーションのアクセス許可」ページから、isPermissionRevokedByPolicy()などの実際のAndroidのアクセス許可にマップする方法はわかりません。 – CommonsWare