我需要得到一个Android APK的包名。我已经尝试解压缩APK和读取AndroidManifest.xml文件的内容,但它似乎不是一个文本文件。

如何提取APK的包名?


当前回答

由于在Android文档中提到AAPT已被弃用,在Linux中使用AAPT2命令获取包名如下:

./aapt2 dump packagename <path_to_apk> ./aapt2 dump

因为我使用的是旧版本的Gradle构建,所以我不得不下载一个更新版本的AAPT2,就像这里提到的:

从谷歌Maven下载AAPT2

使用构建工具在我的sdk - 25.0.3, 26.0.1和27.0.3,执行aapt2命令显示一个错误:无法打开'packagename':没有这样的文件或目录。这就是我选择更新版本的AAPT2的原因。

对于linux,我使用3.3.0-5013011。

其他回答

如果你只是想知道包的名称,运行adb logcat,启动你想要的活动,你会得到一个包名称的提示。

根据@hackbod的回答…但与窗户有关。

aapt命令位于Android\SDK\build-tools\version。 如果你需要更多关于什么是appt命令(Android资产打包工具)的信息,请阅读https://stackoverflow.com/a/28234956/812915

aapt的dump子命令用于显示包中各个元素或部分的值:

apt转储标记<path-to-apk>

如果只希望看到package: name info这一行,请使用findstr

apt dump badging <path-to-apk> | findstr -n "package: name" | findstr "1:"

希望对其他windows用户有所帮助!

一个非常简单的方法是使用apkanalyzer。

apkanalyzer manifest application-id "${_path_to_apk}"

下面的bash脚本将显示包名称和主活动名称:

apk_package.sh

package=$(aapt dump badging "$*" | awk '/package/{gsub("name=|'"'"'","");  print $2}')
activity=$(aapt dump badging "$*" | awk '/activity/{gsub("name=|'"'"'","");  print $2}')
echo
echo "   file : $1"
echo "package : $package"
echo "activity: $activity"

像这样运行它:

apk_package.sh /path/to/my.apk

要在批处理脚本中使用它,让脚本只返回包名是很方便的(例如,当你有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`