P版本:

默认允许未知应用安装权限

方法一框架层修改

frameworks/base/core/java/android/app/AppOpsManager.java

sOpDefaultMode函数中

AppOpsManager.MODE_DEFAULT,  // OP_REQUEST_INSTALL_PACKAGES

改成AppOpsManager.MODE_ALLOWED

S版本是//REQUEST_INSTALL_PACKAGES,但是S上改了这个没有用,点安装包后依然会有 未知提示的安全弹窗,所以要去/PackageInstallerActivity.java改

protected void onResume() {

checkIfAllowedAndInitiateInstall();这句直接换成

initiateInstall();

就所有应用都不检查是否允许权限了,都能安装

方法二:

S版本的是已经把安装应用封装到framework下面了frameworks/base/packages/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java

P版本:

以下走的PackageInstaller,如果带了GMS包的话,可能是安装了谷歌的 GooglePackageInstaller,这个应用实测override无法消除,那就删掉mk文件

vendor/google/apps/GooglePackageInstaller/Android.mk

vendor/mediatek/proprietary/packages/apps/PackageInstaller/ src/com/android/packageinstaller/InstallStart.java

onCreate中加入

if (callingPackage == null){

        isTrustedSource = true;

        }

isTrustedSource这个变量就是决定是否赋予安装权限然后执行接下来的安装,

方法一是底层修改,方法二是上层应用调用修改,实际上获得的第三方应用安装权限还是no的,只是手动改为了true

默认点开apk文件后自动安装,这个的前提是把上面未知应用安装权限打开

vendor/mediatek/proprietary/packages/apps/PackageInstaller/ src/com/android/packageinstaller/PackageInstallerActivity.java

在初始安装的方法initiateInstall 加入

if(true/*pkgName.equals("com.veclink.vecsipsimple")*/)

            startInstall();

这个判断就可以指定特定包名,因为在函数开始就已经获取了当前包名

String pkgName = mPkgInfo.packageName;

如果还没有开启第三方应用安装权限的话(AppOpsManager.java中未改),也可以在这个文件的onCreate方法中加入

if (mCallingPackage == null) {

            initiateInstall();

        } else

        //*/

        checkIfAllowedAndInitiateInstall();

,就是如果没开启权限的话,此时的mCallingPackage读不到的,为null,所以源码也直接执行checkIfAllowedAndInitiateInstall()是否允许才会安装,需要用户手动点一下授予权限

S版本

自动安装完成后,会有个完成或打开的确认界面,这个界面可以自动跳过为直接打开安装好的应用,也可以不要。实际上也不需要直接打开,如果是静默安装的话,那就会突然跳出来应用了。所以直接就默认完成,其实点完成就是直接finish当前界面

如果要修改直接打开,则

src/com/android/packageinstaller/InstallSuccess.java  这个文件就是安装成功后的逻辑

onCreate方法中

因为

boolean enabled = false;

            if (launchIntent != null) {

                List<ResolveInfo> list = getPackageManager().queryIntentActivities(launchIntent,

                        0);

                if (list != null && list.size() > 0) {

                    enabled = true;

                }

            }

此时源码已赋值了enabled,那么就会进入if (enabled) {这个判断

在这里面打开按钮的点击事件完成之后launchButton.setOnClickListener之后加入

也就是

if (enabled) {

            launchButton.setOnClickListener(view -> {

                try {

                    startActivity(mLaunchIntent);

                } catch (ActivityNotFoundException | SecurityException e) {

                    Log.e(LOG_TAG, "Could not start activity", e);

                }

                finish();

            });

之后加上

launchButton.performClick();

就可以模拟点击打开按钮了

如果想直接点完成,那就把这句话改成

finish();

一个是R.id.done_button,一个是R.id.launch_button