Android Launcher apk 授信安装

这篇具有很好参考价值的文章主要介绍了Android Launcher apk 授信安装。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

对安装的apk进行校验,除了系统应用市场中下载的,其它渠道的apk都进行安装拦截,并且弹框提示。

首先需要把验证的证书保存在数据库本地,后面需要用到

Android Launcher apk 授信安装

然后注册系统广播,用于接收 apk 安装时的监听,这个广播由系统发出

新装时的

action ‘android.intent.action.PACKAGE_ADDED

替换时的 action

android.intent.action.PACKAGE_REMOVED

android.intent.action.PACKAGE_ADDED

android.intent.action.PACKAGE_REPLACED

删除时的 action

android.intent.action.PACKAGE_REMOVED

android.intent.action.PACKAGE_FULLY_REMOVED

 

<receiver android:name="com.test.verifier.main.VerifyReceiver"
            android:exported="true">
            <intent-filter>
                ...
            </intent-filter>
</receiver>

安卓 4.0 新增了 verifyPendingInstall,用于监听包管理,验证时发送广播

Android Launcher apk 授信安装

验证通过 PackageManager.VERIFICATION_ALLOW 跟验证失败 PackageManager.VERIFICATION_REJECT

在注册一个服务,用于 apk 安装接收到广播后的校验处理

<service android:name="com.test.verifier.main.VerifyService"
            android:exported="true">
            <intent-filter>
                ...
            </intent-filter>
</service>

接下来就是监听跟验证,首先在安装apk时会收到广播,然后可以拿到信息开启服务验证

public void onReceive(Context context, Intent intent) {
        Log.e(TAG, "onReceive: start");

        String action = intent.getAction();
        if (Intent.ACTION_PACKAGE_NEEDS_VERIFICATION.equals(action)) {
            Log.e(TAG, "onReceive: " + "ACTION_PACKAGE_NEEDS_VERIFICATION");

            Intent verification = new Intent();
            verification.setAction(VerifyConstant.VERIFY_SERVICE_ACTION);
            verification.setPackage(VerifyConstant.VERIFY_SERVICE_PACKAGE_NAME);

            Bundle sExtras = new Bundle(intent.getExtras());
            sExtras.putInt(VerifyManager.Cmd.CMD_KEY, VerifyManager.Cmd.CMD_VERIFY);
            String path = intent.getData().getPath();
            Log.e(TAG, "path: " + path);
            if (!path.endsWith(VerifyConstant.INSTALL_FILE_SUFFIX)) {
                path = path + "/base.apk";
            }
            sExtras.putString("PACKAGE_PATH", path);
            verification.putExtras(sExtras);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                AppPlugins.appCtx().startForegroundService(verification);
            } else {
                AppPlugins.appCtx().startService(verification);
            }
            return;
        }
        if (Intent.ACTION_PACKAGE_VERIFIED.equals(action)) {
            Log.d(TAG, "onReceive: " + "ACTION_PACKAGE_VERIFIED");
            return;
        }
    }

服务 VerifyService extends IntentService

系统校验时间默认为10秒超时,如果下载的是大型游戏可能会anr,所以需要默认改下超时时间

并且在服务中需要弹框处理,这两个操作放到 onCreate 中

@Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG, "onCreate");
        Settings.Global.putLong(getContentResolver(), PACKAGE_VERIFIER_TIMEOUT, MAX_VERIFICATION_TIMEOUT);
        VerifyUtils.setVerifyInstallListener(isAllow -> {
            Log.d(TAG, "setVerifyInstallListener isAllow : " + isAllow);
            if (!isAllow) {
                ArchTaskExecutor.getInstance().postToMainThread(this::showInstallTipDialog);
            }
        });
    }

然后处理具体的验证逻辑

@Override
    protected void onHandleIntent(@Nullable Intent intent) {
        if (intent == null) return;
        if (intent.getExtras() == null) return;

        int cmd = intent.getIntExtra(VerifyManager.Cmd.CMD_KEY, 0);
        switch (cmd) {
            case VerifyManager.Cmd.CMD_VERIFY: {    
                Bundle extras = intent.getExtras();
                int id = extras.getInt(PackageManager.EXTRA_VERIFICATION_ID);
                String pkgName = extras.getString(EXTRA_VERIFICATION_PACKAGE_NAME);
                String packagePath = extras.getString("PACKAGE_PATH", null);
                String installerPkg = extras.getString(EXTAR_VERIFICATION_INSTALLER_PKG);

                PackageManager pm = this.getPackageManager();
                boolean isSystemApp = VerifyUtils.isSystemApp(pkgName);
                Log.e(TAG, "isSystemApp " + isSystemApp);
                if (isSystemApp) {
                    pm.verifyPendingInstall(id, PackageManager.VERIFICATION_ALLOW);
                    if (DEBUG) {
                        Log.e(TAG, pkgName + " : System App ALLOW");
                    }
                    return;
                }

                boolean isOverlayApp = VerifyUtils.isOverlayApp(packagePath);
                Log.e(TAG, "isOverlayApp " + isOverlayApp);
                if (isOverlayApp) {
                    pm.verifyPendingInstall(id, PackageManager.VERIFICATION_ALLOW);
                    if (DEBUG) {
                        Log.e(TAG, pkgName + " : Overlay App ALLOW");
                    }
                    return;
                }

                Log.e(TAG, "installerPkg " + installerPkg);
                if (DEVICESERVICE_PACKAGE_NAME.equals(installerPkg) && VerifyUtils.isSystemPackage(DEVICESERVICE_PACKAGE_NAME)) {
                    pm.verifyPendingInstall(id, PackageManager.VERIFICATION_ALLOW);
                    if (DEBUG) {
                        Log.e(TAG, pkgName + " : Debugtool install App ALLOW");
                    }
                    return;
                }
                String sha1 = getMd5VerifyResult(packagePath);

                boolean isLegal = VerifyUtils.isLegal(sha1, pkgName);
                Log.e(TAG, "isLegal " + isLegal);
                if (isLegal) {
                    pm.verifyPendingInstall(id, PackageManager.VERIFICATION_ALLOW);
                    if (DEBUG) {
                        Log.e(TAG, pkgName + " : Legal App ALLOW");
                    }
                    return;
                }
                VerifyUtils.verifyOnlineSign(id, packagePath, pkgName, sha1);
                return;
            }
        }
        }
}        

具体验证方法

    public static void verifyOnlineResp(int id, String localSha1, String pkgName, SignatureResp signatureResp) {
        String signText = signatureResp.getSign();
        int signType = signatureResp.getSignType();
        String sha1 = signatureResp.getApkSign();
        String content = generateContent(signType, pkgName, sha1);

        boolean verifyResult = VerifyUtils.verifySign(content, signText, publicKeyStr);
        if (verifyResult) {
            SignEntity signEntity = new SignEntity(pkgName, sha1, content, signType, signText);
            AppDatabase.getInstance().signDao().insertSignSync(signEntity);
        }
        reportVerifyResult(id, pkgName, verifyResult);

    }

    public static void reportVerifyResult(int id, String pkgName, boolean isAllow) {
        int resultCode = isAllow ? PackageManager.VERIFICATION_ALLOW : PackageManager.VERIFICATION_REJECT;
        String resultStr = isAllow ? "Allow" : "Reject";
        AppPlugins.appCtx().getPackageManager().verifyPendingInstall(id, resultCode);
        if (listener != null) {
            listener.verifyResult(isAllow);
        }
        Log.e(TAG, pkgName + " : " + resultStr);
    }

 文章来源地址https://www.toymoban.com/news/detail-521362.html

到了这里,关于Android Launcher apk 授信安装的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android 12.0 Launcher3 app列表页桌面图标按安装时间排序

      在12.0的系统开发中,在对Launcher3进行功能开发时,系统默认的app列表页排序是安装app名称进行排序的,由于功能的需要要求按照app安装时间进行排序,这就需要找到相关的排序地方,进行排序方式的修改就能完成这个功能

    2024年02月06日
    浏览(59)
  • Android 安装apks文件

    安卓安装apks文件无非三步: 1.找到一个apks文件 2.解压它 3.安装它 代码出处 我这里写了一个脚本方便安装apks,顺带还实现了apks文件的备份与恢复。 csdn资源 gitee成品

    2024年02月11日
    浏览(41)
  • Android下载apk并安装apk(用于软件版本升级用途)

    软件版本更新是每个应用必不可少的功能,基本实现方案是请求服务器最新的版本号与本地的版本号对比,有新版本则下载apk并执行安装。请求服务器版本号与本地对比很容易,本文就不过多讲解,主要讲解下载apk到安装apk的内容。 (1)读写外部存储的权限需要动态申请,

    2024年02月01日
    浏览(77)
  • android 安装 apks 到手机

    安装官网通过命令安装 apks 到 android 手机  1.bundletool install-apks --apks apks文件路劲    例:bundletool install-apks --apks trunk_release_signed.apks 从 2021 年 8 月起,新应用需要使用 Android App Bundle (aab包)才能在 Google Play 中发布,Android App Bundle 是一种发布格式,其中包含您应用的所有经过

    2024年02月13日
    浏览(57)
  • Android开发 APP代码安装APK安装包

     在Android 项目上架后,需要迭代更新,一般更新方式有:手动下载apk包手动安装、通过浏览器下载手动安装、 APP内部下载内部安装 。本文章就只讲解APP内部下载内部安装这个APP 更新方式。虽然网上关于APP内部apk安装的代码和文章很多,但太过于绝对,没有考虑一些特殊情况

    2023年04月08日
    浏览(35)
  • android应用市场点击下载APK安装详解

    1,《android系统启动流程简介》 2,《android init进程启动流程》 3,《android zygote进程启动流程》 4,《Android SystemServer进程启动流程》 5,《android launcher启动流程》 6,《Android Activity启动过程详解》 1,《Android 源码下载和编译》 2,《android 11源码编译和pixel3 刷机》 3,《Andro

    2024年02月16日
    浏览(39)
  • windows11安装Android子系统,安装apk教程。

    系统:windows11TPM2.0 硬件:内存大于8GB 浏览器地址栏输入:“https://store.rg-adguard.net/” 搜索框输入:“https://www.microsoft.com/store/productId/9P3395VX91NR” 然后在右边下拉列表选择“Slow” ,然后点击最后面的“√”。注:不要翻译界面! 找到MicrosoftCorporationII.WindowsSubsystemForAndroid_1

    2024年02月06日
    浏览(52)
  • Android系统视角下对APK的分析(2)- APK安装过程的定性分析

    以Android手机用户角度来看,安装各式各样的APP,基本就是从应用市场上 “搜索-下载-安装” 三连。而对Android系统来说,这就是个大工程了,因为对Android系统来说APK是“外来户”,如何安装它、有限制地支持它的运行、如何防着它干坏事等问题就来了。 写此专栏的起因是为

    2024年02月08日
    浏览(59)
  • Android12 apk安装失败 安装包异常 安装包大小显示1k

    翻译后   解决:Android12 清单文件中使用了intent-filter标签的配置 必须加上  

    2024年02月09日
    浏览(57)
  • Mac安装安卓虚拟机 - Android Studio运行apk安装包

    下载安装 Download Android Studio App Tools - Android Developers 选择“Download options” 选择“Mac”版本,大概1G 打开安装包,拖拽程序到应用程序文件夹 按下F4,打开Android Studio 第一次运行,选择不倒入任何设置: 设置代理 为不使用代理 打开主界面,“more actions”,选择“Virtual Device

    2024年02月04日
    浏览(86)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包