我需要得到一个Android APK的包名。我已经尝试解压缩APK和读取AndroidManifest.xml文件的内容,但它似乎不是一个文本文件。
如何提取APK的包名?
我需要得到一个Android APK的包名。我已经尝试解压缩APK和读取AndroidManifest.xml文件的内容,但它似乎不是一个文本文件。
如何提取APK的包名?
当前回答
在Android设备上安装apk。然后
您可以启动adb shell并执行PM list packages -f,这将显示每个已安装apk的包名称。
这是从 找到包名称为Android应用程序使用意图启动市场应用程序从网络。
其他回答
你可以通过以下方式获取包名:
packageManager.getPackageArchiveInfo(apkFilePath, 0)?.packageName
在Mac:
方式1:
zgong$ /Users/zgong/Library/Android/sdk/build-tools/29.0.3/aapt dump badging ~/Downloads/NonSIMCC-151-app-release-signed.apk
package: name='com.A.B' versionCode='2020111801' versionName='1.0.40' compileSdkVersion='29' compileSdkVersionCodename='10'
sdkVersion:'24'
targetSdkVersion:'29'
......
方式2:
/Users/zgong/Library/Android/sdk/build-tools/29.0.3/aapt2 dump packagename ~/Downloads/NonSIMCC-151-app-release-signed.apk
com.A.B
我认为在Linux中只提取包名的最好和最简单的方法是
aapt dump badging <APK_path> | grep package | sed -r "s/package: name='([a-z0-9.]*)'.*/\1/"
解释:
AAPT提取APK信息 Grep“package”只保留一行关于包的信息 让sed只使用以下正则表达式将整行替换为包名:package: name='([a-z0-9.]*)'。*并替换为第一个(也是唯一一个)匹配组。
aapt dump badging <path-to-apk> | grep package:\ name
如果你想读取应用中典型APK文件的包名,有一个简单的方法来分析PackageInfo:
fun getAPKPackageName(apkFile: File?): String? {
if (apkFile == null || !apkFile.isFile || !apkFile.exists()) return null
val apkFilePath = apkFile.absolutePath
if (apkFilePath.isNullOrEmpty()) return null
val packageManager = App.context.packageManager ?: return null
val packageInfo = packageManager.getPackageArchiveInfo(apkFilePath, 0) ?: return null
return packageInfo.packageName
}