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

更多相关文章

  1. Qt 笔记(记录使用Qt中遇到的一些问题)
  2. 【已解决】ADT中通过Android(安卓)SDK Manager去安装x86的image
  3. Android(安卓)NDK开发环境搭建_r8
  4. android调用ITelephony类,AIDL实现电话,联系人黑名单拦截挂断服务
  5. Android(安卓)Eclipse 自动安装到真机(免去选择的麻烦)
  6. android串口的使用
  7. android小游戏:功夫蛇 开发经验总结(附apk安装包)
  8. appium(一) 自动测试环境搭建
  9. android-实现黑名单拦截

随机推荐

  1. Binder系列7—framework层分析
  2. Android Retrofit 笔记之一使用拦截器设
  3. Android Jni NDK 打印log日志
  4. Android Camera中参数设置
  5. Android 模拟器硬件加速
  6. Android 完全退出的实例详解
  7. Android将assets中的zip压缩文件解压到SD
  8. Android5.0 材质设计(纸墨设计)中的z轴理念
  9. 面试准备android(一)
  10. Android点击事件onTouchEvent与onInterce