阅读Android APK的软件包名称

我需要获取Android APK的软件包名称 。 我试图解压缩APK并阅读AndroidManifest.xml内容,但似乎它不是一个文本文件。

我怎样才能解压APK的包名?

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

你可以在你的手机上安装apk

使用adb连接,可以启动adb shell并执行pm列表软件包-f,它显示每个已安装apk的软件包名称。

这取自Android应用程序的查找包名称,以便使用Intent从Web启动Market应用程序

如果您使用MS记事本打开AndroidManifest.xml,search短语package ,您会发现以下内容:

 package manifest $xxx.xxxxxxx.xxxxxxx | 

其中xxx.xxxxxxx.xxxxxxx是您的软件包名称,只是在每个字符后面都有一个空格。

当你没有安装任何特定的工具时,这是有用的方法。

以下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 

如果你正在看谷歌播放,想知道它的包名,那么你可以看看url或地址栏。 你会得到包名。 这里com.landshark.yaum是包名

  https://play.google.com/store/apps/details?id=com.landshark.yaum&feature=search_result#?t=W251bGwsMSwyLDEsImNvbS5sYW5kc2hhcmsueWF1bSJd 

基于@ hackbod答案…但与Windows相关。

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

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

aapt dump badging <path-to-apk>

如果您只想看到package: name info的行,请使用findstr

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

希望它可以帮助其他Windows用户!

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

另一个解决scheme是使用aapt列表并使用sed来parsing:

aapt list -a $PATH_TO_YOUR_APK | sed -n "/^Package Group[^s]/s/.*name=//p"

程序化答案

如果你需要以编程的方式来做这件事,那么只需要把大脑的答案交给你就可以了。 我有一个脚本,用于签署我们所有的应用程序,但每个都使用不同的密钥。 这里有两种方法可以将Package Name作为输出,所以你可以把它放在一个variables中,或者做任何你需要的东西。

输出示例: com.example.appname (仅此而已)

要求

aapt – Android资源包装工具, SDK Tools下载的一部分

解决scheme1

使用awk指定'作为字段分隔符,searchpackage: name=的一行,并只打印行中的第二个“字段”:

 aapt dump badging /path/to/file.apk | awk -v FS="'" '/package: name=/{print $2}' 

这种方法的一个弱点是它依靠aapt以相同的顺序输出包信息字段:

 package: name='com.example.appname' versionCode='3461' versionName='2.2.4' platformBuildVersionName='4.2.2-1425461' 

我们必须承诺从开发人员保持这种格式。

解决scheme2

使用awk指定"作为字段分隔符,searchpackage=的行,并只打印第二个”字段“在行中:

 aapt list -a /path/to/file.apk | awk -v FS='"' '/package=/{print $2}' 

这种方法的一个弱点是它依赖于aapt只在输出的Android Manifest:部分输出package= 。 我们必须承诺从开发人员保持这种格式。

解决scheme3

apktool d展开apk文件并阅读AndroidManifest.xml。

这将是最好的方法,但AndroidManifest.xml是一个二进制文件,所有我看到的转换为文本的答案不起作用。 (使用apktool d而不是一个简单的unzip应该为你做,但它不)。 请评论如果你有这个问题的解决scheme

我认为在Linux中提取包名的最好和最简单的方法是

 aapt dump badging <APK_path> | grep package | sed -r "s/package: name='([a-z0-9.]*)'.*/\1/" 

说明:

  1. AAPT提取APK信息
  2. grep“包”只保留有关包信息的行
  3. 使用以下正则expression式将sed全部replace为包名: package: name='([a-z0-9.]*)'.*并用第一个(也是唯一的)匹配组进行replace。

您可以从APK中提取AndroidManifest.xml,删除所有NULL字节,直到string“manifest”后跳过所有内容,然后是包长度字节后跟包名(以及后面的内容)。 对于困难的任务,我使用伟大的GEMA工具,所以命令如下所示:

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

当然,你可以使用任何其他工具来进行过滤。

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

包名查看器应用程序

你可以在你的模拟器上安装Package_Name_Viewer.apk ,然后你可以在你的模拟器上看到所有已安装应用程序的软件包名称。

我也尝试过编译的东西,它的工作,但最近我发现最简单的方法:

  1. 从Appium网站下载并安装Appium

  2. 打开Appium-> Android设置,select目标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`

aapt list -a“path_to_apk”

我build议你把它保存在一个.txt文件中,因为它可能很长。 所以:

aapt list -a“path_to_apk”> file.txt

然后查看当前目录中的file.txt。