`
lynen
  • 浏览: 128541 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

获取已安装或未安装的apk签名

 
阅读更多

某些时候需要获取已安装的apk或者是未安装的apk的签名信息,以下代码片段将会很有用。

1.通过app的packageName获取已安装的apk的签名信息

 

public Signature getPackageSignature(Context context, String packageName){
		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(packageName)){
				return info.signatures[0];
			}
		}
		return null;
	}

 

2.根据文件路径获取未安装的apk的签名信息

由于android平台本身的一个小bug,使用PackageManager方式获取未安装的apk文件的签名会稍微费事一点。

(android平台的这个小bug有些狗血,是因为PackageManager的的getPackageArchiveInfo中少了如下代码的原因导致)

缺少的代码:

 

if ((flags & GET_SIGNATURES) != 0)
            packageParser.collectCertificates(pkg, 0);

问题的详细信息可以查看以下链接:

https://code.google.com/p/android/issues/detail?id=9151#c8

https://android-review.googlesource.com/#/c/18769/1/core/java/android/content/pm/PackageManager.java

 

这样一来,获取apk文件的签名方式将会变得稍微啰嗦一点

(1)首先自定义一个getPackageArchiveInfo函数,如下:

@SuppressWarnings("unchecked")
	public PackageInfo getPackageArchiveInfo(String archiveFilePath, int flags){
        // Workaround for https://code.google.com/p/android/issues/detail?id=9151#c8
        try{
            Class packageParserClass = Class.forName(
                    "android.content.pm.PackageParser");
            Class[] innerClasses = packageParserClass.getDeclaredClasses();
            Class packageParserPackageClass = null;
            for (Class innerClass : innerClasses){
                if (0 == innerClass.getName().compareTo("android.content.pm.PackageParser$Package")){
                    packageParserPackageClass = innerClass;
                    break;
                }
            }
            Constructor packageParserConstructor = packageParserClass.getConstructor(
                    String.class);
            Method parsePackageMethod = packageParserClass.getDeclaredMethod(
                    "parsePackage", File.class, String.class, DisplayMetrics.class, int.class);
            Method collectCertificatesMethod = packageParserClass.getDeclaredMethod(
                    "collectCertificates", packageParserPackageClass, int.class);
            Method generatePackageInfoMethod = packageParserClass.getDeclaredMethod(
                    "generatePackageInfo", packageParserPackageClass, int[].class, int.class, long.class, long.class);
            packageParserConstructor.setAccessible(true);
            parsePackageMethod.setAccessible(true);
            collectCertificatesMethod.setAccessible(true);
            generatePackageInfoMethod.setAccessible(true);
            
            Object packageParser = packageParserConstructor.newInstance(archiveFilePath);
    
            DisplayMetrics metrics = new DisplayMetrics();
            metrics.setToDefaults();
            
            final File sourceFile = new File(archiveFilePath);

            Object pkg = parsePackageMethod.invoke(
                    packageParser,
                    sourceFile,
                    archiveFilePath,
                    metrics,
                    0);
            if (pkg == null){
                return null;
            }
    
            if ((flags & android.content.pm.PackageManager.GET_SIGNATURES) != 0){
                collectCertificatesMethod.invoke(packageParser, pkg, 0);
            }
    
            return (PackageInfo)generatePackageInfoMethod.invoke(null, pkg, null, flags, 0, 0);
        }
        catch (Exception e)
        {
            Log.e("Signature Monitor",
                "android.content.pm.PackageParser reflection failed: " + e.toString());
        }

        return null;
    }

 (2)使用自定义的getPackageArchiveInfo函数获取PackageInfo,从而获取签名信息,如下:

/**
	 * 
	 * @param context
	 * @param apkFile 文件的全路径信息(包括apk文件的名称),如果是无效的apk文件,返回值为null
	 * @return
	 */
	public Signature getApkSignatureByFilePath(Context context, String apkFile){
		PackageInfo newInfo = getPackageArchiveInfo(apkFile, PackageManager.GET_ACTIVITIES | PackageManager.GET_SIGNATURES);
		if(newInfo != null){
			if(newInfo.signatures != null && newInfo.signatures.length >0){
				return newInfo.signatures[0];
			}
		}
		return null;
	}

 

 

分享到:
评论

相关推荐

    APK万能签名工具

    1. **重新签名**:该工具能够对已修改的APK文件进行重新签名,使得新的签名与系统要求相匹配,从而顺利安装。 2. **证书生成**:它可以创建新的数字证书,为APK文件生成新的签名,无需开发者手动配置复杂的签名过程...

    微信工具apk签名获取

    本话题主要涉及“微信工具apk签名获取”,这是一个官方提供的帮助开发者获取APK签名的工具。 首先,我们来理解一下什么是APK签名。在Android系统中,每个安装到设备上的应用程序都需要一个数字签名,这是为了确保...

    windows下android apk签名工具

    在Android应用开发中,APK签名是一个至关重要的步骤,它确保了应用的完整性和来源的可信性。在Windows环境下,开发者通常使用特定的工具来对APK进行签名,以使其能够在Android设备上顺利安装和运行。本文将详细介绍...

    获取apk签名的工具

    这个是一个获取apk文件签名的一个小工具,是我从我同事那弄来的分享给大家,请大家不要喷我哈。

    Android Apk签名工具

    在Android开发过程中,Apk签名是一个至关重要的步骤,它确保了应用的安全性和完整性。本文将深入探讨Android Apk签名工具的使用,以及它在构建和发布Android应用过程中的作用。 首先,我们需要理解什么是Apk签名。...

    apk重签名工具

    4. **签名新APK**:使用Java的 jarsigner 工具或专门的APK签名工具,使用你的私钥对APK进行签名。例如,使用jarsigner命令行工具,输入以下命令: ``` jarsigner -verbose -keystore myKeystore -alias myAlias -...

    新浪微博签名apk

    而安装签名apk则是指使用特定的签名文件对apk进行签名,以便在设备上安装和运行。 使用“新浪微博签名apk”,开发者需要特别注意输入正确的包名。包名在Android开发中是一个全局唯一的标识符,由一系列小写的反向...

    查看apk签名工具.rar

    APK签名是一个至关重要的步骤,它确保了应用的完整性和开发者身份的验证。本资源"查看apk签名工具.rar"提供了一个实用的工具,能够帮助开发者或者用户方便地查看APK的签名信息。 首先,我们需要理解APK签名的目的。...

    android10 apk签名文件

    在Android系统中,APK签名...总结,Android 10 APK签名文件是应用开发不可或缺的一部分,它关乎应用的安全、权限获取以及用户信任。开发者需熟知签名机制,合理运用签名工具,遵循最佳实践,以确保应用的质量和安全性。

    apk签名工具apktool

    APK签名工具Apktool是Android开发者常用的辅助软件,它主要用于对APK应用程序进行反编译、修改和重新打包。本文将深入探讨Apktool的工作原理...在实际操作中,应遵循版权法规,仅对个人项目或已获得授权的APK进行修改。

    Android 签名APK获得系统权限

    首先,理解APK签名的重要性。Android系统要求所有安装的APK必须经过签名,签名的过程是对APK的内容使用私钥进行加密,验证应用的完整性和开发者身份。默认情况下,每个开发者都会有自己的签名,用于发布应用。然而,...

    APK重新签名

    接下来,我们将深入探讨APK签名的概念、作用,以及如何进行重新签名。 首先,我们来了解**APK签名**的基本概念。在APK开发完成后,为了确保其来源可信和防止篡改,开发者会使用一个私钥对APK进行数字签名。这个签名...

    OPPO获取应用Sign,APK签名工具.rar

    1. 下载并解压"OPPO获取应用Sign,APK签名工具.rar",获得签名工具。 2. 准备好待签名的APK文件。 3. 使用OPPO签名工具,按照工具提供的指南或文档输入APK路径和私钥信息(如果工具需要的话)。 4. 运行签名工具,...

    Android系统签名APK

    APK签名的过程主要包括以下几个步骤: 1. **生成密钥对**:首先,开发者需要使用密钥生成工具(如Java的keytool)创建一个包含公钥和私钥的密钥对。私钥用于签名,而公钥则用于验证签名。 2. **构建APK**:开发...

    Android 更新下载apk 安装apk 打开apk

    3. **签名验证**:每个APK在构建时都会被签名,安装时系统会验证签名以确保APK未被篡改。签名也有助于确认应用的发布者。 4. **权限请求**:在Android 6.0及以上版本,部分权限在运行时动态请求,而非安装时一次性...

    APK签名打包文件

    APK签名打包文件是Android应用开发过程中的一个...总之,APK签名是Android应用发布不可或缺的一部分,它确保了应用的安全性和可靠性。通过使用像"9663606.bat"这样的批处理脚本,开发者可以更方便地完成这一重要步骤。

    获取apk签名1.2.apk

    )手机端获取安卓软件apk包的signature签名信息。包括发布者、拥有者、证书有效期、公钥、摘要(MD5)。纯手机端获取,无需电脑。程序员朋友的好帮手,截止目前(2020-04-11)没发现可在手机端获取签名信息的同类软件...

    apk自动签名工具

    **一、APK签名的重要性** 1. **验证来源**:签名可以验证应用的开发者,确保应用来自可信的源。 2. **防止篡改**:一旦APK被签名,任何修改都会导致签名失效,防止恶意篡改。 3. **权限控制**:更新已安装的应用时...

    android安卓获取apk签名工具

    本主题聚焦于"android安卓获取apk签名工具",这通常涉及到APK签名的概念、过程以及如何使用特定工具来完成这一任务。 **APK签名的重要性** 1. **验证开发者身份**:签名提供了一种方式,让用户知道应用的来源,...

    微信签名工具Android 安装包(Gen-Signature-android.apk)

    这个签名验证了应用的来源和开发者身份,并且在安装过程中确保APK文件未被篡改。签名过程使用密钥对APK进行加密,这有助于防止恶意代码的注入,同时允许系统跟踪应用的更新。 接下来,我们要讨论的是`.jks`文件。这...

Global site tag (gtag.js) - Google Analytics