【问题标题】:Read the package name of an Android APK读取 Android APK 的包名
【发布时间】:2011-09-11 11:04:28
【问题描述】:

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

如何提取 APK 的包名?

【问题讨论】:

    标签: android apk


    【解决方案1】:

    您可以通过以下方式以编程方式获取包名称:

    packageManager.getPackageArchiveInfo(apkFilePath, 0)?.packageName
    

    【讨论】:

    • 其他答案,使用外部工具,但通过这个答案,您可以在您的 android 应用程序中提取您的包名称。
    【解决方案2】:

    在 Mac 上:

    方式一:

    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
    

    【讨论】:

      【解决方案3】:

      您可以在 Android Studio 的 Build 菜单中使用 Analyze APK...,它会在新窗口的顶部显示包名称。

      【讨论】:

        【解决方案4】:

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

        apkanalyzer manifest application-id "${_path_to_apk}"
        

        【讨论】:

          【解决方案5】:

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

          【讨论】:

          • 这是 Mainactivity 类的 java 包名,可能与应用的包名不匹配。
          【解决方案6】:

          由于Android文档中提到AAPT已被弃用,因此在Linux中使用AAPT2命令获取包名如下:

          ./aapt2 dump packagename <path_to_apk>

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

          Download AAPT2 from Google Maven

          使用我的 sdk 中的构建工具 - 25.0.3、26.0.1 和 27.0.3,执行 aapt2 命令显示错误:无法打开“包名”:没有这样的文件或目录。这就是我选择更新版本的 AAPT2 的原因。

          我使用 3.3.0-5013011 for linux。

          【讨论】:

            【解决方案7】:

            以下 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 就足够了。
            【解决方案8】:

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

            【讨论】:

              【解决方案9】:

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

              【讨论】:

                【解决方案10】:

                对于 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=" &gt; temp.txt 获取包名称和其他一些详细信息,例如 apk 的版本等,并存储在与 apk 相同位置的 temp.txt 文件中。
                • FOR /F "tokens=2 delims='" %%s IN (temp.txt) DO SET pkgName=%%sextracts the package name and assigns topkgName` 变量
                • 终于%adb% shell monkey -p %pkgName% -c android.intent.category.LAUNCHER 1 启动了应用程序。

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

                【讨论】:

                  【解决方案11】:

                  程序化答案

                  如果您需要以编程方式执行此操作,则比仅将答案输入您的大脑更复杂一些。我有一个脚本,用于签署我们所有的应用程序,但每个应用程序都使用不同的密钥。这里有 2 种方法可以仅将包名称作为输出,这样您就可以将其放入变量中或使用它做任何您需要的事情。

                  示例输出: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}'
                  

                  此方法的一个缺点是它依赖于 aapt 仅在输出的 Android Manifest: 部分中输出 package=。我们没有来自开发者的承诺来维持这种格式。

                  解决方案 3

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

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

                  【讨论】:

                  • 感谢您提供更多信息以供理解,而不仅仅是提供一行命令进行复制。
                  【解决方案12】:

                  如果您的智能手机上已准备好您的 APK,有一个非常简单的方法。只需使用以下 APP 之一:

                  Package Name Viewer Apps

                  【讨论】:

                    【解决方案13】:

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

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

                    【讨论】:

                      【解决方案14】:

                      基于@hackbod 的回答...但与 windows 相关。

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

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

                      aapt dump badging &lt;path-to-apk&gt;

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

                      aapt dump badging &lt;path-to-apk&gt; | findstr -n "package: name" | findstr "1:"

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

                      【讨论】:

                        【解决方案15】:

                        要在批处理脚本中使用它,让脚本只返回包名称很方便(例如,当您拥有 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卸载`./getPackageName.sh file.apk`

                        【讨论】:

                          【解决方案16】:

                          如果您正在查看 google play 并想知道它的包名称,那么您可以查看 url 或地址栏。你会得到包名。这里com.landshark.yaum是包名

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

                          【讨论】:

                            【解决方案17】:

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

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

                            解释:

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

                            【讨论】:

                              【解决方案18】:

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

                              1. Appium website下载并安装Appium

                              2. 打开Appium->Android设置,选择目标apk文件。然后你会得到你想要的一切,包裹信息,活动信息。

                              【讨论】:

                                【解决方案19】:

                                你可以在你的模拟器上安装Package_Name_Viewer.apk,接下来你可以在你的模拟器上看到所有已安装应用的包名。

                                【讨论】:

                                  【解决方案20】:
                                  aapt dump badging <path-to-apk> | grep package:\ name
                                  

                                  【讨论】:

                                  • 有没有办法从 Android 代码中调用它?我希望能够启动我通过我的应用下载的 apk 包。
                                  • appt 转储标记 | grep 包:\ 名称
                                  • @Campiador 您可以一直输入到管道|,按回车键,然后在输出中搜索您想要的参数。请记住,aapt 需要在您的路径中
                                  • aapt 命令位于Android\SDK\build-tools\version 下。 on windows 命令可以是aapt dump badging &lt;path-to-apk&gt; | findstr -i "package: name"aapt dump badging &lt;path-to-apk&gt;
                                  • aapt 在 macOS 上位于 ~/Library/Android/sdk/build-tools/{version}
                                  【解决方案21】:

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

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

                                  【讨论】:

                                  • 包组名称在某些应用程序中只是巧合地与包名称相同。如果您使用aapt list -a,则确实需要在Android Manifest: 部分中使用A:package="com.example.appname"
                                  【解决方案22】:

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

                                  package manifest $xxx.xxxxxxx.xxxxxxx |
                                  

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

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

                                  【讨论】:

                                  • 如果应用程序的代码在 github 上,这将特别有用!比其他方法容易得多,谢谢!
                                  • 我解压了 APK,但 AndroidManifest.xml 是一个二进制文件。奇怪但真实。
                                  【解决方案23】:

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

                                  【讨论】:

                                    【解决方案24】:

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

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

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

                                    【讨论】:

                                    • 此外,您必须确保以提升的权限运行。基本上,在终端中,首先使用su 命令。
                                    • 搜索具体包名pm list packages -f | grep term-to-search-for
                                    猜你喜欢
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 2012-08-05
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    相关资源
                                    最近更新 更多