添加白名单功能

xiaoxiao2021-02-28  88

    近期接到客户要求在系统中添加白名单功能,要求只能安装客户提供的业务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

转载请注明原文地址: https://www.6miu.com/read-74826.html

最新回复(0)