Android APP 系统签名及权限设置
本文主要讨论在Android平台上,关于应用(APP)系统签名以及权限设置的相关知识。
测试平台: Android 11/9
注意: 如果APP已经安装(未签名),此时再去安装已签名的APP,
getPackageArchiveInfo()
还是获取不到信息,需要先使用pm uninstall
卸载原APP,再去安装已签名的APP。
这个鸟问题坑死我了,以后记得APP系统签名后 手动卸载可以避免很多问题!
获取Apk信息
在Android中,我们可以使用PackageManager
类的getPackageArchiveInfo()
方法获取apk文件的信息,这包括应用名、包名、版本信息等。然而,需要注意的一点是,如果apk文件没有进行系统签名,那么getPackageArchiveInfo()
方法将无法获取到信息,其返回的PackageInfo
对象将为null。
下面的代码展示了如何使用getPackageArchiveInfo()
方法获取apk文件的信息:
fun getApkInfo(absPath: String?, context: Context) { val pm = context.packageManager // 如果pkgInfo为null,说明app没有进行系统签名 val pkgInfo: PackageInfo? = absPath?.let { pm.getPackageArchiveInfo( it, PackageManager.GET_SIGNATURES or PackageManager.GET_RECEIVERS ) } Log.d(TAG,"pkgInfo"+pkgInfo) if (pkgInfo != null) { val appInfo = pkgInfo.applicationInfo appInfo.publicSourceDir = absPath val appName = pm.getApplicationLabel(appInfo).toString() // 获取应用名 val packageName = appInfo.packageName // 获取包名 val version = pkgInfo.versionName // 获取版本信息 val icon1 = pm.getApplicationIcon(appInfo) // 获取图标信息 val icon2 = appInfo.loadIcon(pm) val pkgInfoStr = String.format( "PackageName:%s, Version: %s, AppName: %s", packageName, version, appName ) Log.i(TAG, String.format("Successfully obtained PkgInfo: %s", pkgInfoStr)) } else { Log.i(TAG, String.format("Failed to get PkgInfo: %s", absPath)) } }
高版本Android系统权限设置
在Android 11及更高版本中,如果你的应用需要查询设备上所有应用的信息,你需要在应用的manifest文件中添加QUERY_ALL_PACKAGES
权限。具体操作如下:
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" tools:ignore="QueryAllPackagesPermission" />
完成以上工作后,你就可以在Android设备上获取任意apk文件的详细信息了,而且对于未进行系统签名的apk文件,你也能够通过指定的方法获取其详细信息。