Android加固后版本更新解析包时出现问题

版本更新是每个应用必不可少的功能之一.但是官方又没有一个实例来说明具体应该怎么做,于是就都是baidu别人的各种方案.但是网上的答案有的相当坑.吃了一个大亏.特此记录下.

现象:
在这里插入图片描述
加固前能正常更新,使用第三方加固乐固加固或者360加固后就不能正常安装

原因:
我的版本更新流程如下

 String mimeDefault = "application/vnd.android.package-archive";
        if (mFile == null) {
            return;
        }
        try {
            Intent intent = new Intent(Intent.ACTION_VIEW);
            //兼容7.0
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                //必须是addFlag setFlags 是覆盖权限
                intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
                //这里牵涉到7.0系统中URI读取的变更
                String authority = BuildConfig.APPLICATION_ID + ".fileprovider";
                Uri contentUri = FileProvider.getUriForFile(mContext, mContext.getPackageName() + ".fileprovider", mFile);
                intent.setDataAndType(contentUri, mimeDefault);
                //兼容8.0
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                    boolean hasInstallPermission = mContext.getPackageManager().canRequestPackageInstalls();
                    if (!hasInstallPermission) {
                        startInstallPermissionSettingActivity();
                        return;
                    }
                }
            } else {
                intent.setDataAndType(Uri.fromFile(mFile), mimeDefault);
            }
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            if (mContext.getPackageManager().queryIntentActivities(intent, 0).size() > 0) {
                //如果APK安装界面存在,携带请求码跳转。使用forResult是为了处理用户 取消 安装的事件。外面这层判断理论上来说可以不要,但是由于国内的定制,这个加上还是比较保险的
                startActivityForResult(intent, GET_UNKNOWN_APP_SOURCES);
            } else {
                startActivity(intent);
            }
        } catch (Throwable e) {
            e.printStackTrace();
        }finally {
            //特此记录不能加,不然加固包解析错误
//            android.os.Process.killProcess(android.os.Process.myPid());
        }

关键代码

 android.os.Process.killProcess(android.os.Process.myPid());

加了这个killProcess方法在加固前和加固后体现不一样.为什么要加这个呢,是因为在这里插入图片描述
看了某些博主加的这个.因此就被坑惨了.至于具体是什么原因导致的呢,腾讯是这么回复的.
在这里插入图片描述
意思是他们也不知道什么原因导致的,据我分析,可能是因为加固需要当前应用存活才能启动成功.为此做了一个实验.

 String mimeDefault = "application/vnd.android.package-archive";
        if (mFile == null) {
            return;
        }
        try {
            Intent intent = new Intent(Intent.ACTION_VIEW);
            //兼容7.0
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                //必须是addFlag setFlags 是覆盖权限
                intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
                //这里牵涉到7.0系统中URI读取的变更
                String authority = BuildConfig.APPLICATION_ID + ".fileprovider";
                Uri contentUri = FileProvider.getUriForFile(mContext, mContext.getPackageName() + ".fileprovider", mFile);
                intent.setDataAndType(contentUri, mimeDefault);
                //兼容8.0
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                    boolean hasInstallPermission = mContext.getPackageManager().canRequestPackageInstalls();
                    if (!hasInstallPermission) {
                        startInstallPermissionSettingActivity();
                        return;
                    }
                }
            } else {
                intent.setDataAndType(Uri.fromFile(mFile), mimeDefault);
            }
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            if (mContext.getPackageManager().queryIntentActivities(intent, 0).size() > 0) {
                //如果APK安装界面存在,携带请求码跳转。使用forResult是为了处理用户 取消 安装的事件。外面这层判断理论上来说可以不要,但是由于国内的定制,这个加上还是比较保险的
                startActivityForResult(intent, GET_UNKNOWN_APP_SOURCES);
            } else {
                startActivity(intent);
            }
        } catch (Throwable e) {
            e.printStackTrace();
        }finally {
        	//手动休眠5秒
        	Thread.sleep(5000);
            //特此记录不能加,不然加固包解析错误
 android.os.Process.killProcess(android.os.Process.myPid());
        }

手动休眠5秒再kill当前进程,可以正常版本更新!!!
这是有多坑,希望看到的人都不会出现这个问题!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值