读取Android APK的包名

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

如何提取APK的包名?

211427 次浏览
aapt dump badging <path-to-apk> | grep package:\ name

在Android设备上安装apk。然后

你可以启动adb shell并执行pm list packages -f,它会显示每个安装的apk的包名。

这是从 找到包名称为Android应用程序使用意图启动市场应用程序从网络 . < / p >

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

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

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

如果你使用MS Notepad打开AndroidManifest.xml,搜索短语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

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

< p > <代码> aapt list -a $PATH_TO_YOUR_APK | sed -n "/^包组[^s]/s/.*name=//p" < /代码> < / p >

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

程序性的回答

如果你需要用编程的方式来做这件事,这比把答案输入你的大脑要复杂一些。我有一个脚本,我用来签署我们所有的应用程序,但每个使用不同的密钥。这里有两种获取只需要包名作为输出的方法,这样你就可以把它放在一个变量中,或者对它做任何你需要的事情。

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

需求

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

解决方案1

使用awk指定'作为字段分隔符,搜索带有package: name=的行,并只打印该行中的第二个“字段”:

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

这种方法的一个缺点是它依赖于apapt以相同的顺序输出包信息字段:

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}'

此方法的一个缺点是它只依赖于在输出的Android Manifest:部分中输出package=。我们没有从开发人员那里得到维持这种格式的承诺。

解决方案3

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

这将是最好的方法,但AndroidManifest.xml是一个二进制文件,我看到的所有SO答案转换为文本不工作。(使用apktool d而不是简单的unzip应该为你做到这一点,但它没有。

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

  1. Appium网站 . io/" rel="nofollow">Appium网站 . io

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

我认为在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.]*)'.*并替换为第一个(也是唯一一个)匹配组。

要在批处理脚本中使用它,让脚本只返回包名是很方便的(例如,当你有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`

根据@hackbod的回答…但与窗户有关。

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

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

aapt dump badging <path-to-apk>

如果你只想看到带有package: name信息的行,使用findstr

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

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

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

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

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

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

Package Name Viewer Apps .

对于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_install \”。
  • 如果连接了设备,命令%adb% install %apk%将安装应用程序。
  • %aapt% dump badging %APKFullPath% | FIND "package: name=" > temp.txt获取apk的包名和其他一些细节,如版本等,并存储在与apk相同位置的temp.txt文件中。
  • FOR /F "token =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_install \”中的给定位置安装到设备并启动应用程序。

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

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

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

./aapt2 dump packagename <path_to_apk>

因为我使用的是旧版本的Gradle构建,所以我不得不下载一个更新版本的AAPT2,就像这里提到的:

从谷歌Maven下载AAPT2

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

对于linux,我使用3.3.0-5013011。

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

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

apkanalyzer manifest application-id "${_path_to_apk}"

你可以在Android Studio的Build菜单中使用Analyze 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

你可以通过以下方式获取包名:

packageManager.getPackageArchiveInfo(apkFilePath, 0)?.packageName