我需要得到一个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。

其他回答

程序性的回答

如果你需要用编程的方式来做这件事,这比把答案输入你的大脑要复杂一些。我有一个脚本,我用来签署我们所有的应用程序,但每个使用不同的密钥。这里有两种方法来获得包名作为输出,这样你就可以把它放在一个变量中或做任何你需要的事情。

示例输出: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而不是简单的解压缩应该为你做到这一点,但它没有。)请评论,如果你有解决这个问题的办法

下面的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

如果你没有安装Android SDK,就像在一些测试场景中一样,你可以使用下面的bash方法获取包的名称:

getAppIdFromApk() {
  local apk_path="$1"

  # regular expression (required)
  local re="^\"L.*/MainActivity;"
  # sed substitute expression
  local se="s:^\"L\(.*\)/MainActivity;:\1:p"
  # tr expression
  local te=' / .';

  local app_id="$(unzip -p $apk_path classes.dex | strings | grep -Eo $re | sed -n -e $se | tr $te)"

  echo "$app_id"
}

在mac上测试。'strings'和'unzip'在大多数linux上是标准的,所以也应该在linux上工作。

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

apkanalyzer manifest application-id "${_path_to_apk}"

有一个非常简单的方法,如果你的智能手机上已经准备好了APK。只要使用这些应用程序之一:

包名称查看器应用程序