管控应用安装

管控应用安装

/frameworks/base/services/core/java/com/android/server/pm/InstallParams.java
========================================================

import android.os.SystemProperties;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Objects;
import java.util.Set;
import java.util.UUID;
import android.util.Log;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.IOException;
import java.io.FileOutputStream;


       .........

    //白名单目录和是否管控应用安装开关
    public static final String SYS_KEY_DOWNLOAD_LIMIT    = "persist.sys.key_download_limit";
    //白名单目录,高版本不能动态修改,所以切换到下面目录
    public static final String WHITE_PATH_FROM    = "/vendor/etc/whitelist.txt";
    //客户指定白名单地址,
    public static final String WHITE_PATH    = "/data/system/whitelist.txt";


    InstallParams(OriginInfo originInfo, MoveInfo moveInfo, IPackageInstallObserver2 observer,
            int installFlags, InstallSource installSource, String volumeUuid,
            UserHandle user, String packageAbiOverride, int packageSource,
            PackageLite packageLite, PackageManagerService pm) {
        super(user, pm);
       .........
        initWhiteList();
    }


    InstallParams(File stagedDir, IPackageInstallObserver2 observer,
            PackageInstaller.SessionParams sessionParams, InstallSource installSource,
            UserHandle user, SigningDetails signingDetails, int installerUid,
            PackageLite packageLite, PackageManagerService pm) {
        super(user, pm);
       .........
        initWhiteList();
    }

    private void initWhiteList(){
        File toFile=new File(WHITE_PATH);
        if (!toFile.exists()){//文件白名单如果不存在就先copy过来
            try {
                toFile.createNewFile();
                File fromFile=new File(WHITE_PATH_FROM);
                copyFiles(fromFile,toFile);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }


    public void returnInstallError(){
        mRet = PackageManager.INSTALL_FAILED_INTERNAL_ERROR;
        handleReturnCode();
    }


    public void installStage() {
        /*final Message msg = mPm.mHandler.obtainMessage(INIT_COPY);
        setTraceMethod("installStage").setTraceCookie(System.identityHashCode(this));
        msg.obj = this;

        Trace.asyncTraceBegin(TRACE_TAG_PACKAGE_MANAGER, "installStage",
                System.identityHashCode(msg.obj));
        Trace.asyncTraceBegin(TRACE_TAG_PACKAGE_MANAGER, "queueInstall",
                System.identityHashCode(msg.obj));

        mPm.mHandler.sendMessage(msg);*/
         if(!mPm.isSystemReady()){
            installStageOrig();
        }

        int mDownLimit=SystemProperties.getInt(SYS_KEY_DOWNLOAD_LIMIT,2);
        if(mDownLimit == 1){
            //allow all
            installStageOrig();
        } else if(mDownLimit == 2){
            //request
            String whitelistStr=readDevices(WHITE_PATH);//TextUtils.isEmpty(whitelistStr)
            if (whitelistStr==null || whitelistStr.contains(mPackageLite.getPackageName())) {
                installStageOrig();
            }else{
                returnInstallError();
            }
        }
        /*Slog.i(TAG,"installStage1 file="+mOriginInfo.mFile+", resolvedFile="+mOriginInfo.mResolvedFile+", resolvedPath="+mOriginInfo.mResolvedPath
            +", downLimit="+mDownLimit+", pkg="+mPackageLite.getPackageName()+", pkgPath="+mPackageLite.getPath());*/
    }

    public void installStageOrig() {
        final Message msg = mPm.mHandler.obtainMessage(INIT_COPY);
        setTraceMethod("installStage").setTraceCookie(System.identityHashCode(this));
        msg.obj = this;
        Slog.i(TAG,"installStageOrig params="+this);
        Trace.asyncTraceBegin(TRACE_TAG_PACKAGE_MANAGER, "installStage",
                System.identityHashCode(msg.obj));
        Trace.asyncTraceBegin(TRACE_TAG_PACKAGE_MANAGER, "queueInstall",
                System.identityHashCode(msg.obj));

        mPm.mHandler.sendMessage(msg);
    }

    void installStage(List<InstallParams> children)
            throws PackageManagerException {
        InstallParams params = this;
         if(!mPm.isSystemReady()){
            installStageOrig(children);
        }
        int mDownLimit = SystemProperties.getInt(SYS_KEY_DOWNLOAD_LIMIT,2);
        if(mDownLimit == 1){
            //allow all
            installStageOrig(children);
        } else if(mDownLimit == 2){
            //request
            String whitelistStr=readDevices(WHITE_PATH);
            if (whitelistStr==null || whitelistStr.contains(params.mPackageLite.getPackageName())) {
                installStageOrig(children);
            }else{
                returnInstallError();
            }
        }
        //Slog.i(TAG,"installStage2 file="+params.mOriginInfo.mFile+", resolvedFile="+params.mOriginInfo.mResolvedFile+", resolvedPath="+params.mOriginInfo.mResolvedPath+", downLimit="+mDownLimit+", pkg="+params.mPackageLite.getPackageName()+", pkgPath="+params.mPackageLite.getPath());
    }

    private static String readDevices(String path) {
        try {
            File file=new File(path);
            if (file.exists()){
                //Log.e("FileUtils","length="+file.length());
                byte[] mBuf = new byte[(int) file.length()];
                FileInputStream mFIS = new FileInputStream(file);
                int rLen = mFIS.read(mBuf);
                return new String(mBuf,"UTF-8");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return  null;
    }


    /**
     * 拷贝文件
     * fromfile 
     * toFile  
     */
    private static void copyFiles(File fromfile, File toFile) {
        InputStream in = null;
        OutputStream out = null;
        try {
            in = new FileInputStream(fromfile);
            out = new FileOutputStream(toFile.getAbsolutePath(),true);
            byte[] bytes = new byte[1024];
            int i;
            while ((i = in.read(bytes)) != -1){
                out.write(bytes, 0 , i);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                if (in != null)
                    in.close();
                if (out != null)
                    out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }



    public void installStageOrig(List<InstallParams> children)
            throws PackageManagerException {
        final Message msg = mPm.mHandler.obtainMessage(INIT_COPY);
        final MultiPackageInstallParams params =
                new MultiPackageInstallParams(this, children, mPm);
        params.setTraceMethod("installStageMultiPackage")
                .setTraceCookie(System.identityHashCode(params));
        msg.obj = params;

        Slog.i(TAG,"installStageOrig parent="+this+", children="+children);
        Trace.asyncTraceBegin(TRACE_TAG_PACKAGE_MANAGER, "installStageMultiPackage",
                System.identityHashCode(msg.obj));
        Trace.asyncTraceBegin(TRACE_TAG_PACKAGE_MANAGER, "queueInstall",
                System.identityHashCode(msg.obj));
        mPm.mHandler.sendMessage(msg);
    }




©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容