我需要得到一个Android APK的包名。我已经尝试解压缩APK和读取AndroidManifest.xml文件的内容,但它似乎不是一个文本文件。
如何提取APK的包名?
我需要得到一个Android APK的包名。我已经尝试解压缩APK和读取AndroidManifest.xml文件的内容,但它似乎不是一个文本文件。
如何提取APK的包名?
当前回答
aapt dump badging <path-to-apk> | grep package:\ name
其他回答
aapt dump badging <path-to-apk> | grep package:\ name
程序性的回答
如果你需要用编程的方式来做这件事,这比把答案输入你的大脑要复杂一些。我有一个脚本,我用来签署我们所有的应用程序,但每个使用不同的密钥。这里有两种方法来获得包名作为输出,这样你就可以把它放在一个变量中或做任何你需要的事情。
示例输出:com.example.appname(仅此而已)
需求
aapt - Android资产打包工具,部分SDK工具下载
解决方案1
使用awk指定'作为字段分隔符,搜索包含package: name=的行,并只打印该行中的第二个“字段”:
aapt dump badging /path/to/file.apk | awk -v FS="'" '/package: name=/{print $2}'
这种方法的一个缺点是它依赖于apapt以相同的顺序输出包信息字段:
package: name='com.example.appname' versionCode='3461' versionName='2.2.4' platformBuildVersionName='4.2.2-1425461'
我们没有从开发人员那里得到维持这种格式的承诺。
解决方案2
使用awk指定“”作为字段分隔符,搜索包含package=的行,并只打印该行中的第二个“字段”:
aapt list -a /path/to/file.apk | awk -v FS='"' '/package=/{print $2}'
这个方法的一个缺点是它只在输出的Android Manifest:部分依赖apapt to output package=。我们没有从开发人员那里得到维持这种格式的承诺。
解决方案3
用apktool d展开apk文件,读取AndroidManifest.xml。
这将是最好的方法,但AndroidManifest.xml是一个二进制文件,我看到的所有SO答案转换为文本不工作。(使用apktool d而不是简单的解压缩应该为你做到这一点,但它没有。)请评论,如果你有解决这个问题的办法
要在批处理脚本中使用它,让脚本只返回包名是很方便的(例如,当你有APK时卸载应用程序)。
下面是我使用的脚本:
# extract the android package id from a built apk file
# usage ./getPackageName.sh <path-to-apk>
line=`aapt dump badging "$1" | grep package:\ name`
# above returns:
# package: name='com.calvium.myapp' versionCode='1' versionName='1.0'
if [[ $line =~ name=\'(.+)\'\ versionCode ]]; then
echo ${BASH_REMATCH[1]}
else
echo "Failed to find package name"
exit 1
fi
可参考要旨
你可以这样写:
adb卸载`./getPackageName.sh file.apk`
如果你想读取应用中典型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
}
你可以通过以下方式获取包名:
packageManager.getPackageArchiveInfo(apkFilePath, 0)?.packageName