如何判断 apk 是否在 Java 中签名?
How to determine if an apk is signed in 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
您必须使用 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
块中的行也必须进行等效更改。
我正在 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
您必须使用 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
块中的行也必须进行等效更改。