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

如何提取APK的包名?


当前回答

在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

其他回答

你可以从APK中提取AndroidManifest.xml,删除所有NULL字节,跳过所有内容直到字符串'manifest'之后,然后你就在一个长度字节后面跟着包名(以及它后面的内容)。对于困难的任务,我使用强大的GEMA工具,因此命令看起来像这样:

7z e -so MyApp.apk AndroidManifest.xml | gema '\x00=' | gema -match 'manifest<U1><U>=@substring{0;@char-int{$1};$2}'

当然,您可以使用任何其他工具来进行筛选。

有一个非常简单的方法,如果你的智能手机上已经准备好了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上工作。

由于我无法用编辑器在.apk文件中找到包名(如上所述),我检查了我已经安装的应用程序“ES Datei资源管理器”/“ES文件资源管理器”(免费版本)中的功能。 在此工具中,包名称将正确显示。 因为我认为手机上不应该缺少一个好的文件资源管理器,我建议使用这个工具(如果你已经在手机上安装了apk,并且必须知道包的名称)。

aapt dump badging <path-to-apk> | grep package:\ name