android允许安装第三方,android 7.1 禁止安装第三方软件

要求:Android 7.1 只允许安装自己的apk软件,禁止安装其他软件

实现: 通过包名对比来实现,

源码路径:/services/core/java/com/android/server/pm/PackageManagerService.java

public void handleStartCopy() throws RemoteException {

int ret = PackageManager.INSTALL_SUCCEEDED;

// 决定是安装在手机内还是sdcard中,设置对应标志位

if (origin.staged) {

if (origin.file != null) {

installFlags |= PackageManager.INSTALL_INTERNAL;

installFlags &= ~PackageManager.INSTALL_EXTERNAL;

} else if (origin.cid != null) {

installFlags |= PackageManager.INSTALL_EXTERNAL;

installFlags &= ~PackageManager.INSTALL_INTERNAL;

} else {

throw new IllegalStateException("Invalid stage location");

}

}

final boolean onSd = (installFlags & PackageManager.INSTALL_EXTERNAL) != 0;

final boolean onInt = (installFlags & PackageManager.INSTALL_INTERNAL) != 0;

final boolean ephemeral = (installFlags & PackageManager.INSTALL_EPHEMERAL) != 0;

PackageInfoLite pkgLite = null;

// 检查APK的安装位置是否正确

if (onInt && onSd) {

// Check if both bits are set.

Slog.w(TAG, "Conflicting flags specified for installing on both internal and external");

ret = PackageManager.INSTALL_FAILED_INVALID_INSTALL_LOCATION;

} else if (onSd && ephemeral) {

Slog.w(TAG,  "Conflicting flags specified for installing ephemeral on external");

ret = PackageManager.INSTALL_FAILED_INVALID_INSTALL_LOCATION;

} else {

pkgLite = mContainerService.getMinimalPackageInfo(origin.resolvedPath, installFlags,

packageAbiOverride);

//通过包名来判断是否允许安装

if (pkgLite.packageName.equals("包名)) {

int ret = PackageManager.INSTALL_SUCCEEDED;

} else{

ret = PackageManager.INSTALL_FAILED_INVALID_INSTALL_LOCATION;

}

if (DEBUG_EPHEMERAL && ephemeral) {

Slog.v(TAG, "pkgLite for install: " + pkgLite);

}

/*

* If we have too little free space, try to free cache

* before giving up.

*/

if (!origin.staged && pkgLite.recommendedInstallLocation

== PackageHelper.RECOMMEND_FAILED_INSUFFICIENT_STORAGE) {

// TODO: focus freeing disk space on the target device

final StorageManager storage = StorageManager.from(mContext);

final long lowThreshold = storage.getStorageLowBytes(

Environment.getDataDirectory());

final long sizeBytes = mContainerService.calculateInstalledSize(

origin.resolvedPath, isForwardLocked(), packageAbiOverride);

try {

mInstaller.freeCache(null, sizeBytes + lowThreshold);

pkgLite = mContainerService.getMinimalPackageInfo(origin.resolvedPath,

installFlags, packageAbiOverride);

} catch (InstallerException e) {

Slog.w(TAG, "Failed to free cache", e);

}

/*

* The cache free must have deleted the file we

* downloaded to install.

*

* TODO: fix the "freeCache" call to not delete

*       the file we care about.

*/

if (pkgLite.recommendedInstallLocation

== PackageHelper.RECOMMEND_FAILED_INVALID_URI) {

pkgLite.recommendedInstallLocation

= PackageHelper.RECOMMEND_FAILED_INSUFFICIENT_STORAGE;

}

}

}

........

}

参考文献:

https://blog.csdn.net/kaober/article/details/20641917

https://blog.csdn.net/weixin_37950736/article/details/72850548

https://blog.csdn.net/dpppppp/article/details/80770945

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值