阅读Android APK的包名称

时间:2011-06-09 06:57:29

标签: android apk

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

如何提取APK的包名?

25 个答案:

答案 0 :(得分:284)

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

答案 1 :(得分:67)

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

  

使用adb连接,您可以启动adb shell并执行pm list packages -f,它显示每个已安装的apk的包名。

这取自 Find package name for Android apps to use Intent to launch Market app from web

答案 2 :(得分:12)

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

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

答案 3 :(得分:12)

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

package manifest $xxx.xxxxxxx.xxxxxxx |

其中xxx.xxxxxxx.xxxxxxx是你的包名,只是在每个字符后写一个空格。

如果您没有安装任何特定工具,这是有用的方法。

答案 4 :(得分: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

答案 5 :(得分:8)

基于@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用户!

答案 6 :(得分:4)

程序化答案

如果您需要以编程方式执行此操作,那么只需将答案放入您的大脑即可。我有一个脚本用于签署我们的所有应用程序,但每个都使用不同的密钥。以下是将仅包名称作为输出的两种方法,这样您就可以将它放在一个变量中,或者随意使用它。

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

要求

aapt - Android资产包装工具,SDK Tools download

的一部分

解决方案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

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

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

答案 7 :(得分:2)

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

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

答案 8 :(得分:2)

您可以在Android Studio的“构建”菜单中使用@Route("main") public class MainRoute extends VerticalLayout implements MainView.Retriever { public MainRoute(){ ... } @Override public void onAttach(){ MainView mainView = getMainView(); if (mainView != null){ mainView.someCode(); // do with the mainView what you want here } else { LOGGER.error(...); } } } ,它将在新窗口顶部显示软件包名称。

答案 9 :(得分:2)

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

答案 10 :(得分:2)

如果您的智能手机上已经安装了APK,那么这是一种非常简单的方法。只需使用以下APP之一:

Package Name Viewer Apps

答案 11 :(得分:2)

一个简单的解决方案是打开Android Studio->构建->分析Apk ...浏览并选择APK,现在您可以找到包名称,几乎可以阅读。

答案 12 :(得分:1)

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

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

说明:

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

答案 13 :(得分:1)

你可以从APK中提取AndroidManifest.xml,删除所有空字节,跳过字符串&#39; manifest&#39;之后的所有内容,然后你是一个长度字节后面跟着包名(然后是什么之后)。对于困难的任务,我使用了很棒的GEMA工具,所以命令如下所示:

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

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

答案 14 :(得分:0)

在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

答案 15 :(得分:0)

您可以使用以下方式通过程序获取包名称:

packageManager.getPackageArchiveInfo(apkFilePath, 0)?.packageName

答案 16 :(得分:0)

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

apkanalyzer manifest application-id "${_path_to_apk}"

答案 17 :(得分:0)

如果未安装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上测试。在大多数Linux中,“ strings”和“ unzip”是标准配置,因此在Linux上也应如此。

答案 18 :(得分:0)

Since its mentioned in Android documentation that AAPT has been deprecated, getting the package name using AAPT2 command in Linux is as follows:

./aapt2 dump packagename <path_to_apk>

Since I am using an older version of Gradle build, I had to download a newer version of AAPT2 as mentioned here :

Download AAPT2 from Google Maven

Using the build-tools in my sdk - 25.0.3, 26.0.1 and 27.0.3, executing the aapt2 command shows an error: Unable to open 'packagename': No such file or directory. That's why I went for the newer versions of AAPT2.

I used 3.3.0-5013011 for linux.

答案 19 :(得分:0)

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

答案 20 :(得分: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的路径。

<强>工作:

  • 这里我在桌面“\ Desktop \ APK \ Instant_Instal \”的文件夹中添加了apk。
  • 如果设备已连接,命令%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)DO SET pkgName = %% s extracts the package name and assigns to pkgName`variable
  • 最后%adb% shell monkey -p %pkgName% -c android.intent.category.LAUNCHER 1启动该应用。

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

答案 21 :(得分: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

available on gist

所以你可以写:

adb uninstall`。/getPackageName.sh file.apk`

答案 22 :(得分:0)

我也尝试了反编译的东西,但它最近才找到了最简单的方法:

  1. Appium website

  2. 下载并安装Appium
  3. 打开Appium-&gt; Android设置,选择目标apk文件。然后你得到你想要的一切,包裹信息,活动信息。

答案 23 :(得分:0)

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

答案 24 :(得分:-1)

  

aapt list -a“path_to_apk”

我建议你把它保存在.txt中,因为它可能很长。 所以:

  

aapt list -a“path_to_apk”&gt; file.txt的

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