Android 是怎么判断某个APK文件是不是已经安装

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 是怎么判断某个APK文件是不是已经安装相关的知识,希望对你有一定的参考价值。

最近在做一个项目要判断某个APK是否在应用列表中存在,我想知道Androud自带的那个安装的提醒的功能是怎么实现的

android系统中,判断应用有无安装有两种方式:

1.根据包名判断,以下为判断代码:
public boolean checkApkExist(Context context, String packageName)
if (packageName == null || “”.equals(packageName))
return false;
try
ApplicationInfo info = context.getPackageManager()
.getApplicationInfo(packageName,
PackageManager.GET_UNINSTALLED_PACKAGES);
return true;
catch (NameNotFoundException e)
return false;



2. 根据Intent判断,以下为判断代码:
public boolean checkApkExist(Context context, Intent intent)
List<ResolveInfo> list = context.getPackageManager().queryIntentActivities(intent, 0);
if(list.size() > 0)
return true;

return false;

public boolean checkApkExist(Context context, String packageName)
if (packageName == null || “”.equals(packageName)) return false;
try
ApplicationInfo info = context.getPackageManager() .getApplicationInfo(packageName, PackageManager.GET_UNINSTALLED_PACKAGES); return true;
catch (NameNotFoundException e) return false;

public boolean checkApkExist(Context context, Intent intent)
List<ResolveInfo> list = context.getPackageManager()
.queryIntentActivities(intent, 0);
if (list.size() > 0)
return true;

return false;
参考技术A 因为我的APK名称和安装后的应用名称是不一样的 所以这种办法不能判断APK是否已经安装了的 我现在想知道的就是Android自己是怎么判断的? 到eoeAndroid网站查看回答详情>> 参考技术B 到/system/data下查一下有没有这个apk

如何判断 Android 应用的 Apk 签名是不是一致?

我自己的判断方法是下载的应用安装能成功覆盖原应用则签名一致。但如何不通过安装 Apk 判断签名一致?

Android应用的发布形式apk中包含的签名加密方法除了RSA还有DSA,所以不能只从apk中提取常见的META-INF/CERT.RSA,应该是检查apk中具体的签名文件。
1.FILE="yourapp.apk"
cert_XSA=`jar tf $FILE | grep SA`
此时得到的cert_XSA可能是META-INF/*.RSA或者META-INF/*.DSA。

2.apk中提取具体的签名文件。
jar xf $FILE $cert_XSA
此时会在当前目录得到cert_XSA文件。

3.对于得到的签名文件,提取其中签名的MD5值
keytool -printcert -file $cert_XSA | grep MD5 > "$FILE.certMD5"
这时候yourapp.certMD5这个文件中就保存了yourapp.apkk中的签名MD5值。

4.最后比较两个app的签名可以用diff
FILE1="yourapp1.apk"
FILE2="yourapp2.apk"
//经过上述步骤得到$FILE1.certMD5和$FILE2.certMD5
certMD5_diff=`diff $FILE1.certMD5 $FILE2.certMD5`
if [ "$certMD5_diff" = "" ]; then
echo "$FILE1.certMD5 == $FILE2.certMD5"
fi
若输出yourapp1.apk.certMD5 == yourapp2.apk.certMD5那么这两个应用的签名就一致
参考技术A 将apk当做压缩包打开,直接提取签名存放的META-INF,手动比对修改日期,MD5之类的。 参考技术B 在程序中获取APK的签名时,通过signature方法进行获取,如下:
packageInfo = manager.getPackageInfo(pkgname,PackageManager.GET_SIGNATURES);
signatures = packageInfo.signatures;
for (Signature signature : signatures)
builder.append(signature.toCharsString());

signature = builder.toString();

所以一般的程序就是在代码中通过判断signature的值,来判断APK是否被重新打包过。
参考技术C 将apk当做压缩包打开,直接提取签名存放的META-INF,手动比对修改日期,MD5之类的 参考技术D https://open.weixin.qq.com/zh_CN/htmledition/res/dev/download/sdk/Gen_Signature_Android.apk
下载一个这个安装到手机上,输入你的应用包名,可以获得签名信息

以上是关于Android 是怎么判断某个APK文件是不是已经安装的主要内容,如果未能解决你的问题,请参考以下文章

Android 是怎么判断某个APK文件是不是已经安装

如何判断 Android 应用的 Apk 签名是不是一致

如何判断 Android 应用的 Apk 签名是不是一致?

什么是android apk加固

android 怎么查看签名文件

C# winform,怎么通过控件的Name属性判断某个控件是不是已经存在