读取Android APK的软件包名称


200

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

如何提取APK的软件包名称?

Answers:


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

1
有没有一种方法可以在Android代码中调用它?我希望能够启动通过我的应用下载的apk包。
Matt Wear

7
appt转储标记<apk路径> | grep package:\ name
herbertD

2
@Campiador,您可以一直键入直到管道|,按Enter键,然后在输出中搜索所需的参数。只需记住,这aapt需要走在自己的路上
Patrick

如果您需要以编程方式(针对脚本)获取此信息,请参见下面的答案。
布鲁诺·布鲁诺斯基

15
aapt命令位于下Android\SDK\build-tools\version。在Windows命令可以是aapt dump badging <path-to-apk> | findstr -i "package: name"aapt dump badging <path-to-apk>
equiman

75

您可以将apk安装在手机上,然后

使用adb连接时,您可以启动adb shell并执行pm list软件包-f,其中显示了每个已安装apk的软件包名称。

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


1
另外,您还必须确保以提升的特权运行。基本上,在终端中,su首先使用命令。
palswim

4
搜索特定的软件包名称pm list packages -f | grep term-to-search-for
Patrick Favre 2015年

14

基于@hackbod答案...但与Windows有关。

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

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

aapt dump badging <path-to-apk>

如果您只想查看包含package: name信息的行,请使用findstr

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

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


13

如果您正在看Google Play并想知道其程序包名称,则可以查看网址或地址栏。您将获得包名称。这com.landshark.yaum是包裹名称

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

12

如果使用MS记事本打开AndroidManifest.xml,请搜索词组package,您将发现以下内容:

package manifest $xxx.xxxxxxx.xxxxxxx |

其中xxx.xxxxxxx.xxxxxxx是您的程序包名称,每个字符后仅带有一个空格。

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


如果应用程序的代码在github上,则这特别有用!比其他方法容易得多,谢谢!
收缩

1
我解压缩了APK,但AndroidManifest.xml是一个二进制文件。奇怪但真实。
phatmann

12

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

切勿将grep和sed与awk结合使用。使用awk就足够了。
Bruno Bronosky

8

程序性答案

如果您需要以编程方式执行此操作,则不仅要让答案进入您的大脑,还需要更多的精力。我有一个脚本,用于签署所有应用程序,但是每个脚本使用不同的密钥。这有两种获取软件包名称的方法作为输出,因此可以将其放在变量中或使用它进行任何操作。

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

要求

aapt-Android资产打包工具,是SDK工具下载的一部分

解决方案1

使用awk指定'作为字段分隔符,使用搜索行package: 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'

开发人员没有承诺保留这种格式。

解决方案2

使用awk指定"作为字段分隔符,使用搜索行package=,并仅在该行中打印第二个“字段”:

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

该方法的弱点在于它package=仅依赖于仅在输出的Android Manifest:部分中输出。开发人员没有承诺保留这种格式。

解决方案3

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

这将是最好的方法,但是AndroidManifest.xml是一个二进制文件,我看到的将其转换为文本的所有SO回答都行不通。(应该使用apktool d简单的方法代替简单的unzip方法,但是不能。)如果您有解决此问题的方法,请发表评论


1
感谢您提供更多的信息来理解,而不仅仅是给出单个命令来复制。
阿里Zeynali

4

一个简单的解决方案是Open Android Studio-> Build-> Analyze Apk ...浏览并选择APK,现在您可以找到包名称并且几乎可以阅读。


2

如果您只想知道软件包名称,请运行adb logcat,启动所需的活动,您将获得有关软件包名称的提示。


2

另一个解决方案是使用aapt列表并使用sed来解析该列表:

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


在某些应用程序中,程序包组名称仅与程序包名称相同。你真的需要使用的A:package="com.example.appname"Android Manifest:部分,如果你这样做aapt list -a
布鲁诺Bronosky


2

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

apkanalyzer manifest application-id "${_path_to_apk}"

1

我认为在Linux中提取软件包名称的最佳和最简单的方法是

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

说明:

  1. AAPT提取APK信息
  2. Grep“包”仅保留有关包信息的行
  3. 使sed仅使用以下正则表达式用包名称替换整行:package: name='([a-z0-9.]*)'.*并用第一个(也是唯一的)匹配组替换。

1

您可以从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}'

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


1

如果您没有安装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上工作。


0

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


0

我也尝试了反编译,它可以工作,但是最近我找到了最简单的方法:

  1. Appium网站下载并安装Appium

  2. 打开Appium-> Android设置,选择目标apk文件。然后,您将获得所需的一切,包装信息,活动信息。


0

要在批处理脚本中使用此脚本,使脚本仅返回程序包名称非常方便(例如,在拥有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`


0

对于Windows,以下对我有用:

:: // Initializing variables
SET adb="C:\Users\<User name>\AppData\Local\Android\Sdk\platform-tools\adb"
SET aapt="C:\Users\<User name>\AppData\Local\Android\Sdk\build-tools\22.0.0\aapt"
SET APKPath=C:\Users\<User name>\Desktop\APK\Instant_Instal\

CD %APKPath%

:: // Searching for apk file and storing it
FOR /F "delims=" %%f IN ('dir /S /B *.apk') DO SET "APKFullPath=%%f"
SET apk=%APKFullPath%

:: // Command adb install apk, run apk
%adb% install %apk%

:: // Fetching package name from apk
%aapt% dump badging %APKFullPath% | FIND "package: name=" > temp.txt
FOR /F "tokens=2 delims='" %%s IN (temp.txt) DO SET pkgName=%%s
del temp.txt

:: // Launching apk
%adb% shell monkey -p %pkgName% -c android.intent.category.LAUNCHER 1

pause

注意

请根据adb,aapt的路径以及系统中的apk位置编辑adb,aapt,APKPath的路径。

加工:

  • 在这里,我将apk添加到了桌面“ \ Desktop \ APK \ Instant_Instal \”上的文件夹中。
  • %adb% install %apk%如果连接了设备,该命令将安装应用程序。
  • 这将%aapt% dump badging %APKFullPath% | FIND "package: name=" > temp.txt获取包名称和apk的版本等其他一些详细信息,并将其存储在temp.txt文件中,该文件与apk的位置相同。
  • FOR / F“ tokens = 2 delims ='” %% s IN(temp.txt)做SET pkgName = %% sextracts the package name and assigns to pkgName`变量
  • 最后%adb% shell monkey -p %pkgName% -c android.intent.category.LAUNCHER 1启动应用程序。

实质上,以上代码从桌面“ Desktop \ APK \ Instant_Instal \”中的给定位置将apk安装到设备并启动应用程序。


0

由于无法使用编辑器在.apk文件中找到软件包名称(如上述建议),因此我检查了应用程序“ ES Datei Explorer” /“ ES File Explorer”(免费版)中的功能已经安装了。在此工具中,软件包名称正确显示。
由于我认为手机上不应缺少好的文件浏览器,因此建议使用此工具(如果您已经在移动设备上安装了apk并必须知道程序包名称)。


0

自从Android文档中提到AAPT已被弃用以来,在Linux中使用AAPT2命令获取软件包名称的方法如下:

./aapt2 dump packagename <path_to_apk>

由于我使用的是Gradle构建的旧版本,因此我必须下载AAPT2的新版本,如此处所述:

从Google Maven下载AAPT2

在我的SDK-25.0.3、26.0.1和27.0.3中使用构建工具时,执行aapt2命令会显示错误:无法打开“ packagename”:没有这样的文件或目录。这就是为什么我选择较新版本的AAPT2。

我将3.3.0-5013011用于Linux。



-1

aapt列表-a“ path_to_apk”

我建议您将其保存为.txt,因为它可能很长。所以:

aapt列表-a“ path_to_apk”> file.txt

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.