java - 如何确定 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
解决方案
您必须使用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
块中的行也必须等效更改。
推荐阅读
- python - Django 无法从我的数据库中删除用户
- python - 我的 Flask 无法正确显示 mysql 行
- r - 如何用特定日期替换丢失的日期并将格式保留为 R 中的日期
- python - Python:将numpy数组分配给变量
- json - 诉诸多维数组反应
- javascript - 为什么我的对象键值对被覆盖而不是创建新的键值对?
- python - Python 中的 str() 方法是否适用于所有类型的参数?
- python - Python 中的 ImportError 没有模块
- android - 停止来自不同活动的警报
- javascript - 对来自 SharePoint RestAPI 的结果进行排序