阅读更多 frameworks\base\services\core\java\com\android\server\pm\PackageManagerShellCommand.java

adb install 流程会走到PackageManagerShellCommand中的runInstall()方法,在此处做阻断操作可使 failed to install *.apk;

    private int runInstall() throws RemoteException {                Log.d("Ginger", "runInstall");        boolean refuse = SystemProperties.getBoolean("adb_install_refused", true);        if(refuse){            Log.d("Ginger", "refuse to install apk by adb");            return 1;        }                final PrintWriter pw = getOutPrintWriter();        final InstallParams params = makeInstallParams();        final String inPath = getNextArg();        boolean installExternal =                (params.sessionParams.installFlags & PackageManager.INSTALL_EXTERNAL) != 0;        if (params.sessionParams.sizeBytes < 0 && inPath != null) {            File file = new File(inPath);            if (file.isFile()) {                if (installExternal) {                    try {                        ApkLite baseApk = PackageParser.parseApkLite(file, 0);                        PackageLite pkgLite = new PackageLite(null, baseApk, null, null, null);                        params.sessionParams.setSize(                                PackageHelper.calculateInstalledSize(pkgLite, false,                                        params.sessionParams.abiOverride));                    } catch (PackageParserException | IOException e) {                        pw.println("Error: Failed to parse APK file : " + e);                        return 1;                    }                } else {                    params.sessionParams.setSize(file.length());                }            }        }        final int sessionId = doCreateSession(params.sessionParams,                params.installerPackageName, params.userId);        boolean abandonSession = true;        try {            if (inPath == null && params.sessionParams.sizeBytes == 0) {                pw.println("Error: must either specify a package size or an APK file");                return 1;            }            if (doWriteSplit(sessionId, inPath, params.sessionParams.sizeBytes, "base.apk",                    false /*logSuccess*/) != PackageInstaller.STATUS_SUCCESS) {                return 1;            }            if (doCommitSession(sessionId, false /*logSuccess*/)                    != PackageInstaller.STATUS_SUCCESS) {                return 1;            }            abandonSession = false;            pw.println("Success");            return 0;        } finally {            if (abandonSession) {                try {                    doAbandonSession(sessionId, false /*logSuccess*/);                } catch (Exception ignore) {                }            }        }    }

更多相关文章

  1. Android AudioManager控制系统声音的流程
  2. Linux上添加udev规则使adb可以操作Android设备的注意问题
  3. 在EeePC上运行Android!(转)(也是代码下载配置编译的流程!)
  4. 手机操作系统开源软件
  5. Android之Rxjava2.X 2————Rxjava 创建操作符
  6. Android系统启动流程 - 1
  7. Android学习蛋疼集锦(Android启动流程)
  8. Android中屏幕相关的操作
  9. android 中的url操作

随机推荐

  1. centos go语言环境怎么搭建
  2. go语言适合于哪些领域
  3. 有哪些大公司已经用Go语言了
  4. go语言有指针吗
  5. go语言是啥
  6. go属于解释型语言么
  7. go语言defer的用法是什么
  8. go语言有几种框架
  9. windows下怎么搭建go语言开发环境
  10. go语言如何将大写转小写