最近OTT制定产品,其中有一条需求是只能安装自己公司签名的APK,所以在网上找了相关资料,最后总结功能实现如下:

1、签名错误码
frameworks/base/core/java/android/content/pm/PackageManager.java
    public static final int INSTALL_FAILED_VERSION_DOWNGRADE = -25;  
    //添加签名错误码
    public static final int INSTALL_FAILED_INVALID_SIGNATURES = -26;

2、对比签名
frameworks/base/services/java/com/android/server/pm/PackageManagerService.java
    // 安装标识,区别打开APK和安装APK
    private boolean mIsInstallApkFlag = false;
    
    private void installPackageLI(InstallArgs args,  
            boolean newInstall, PackageInstalledInfo res) {  
            ...  
        Log.i(TAG, "Start installation for package: " + pkg.packageName);  
 
 //add start 设置安装标识       
    mIsInstallApkFlag = true;  
//add end
    if (replace) {  
            replacePackageLI(pkg, parseFlags, scanMode, args.user,  
                    installerPackageName, res);  
        } else {  
            installNewPackageLI(pkg, parseFlags, scanMode, args.user,  
                    installerPackageName, res);  
        }  
        Log.i(TAG, "Installation done for package: " + pkg.packageName);  
        ...  
    }
    
    private PackageParser.Package scanPackageLI(PackageParser.Package pkg,
            int parseFlags, int scanMode, long currentTime, UserHandle user) {
            ...
        if (!verifySignaturesLP(pkgSetting, pkg)) {
        ...
        }
    //add start 添加校验判断
           // is xhw signatures
            Signature[] xhwSignatures = getXWHSignatures(mContext,"com.ronbell.ott.setting");

if (xhwSignatures != null) {
                if (compareSignatures(xhwSignatures, pkg.mSignatures) != PackageManager.SIGNATURE_MATCH) {
                    mLastScanError = PackageManager.INSTALL_FAILED_INVALID_SIGNATURES;
                    return null;
                }
            }
    //add end

// Verify that this new package doesn't have any content providers
            // that conflict with existing packages.  Only do this if the
            // package isn't already installed, since we don't want to break
            // things that are installed.
            if ((scanMode&SCAN_NEW_INSTALL) != 0) {
           ...
    }    
    
    //add methods 添加获取安装签名
    private Signature[] getXWHSignatures(Context context, String packName){
        if(!isSignature) return null; // 判断只有在安装的时候才起作用。
        isSignature = false;
        PackageManager pm = context.getPackageManager();
        List<PackageInfo> apps = pm.getInstalledPackages(PackageManager.GET_SIGNATURES);
        Iterator<PackageInfo> it = apps.iterator();
        while(it.hasNext()){
            PackageInfo info = it.next();
            if(info.packageName.equals(packName)){
                return info.signatures;
            }
        }
        return null;
    }
    private boolean IsSignaturesSame(Signature[] s1, Signature[] s2) {
        if(s1 == null || s2 == null ) {
            return   false ;
        }
        HashSet < Signature >  set1  =   new  HashSet < Signature > ();
        for  (Signature sig : s1) {
            set1.add(sig);
        }
        HashSet < Signature >  set2  =   new  HashSet < Signature > ();
        for  (Signature sig : s2) {
            set2.add(sig);
        }
        //  Make sure s2 contains all signatures in s1.
        if  (set1.equals(set2)) {
            return   true ;
        }
        return   false ;                      
    }
   
    //add end

3、安装失败提示
packages/apps/PackageInstaller/src/com/android/packageinstaller/InstallAppProgress.java

private Handler mHandler = new Handler() {
        public void handleMessage(Message msg) {
            switch (msg.what) {
            ...
//add start
                    } else if (msg.arg1 == PackageManager.INSTALL_FAILED_INVALID_SIGNATURES){
                        // Generic error handling for all other error codes.
                        centerTextDrawable.setLevel(1);
                        centerExplanationLabel = getExplanationFromErrorCode(msg.arg1);
                        centerTextLabel = R.string.install_failed_invalid_signature;
                        mLaunchButton.setVisibility(View.INVISIBLE);

} else {
                        // Generic error handling for all other error codes.
                        centerTextDrawable.setLevel(1);
                        centerExplanationLabel = getExplanationFromErrorCode(msg.arg1);
                        centerTextLabel = R.string.install_failed;
                        mLaunchButton.setVisibility(View.INVISIBLE);
                    }
                 ...

Android 验证APK签名对比的更多相关文章

  1. Android - 视图Android应用(apk)签名

    视图Android应用(apk)签名 本文地址: http://blog.csdn.net/caroline_wendy 在微博.微信开放平台注冊应用时,须要填写应用(apk)的签名,能够使用keyt ...

  2. Android 查看Apk签名方式V1和V2

    Android 查看Apk签名方式V1和V2 java -jar apksigner.jar verify -v my.apk -- Verifies Verified using v1 scheme ...

  3. Android 验证APK是否已经签名或是否是Debug签名

    https://source.android.google.cn/ http://www.android-doc.com/tools/publishing/app-signing.html Signi ...

  4. Android中APK签名工具之jarsigner和apksigner详解

    一.工具介绍 jarsigner是JDK提供的针对jar包签名的通用工具, 位于JDK/bin/jarsigner.exe apksigner是Google官方提供的针对Android apk签名及验 ...

  5. Android 发布Apk签名

    1.签名的意义 为了保证每个应用程序开发商合法ID,防止部分开放商可能通过使用相同的Package Name来混淆替换已经安装的程序,我们需要对我们发布的APK文件进行唯一签名,保证我们每次发布的版本 ...

  6. android获取apk签名信息

    因为工作需要,需要获取应用的apk传递给新浪微博或者微信去申请授权 所以需要程序内获取签名上传服务器 做法如下:   public static String getAPPSecretString(A ...

  7. 验证apk签名方式(V1 || V2)

    进入SDK\build-tools\28.0.2目录(或者其他版本),该目录有apksigner.bar脚本,我们可以利用它来验证. 在此目录打开命令行. 命令为:apksigner verify - ...

  8. 关于APK签名的一些东西

    什么是APK 了解APK签名之前,首先要知道什么是apk文件:APK是AndroidPackage的缩写,即Android安装包(apk),APK文件其实就是zip格式的文件,只是后缀被改为了apk, ...

  9. Android : apk签名的多种方法以及key的配置

    方法一:使用Android SDK中的签名工具给apk签名: (1)Android源码的 build/target/product/security/ 目录下有 media.pk8.media.x50 ...

随机推荐

  1. 【剑指Offer】58:二叉树的下一个结点

    题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 题解一:递归 //既然给了二叉树的某个结点,且二叉树存 ...

  2. Linux 下安装 java

    yum 安装java 配置环境 /etc/profile export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-0.el7_7. ...

  3. 白面系列 docker

    在讲docker之前,首先区分2个概念,容器和虚拟机. 容器: 虚拟机: 简单来说,容器虚拟化操作系统:虚拟机虚拟化硬件. 容器粒度更小更灵活:虚拟机包含资源更多更大. docker就是用来做容器化的 ...

  4. Linux查看系统硬件信息命令

    Linux查看系统硬件信息命令 查看磁盘类型(是否SSD) cat /sys/block/sda/queue/rotational code:0 SSD盘 code:1 SATA盘 查看物理CPU个数 ...

  5. Thymeleaf的基本用法

    俗话说,不会前端的后端工程师不是一个合格的程序员.因为在项目中经常要和前端工程师打交道,并且偶尔也会涉及前端的简单开发,因此在闲暇之余学习了一点前端的知识,今天首先总结归纳一下 Thymeleaf 模 ...

  6. POJ2226(二分图建图/最小点覆盖)

    题意: 给定m*n的棋盘,有若干只咕咕.希望去掉一部分咕咕使得剩下的咕咕在上下左右四个方向越过咕咕槽的情况下都看不到咕咕. 思路: 建立一个二分图的方法有很多,这里采用xy二分. 假设没有咕咕槽的情况 ...

  7. LVM实现将2块磁盘总空间“合二为一”并挂载到同一目录

    需求场景 将MySQL主机的2块18T的数据盘空间全部"合并"后挂载到/mysql_data目录下,要求文件系统格式化为xfs:已有关键信息梳理如下: 需要挂载的数据盘 /dev/ ...

  8. Excel数据源增加时,渗透表如何刷新?

    使用Excel制作渗透表的时候在选择数据源范围的时候不要选择有限区域!!!最好圈定列范围 问题:制作渗透表是,在选择数据区域时使用[Ctrl + A]或者选定有限的数据区域,从而导致当数据源增加时,渗 ...

  9. 文件包含漏洞(DVWA环境中复现)

    LOW: 源代码: <?php // The page we wish to display $file = $_GET[ 'page' ]; ?> 可以看到,low级别的代码对包含的文件 ...

  10. crontab定时任务打包备份文件并删除过期文件

    Crontab 示例,最后这里要写成shell脚本定时运行 30 17 * * * cp -rf /usr/local/tomcat9-jforum/tomcat/logs/catalina.out ...