Android实现应用静默降版本安装

转载请附原文:https://blog.csdn.net/github_39468911/article/details/103210874

由于前段时间客户有需求,apk能往低版本更新,所以去找了一下资料。发现网上关于这个方法基本上没有,后来发现我们的adb 调试加上 -d 可以实现低版本更新,所以就去看了一下源码。以下截取片段源码 路径:
/frameworks/base/cmds/pm/src/com/android/commands/pm/Pm.java

while ((opt=nextOption()) != null) { 
    if (opt.equals("-l")) { 
      installFlags |= PackageManager.INSTALL_FORWARD_LOCK; 
    } else if (opt.equals("-r")) { 
      installFlags |= PackageManager.INSTALL_REPLACE_EXISTING; 
    } else if (opt.equals("-i")) { 
      installerPackageName = nextOptionData(); 
      if (installerPackageName == null) { 
        System.err.println("Error: no value specified for -i"); 
        return; 
      } 
    } else if (opt.equals("-t")) { 
      installFlags |= PackageManager.INSTALL_ALLOW_TEST; 
    } else if (opt.equals("-s")) { 
      // Override if -s option is specified. 
      installFlags |= PackageManager.INSTALL_EXTERNAL; 
    } else if (opt.equals("-f")) { 
      // Override if -s option is specified. 
      installFlags |= PackageManager.INSTALL_INTERNAL; 
    } else if (opt.equals("-d")) { 
      installFlags |= PackageManager.INSTALL_ALLOW_DOWNGRADE; 
    } else if (opt.equals("--originating-uri")) { 
      originatingUriString = nextOptionData(); 
      if (originatingUriString == null) { 
        System.err.println("Error: must supply argument for --originating-uri"); 
        return; 
      } 
    } else if (opt.equals("--referrer")) { 
      referrer = nextOptionData(); 
      if (referrer == null) { 
        System.err.println("Error: must supply argument for --referrer"); 
        return; 
      } 
    } else if (opt.equals("--abi")) { 
      abi = checkAbiArgument(nextOptionData()); 
    } else if (opt.equals("--user")) { 
      userId = Integer.parseInt(nextOptionData()); 
    } else { 
      System.err.println("Error: Unknown option: " + opt); 
      return; 
    } 
  } 
  installFlags |= PackageManager.INSTALL_ALLOW_DOWNGRADE; 

重要的就是这个,这个就是允许应用降版本更新的参数。

java 代码实现静默安装降版本更新

知道实现的方式后我们就好办多了。

 public void installPackage(String apkPath, PackageInstallObserver2 observer2, UpdateAppsInfo.UpdateType updateType) {
        try {
            Class<?> serviceManager = Class.forName("android.os.ServiceManager");
            Method getService = serviceManager.getDeclaredMethod("getService", String.class);
            getService.setAccessible(true);
            IBinder packAgeBinder = (IBinder) getService.invoke(null, "package");
            IPackageManager iPm = IPackageManager.Stub.asInterface(packAgeBinder);
            VerificationParams verificationParams = new VerificationParams(null, null, null, VerificationParams.NO_UID, null);
            iPm.installPackage(apkPath, observer2, updateType == UpdateAppsInfo.UpdateType.HEIGHT ? INSTALL_REPLACE_EXISTING : (INSTALL_REPLACE_EXISTING | INSTALL_ALLOW_DOWNGRADE),
                    new File(apkPath).getPath(), verificationParams, null);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

重要的就是下面这个

 iPm.installPackage(apkPath, observer2, updateType == UpdateAppsInfo.UpdateType.HEIGHT ? INSTALL_REPLACE_EXISTING : (INSTALL_REPLACE_EXISTING | INSTALL_ALLOW_DOWNGRADE),
                    new File(apkPath).getPath(), verificationParams, null);

判断是高版本安装还是低版本安装。低版本安装添加 INSTALL_ALLOW_DOWNGRADE
由于我们是更新操作所以要加上INSTALL_REPLACE_EXISTING 覆盖安装。这样就可以实现降版本安装应用了。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值