添加白名单功能

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

你可能感兴趣的:(android)