首页 > 解决方案 > 如何确定 apk 是否用 Java 签名?

问题描述

我正在 Android Studio 中构建一个 Java Android 应用程序。在我的 onCreate 函数中,我想确定应用程序是否已在有或没有证书的情况下构建。

但到目前为止,我根本没有得到证书信息。

        Activity activity = this;

        Signature[] sigs;

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            // New signature
            PackageInfo siginfo = activity.getPackageManager().getPackageArchiveInfo(activity.getPackageName(), activity.getPackageManager().GET_SIGNING_CERTIFICATES);
            if (siginfo == null){
                sigs = new Signature[0];
            }else{
                sigs = siginfo.signingInfo.getApkContentsSigners();
            }
            
        }else {
            sigs = activity.getPackageManager().getPackageArchiveInfo(activity.getPackageName(), activity.getPackageManager().GET_SIGNATURES).signatures;
        }
        
        String sigstring = "";
        for (Signature sig : sigs)
        {
            sigstring.concat(sig.toCharsString() + "; ");
        }
        Log.i("SigString: " + sigstring);
        Log.i("NumberOfSignatures: " + sigs.length);

输出:

2021-04-19 14:44:52.156 I:SigString: 
2021-04-19 14:44:52.156 I:NumberOfSignatures: 0

标签: javaandroiddigital-signature

解决方案


您必须使用getPackageInfo而不是getPackageArchiveInfo. 当您这样做时,getPackageInfo必须将其包含在 try-catch-block 中。

因此,线

PackageInfo siginfo = activity.getPackageManager().getPackageArchiveInfo(activity.getPackageName(), activity.getPackageManager().GET_SIGNING_CERTIFICATES);

需要替换为

PackageInfo siginfo;
try {
  siginfo = activity.getPackageManager().getPackageInfo(activity.getPackageName(), activity.getPackageManager().GET_SIGNING_CERTIFICATES);
}catch (PackageManager.NameNotFoundException e){
  siginfo = null;
}

并且else块中的行也必须等效更改。


推荐阅读