添加白名单功能

【添加白名单功能】近期接到客户要求在系统中添加白名单功能,要求只能安装客户提供的业务apk和管理员指定的apk,而且支持后续业务apk升级安装。
跟踪了一下framework层的APK安装流程(本系统为Android5.1),决定在“framework/baser/services/core/java/com/android/server/pm/PackageManagerService.java"中的copyApk函数中,因为所有安装途径都会调用该函数。为简单起见就用一个普通文本文件来存放白名单apk名单,但按正常情况来说,apk安装不是根据apk的安装文件名来判断,而是应该根据apk安装的packageclass名来判断是否在白名单之中,但由于客户自身的原因,只提供apk的安装文件名,而不能提供安装包的packageclass类库名,所以只能根据安装包的文件名来判断是否在白名单中,同时后续的apk升级包的安装文件名又和最开始的安装包文件名不一致,所以还得增加一个安装包的packageclass名称文件。首先判断安装包文件名是否在白名单中,如在其中,则通过,如不在(比如升级apk)其中,则到packageclass名称文件中查找,如在其中,则通过,否则中止安装过程,弹出提示。这样做会有很大风险,如果将其他不在白名单中的安装包改名为白名单中的文件名,则可安装,但这也没办法,因为客户最开始只提供apk的文件名,所以只能通过文件名来判断。
添加位置为:
if (ret != PackageManager.INSTALL_SUCCEEDED) {
Slog.e(TAG, "Failed to copy package");
return ret;
}
之后。
int start=origin.file.getAbsolutePath().lastIndexOf("/");
int end=origin.file.getAbsolutePath().lastIndexOf(".");
if (start!=-1 && end!=-1) {
String perName =origin.file.getAbsolutePath().substring(start+1, end); //获取apk文件名
Slog.w(TAG, "perName:"+ perName );
int parseFlags = mDefParseFlags;
parseFlags |= PackageParser.PARSE_ON_SDCARD;
parseFlags |= PackageParser.PARSE_FORWARD_LOCK;
PackageParser.Package pkg1 = null;
try {
final File file1 = new File(codeFile, "base.apk");
final File scanFile = new File(file1.getAbsolutePath());
PackageParser pp = new PackageParser();
if ((parseFlags & SCAN_TRUSTED_OVERLAY) != 0) {
parseFlags |= PackageParser.PARSE_TRUSTED_OVERLAY;
}
pkg1 = pp.parsePackage(scanFile, parseFlags);
} catch (PackageParserException e) {
Slog.w(TAG, "Failed to scan " + e.getMessage());
}
String packageName = pkg1.packageName; // 得到包名
Slog.w(TAG, String.format("--------------------------PkgInfo: %s", packageName));

//检查是否在白名单中
if (checkWhitelistOfApp(perName) == 0) { //不在白名单中
final Message msg = mHandler.obtainMessage(NO_WHITELIST);
mHandler.sendMessage(msg);

/判断是否在packagename.txt中
if (checkWhitePackageName(packageName) != 1)
return PackageManager.INSTALL_FAILED_INTERNAL_ERROR;
} else { //在白名单中
if (checkWhitePackageName(packageName) != 1)//不在packagename.txt中,添加
writeWhitePackageName(packageName);
}
}
else {
return PackageManager.INSTALL_FAILED_INTERNAL_ERROR;
}


在设置中添加白名单项将在后续文章中mi

    推荐阅读