android中从代码上看安装程序之普通安装和静默安装

来源:互联网 发布:ubuntu 卸载node 编辑:程序博客网 时间:2024/06/04 18:41
   在Android开发中,我们经常需要对自己的APP进行自动升级安装,今天我们就来讲一讲安装程序的代码怎么写,android中,安装程序的方式分为普通安装和静默安装,普通安装是通过调用Intent来发送一个"application/vnd.android.package-archive"给系统,然后系统调用自身的安装程序来帮助你来完成程序的安装工作。静默安装时通过调用系统命令pm来完成的。

        首先来看一下普通安装的代码,这个代码是一般情况下是这样子的:

    public static boolean installNormal(Context context, String filePath) {              Intent i = new Intent(Intent.ACTION_VIEW);              File file = new File(filePath);              if (file == null || !file.exists() || !file.isFile()                      || file.length() <= 0) {                  return false;              }                    i.setDataAndType(Uri.parse("file://" + filePath),                      "application/vnd.android.package-archive");              i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);              context.startActivity(i);              return true;          }  

        下面在来看看静默安装的程序是怎么实现的。

    public static int installSilent(Context context, String filePath,                  String pmParams) {              if (filePath == null || filePath.length() == 0) {                  return INSTALL_FAILED_INVALID_URI;              }                    File file = new File(filePath);              if (file == null || file.length() <= 0 || !file.exists()                      || !file.isFile()) {                  return INSTALL_FAILED_INVALID_URI;              }                    /**              * if context is system app, don't need root permission, but should add              * <uses-permission android:name="android.permission.INSTALL_PACKAGES"              * /> in mainfest              **/              StringBuilder command = new StringBuilder()                      .append("LD_LIBRARY_PATH=/vendor/lib:/system/lib pm install ")                      .append(pmParams == null ? "" : pmParams).append(" ")                      .append(filePath.replace(" ", "\\ "));              CommandResult commandResult = ShellUtils.execCommand(                      command.toString(), !isSystemApplication(context), true);              if (commandResult.successMsg != null                      && (commandResult.successMsg.contains("Success") || commandResult.successMsg                              .contains("success"))) {                  Log.d("PackageUtils", "install system app ok!");                  return INSTALL_SUCCEEDED;              }      }  

        静默安装时,一般情况下需要获取系统权限,查看是否是系统APP或具有系统权限的代码如下:

    public static boolean isSystemApplication(PackageManager packageManager,                  String packageName) {              if (packageManager == null || packageName == null                      || packageName.length() == 0) {                  return false;              }                    try {                  ApplicationInfo app = packageManager.getApplicationInfo(                          packageName, 0);                  return (app != null && (app.flags & ApplicationInfo.FLAG_SYSTEM) > 0);              } catch (NameNotFoundException e) {                  e.printStackTrace();              }          return false;      }  

查看是否具有系统权限

    public static boolean checkRootPermission() {              return execCommand("echo root", true, false).result == 0;          }  
    public static CommandResult execCommand(String[] commands, boolean isRoot,                  boolean isNeedResultMsg) {              int result = -1;              if (commands == null || commands.length == 0) {                  return new CommandResult(result, null, null);              }                    Process process = null;              BufferedReader successResult = null;              BufferedReader errorResult = null;              StringBuilder successMsg = null;              StringBuilder errorMsg = null;                    DataOutputStream os = null;              try {                  process = Runtime.getRuntime().exec(                          isRoot ? COMMAND_SU : COMMAND_SH);                  os = new DataOutputStream(process.getOutputStream());                  for (String command : commands) {                      if (command == null) {                          continue;                      }                            // donnot use os.writeBytes(commmand), avoid chinese charset                      // error                      os.write(command.getBytes());                      os.writeBytes(COMMAND_LINE_END);                      os.flush();                  }                  os.writeBytes(COMMAND_EXIT);                  os.flush();                        result = process.waitFor();                  // get command result                  if (isNeedResultMsg) {                      successMsg = new StringBuilder();                      errorMsg = new StringBuilder();                      successResult = new BufferedReader(new InputStreamReader(                              process.getInputStream()));                      errorResult = new BufferedReader(new InputStreamReader(                              process.getErrorStream()));                      String s;                      while ((s = successResult.readLine()) != null) {                          successMsg.append(s);                      }                      while ((s = errorResult.readLine()) != null) {                          errorMsg.append(s);                      }                  }              } catch (IOException e) {                  e.printStackTrace();              } catch (Exception e) {                  e.printStackTrace();              } finally {                  try {                      if (os != null) {                          os.close();                      }                      if (successResult != null) {                          successResult.close();                      }                      if (errorResult != null) {                          errorResult.close();                      }                  } catch (IOException e) {                      e.printStackTrace();                  }                        if (process != null) {                      process.destroy();                  }              }              return new CommandResult(result, successMsg == null ? null                      : successMsg.toString(), errorMsg == null ? null                      : errorMsg.toString());          }  

安装时调用如下:

    public static final int install(Context context, String filePath) {              if (isSystemApplication(context,filePath)                      || checkRootPermission()) {                  return installSilent(context, filePath);              }              return installNormal(context, filePath) ? INSTALL_SUCCEEDED                      : INSTALL_FAILED_INVALID_URI;          }  

1 0