通过ADB获取程序包名称和应用的通用名称


15

我在寻找一个可能性检索两种,包名称安装通过ADB在Android设备上的应用程序的通用名称-如果包名已知或者至少检索的通用名称。在我们的网站上进行的快速搜索提出了两个相关问题,但它们不能解决我的问题:

我正在寻找一种直接从设备中检索信息的方法(如果可能的话),而不是“任何”方法(包括“网络查找”或“通过应用程序”),因为这两个问题都有。

我知道有多种工具可用于获取软件包详细信息:

  • adb dumpsys package:虽然此列表列出了所有软件包并提供了许多详细信息,但未显示“通用名称”
  • adb shell pm list:仅给出软件包名称
  • aapt能够获得通用名称,但需要先从设备中拉出.apk文件,这并不真正方便(显然,在安装了许多和/或大型应用程序后,速度将非常慢)

我错过了什么?我知道信息必须在设备上(它还如何在GUI中显示应用程序名称?我怀疑.apk每次GUI需要“通用名称”时Android都会解析文件)。那么有没有办法直接使用ADB来掌握它呢?


TL; DR

背景知识(如果有人感到好奇):我希望能够从我的任何设备中快速获取用户应用程序列表,而不必恢复杂技。我可以使用来检索其软件包名称的列表adb shell pm list -3,但由于它们仅是软件包名称,因此识别应用程序是一种猜测。因此,如果有一些ADB命令检索给定软件包名称的通用名称,我可以简单地使用类似for pkg in $(adb shell pm list -3); do echo "- $(adb <whatever_the_command_is> $pkg) ($pkg)"; done– 的循环,并以“人类可读的格式”获取所有已安装用户应用程序的列表以及它们的软件包名称。

用例:

  • 查看安装了哪些“ superflous”应用程序(可以将其删除)
  • 交叉检查来自多个设备的列表
  • 文档;)
  • 可能还有更多(但是以上三个是我需要的)

只是一个想法(我想您已经尝试了?)。为什么您不编译适用于android的aapt而是从shell运行呢?:D
user3344236

1
@ user3344236我知道这种可能性;但并非总是可以选择将某些东西安装到有问题的设备上,特别是不是自编译的二进制文件(我有时会得到没有根目录的上交设备,并且必须保持“类似取证的条件” –即“无需更改设备,只需对其进行探索”)。
伊兹

因此,第二个主意是为自己编写一个可通过adb shell运行的工具...而无需在设备上使用经过修改的adbd,也无需在此处推送某些文件。我认为这将需要您花费一些时间来完成此操作(如果您成功的话):D
user3344236 2015年

@ user3344236太令人担忧,尤其是因为我不是Android开发人员。我目前使用的是“基于网络的解决方案”(类似于“ Google Play查找”),因为此处似乎还没有本机解决方案(还好吗?)。
伊兹

嗨Izzy!考虑到上面的评论,是否意味着您需要一个考虑到非root用户设备的解决方案?
Firelord

Answers:


8

这不是最终的答案,因为它不是通用的(仅适用于某些设备),但至少是一个开始:

我们所知,至少带有Kitkat(Android 4.4)及更高版本的基于CM的ROM附带aapt/system/bin1中可用的二进制文件。如果您的ROM没有它,可以选择在设备上安装二进制文件,您可以在这里找到它

使用aapt,可以使用检索应用名称

aapt d badging <path to apk> | grep "application: label" |awk '{print $2}'

输出将类似于label='Funny App',然后您可以轻松地为应用名称解析,例如

aapt d badging <path to apk> | grep 'application: label' | sed -n \"s/.*label\='\([^']*\)'.*/\1/p\"

(如果应用程序名称包含单引号,则不好,但这可能算作化妆品-或您想出如何改进sed部分来解决该问题)。


1:我们在经过检查的奇巧和以上库存ROM中找不到此存储器,因此它可能仅是基于CM的ROM


3
读者注意:您无需具有root用户的设备即可使用该aapt二进制文件。您可以很好地aapt在PC中下载二进制文件并将其重命名为,在二进制文件上设置Linux兼容的可执行权限并将其推送到/data/local/tmp,然后/data/local/tmp/aapt在这些命令中使用绝对路径来使用二进制文件。
Firelord

因此,对于软件包的名称(原始问题的第一部分),您可以这样做aapt d badging <path to apk> | grep 'package: name' | awk '{print $2}'
gmoz22 '19

8

这是我针对无根手机的解决方案,需要从上面进行一些细微更改,然后在运行Android 5.0.2的Moto G第二代手机上运行。

我在/ system / bin中没有aapt二进制文件,因此我首先尝试从以下位置下载:https ://android.izzysoft.de/downloads

但是当我尝试运行它时,我收到一条错误消息:

错误:仅支持独立于位置的可执行文件(PIE)。

所以然后我搜索了一个PIE版本并发现:https : //github.com/Calsign/APDE/blob/master/APDE/src/main/assets/aapt-binaries/aapt-arm-pie

这可以通过将二进制文件复制到/ data / local / tmp来实现:

adb push aapt-arm-pie /data/local/tmp
adb shell chmod 0755 /data/local/tmp/aapt-arm-pie

因此:

adb shell pm list packages -3 -f

获取第三方应用程序(已安装的应用程序,而非系统应用程序)的列表,然后您可以使用上述命令中的程序包来获得有关程序包的信息-例如:

adb shell /data/local/tmp/aapt-arm-pie d badging /data/app/com.facebook.katana-3/base.apk

所以下面是用于Linux客户端的脚本(仅用于Linux客户端):

for pkg in `adb shell pm list packages -3 -f | awk -F= '{sub("package:","");print $1}'`
do
  adb shell /data/local/tmp/aapt-arm-pie d badging $pkg | awk -F: '
      $1 == "application-label" {print $2}'
done

如果您也想要软件包和版本,则最后更改,但只更改一行:

$1 == "application-label" {print $2}'

至:

$1 == "package" { split($2,space," ")
name=space[1];version=space[3]}
$1 == "application-label" {print name, version, $2 }'

输出示例:

name='com.ultimarom.launchnavigation' versionName='1.28' 'Navigation' name='com.enhanced.skineditorstudio' versionName='3.3' 'Custom Skin Creator' name='com.mojang.minecraftpe' versionName='1.2.6.60' 'Minecraft' name='org.videolan.vlc' versionName='2.5.13' 'VLC' name='com.jrustonapps.myauroraforecast' versionName='1.7.2' 'My Aurora Forecast' name='de.j4velin.wifiAutoOff' versionName='1.7.6' 'WiFi Automatic' name='com.facebook.katana' versionName='153.0.0.54.88' 'Facebook' name='com.metago.astro' versionName='6.0.5' 'ASTRO File Manager' name='za.co.hardrive.smartinfo.parkrun' versionName='2.0.2' 'My 5krun' name='com.PYOPYO.StarTrackerVR' versionName='1.0.1' 'StarTracker VR' name='cz.aponia.bor3.offlinemaps' versionName='1.1.19' 'Offline Maps' name='com.groupon' versionName='16.11.63973' 'Groupon' name='com.ebay.mobile' versionName='5.16.1.2' 'eBay' name='com.runtastic.android' versionName='8.1.1' 'Runtastic' name='com.google.android.diskusage' versionName='3.8.3' 'DiskUsage'

麦克风


非常感谢,两次,Mike:一次用于shell脚本,第二次用于ARM变量的指针aapt!会在时间允许的情况下尽快检查(目前有点急)。目前已投票,经过验证可被接受:)
Izzy

PS:我的下载页面现在还链接到您指定的源-只是“一级升级”,因此人们可以在ARM和x86构建之间进行选择。
伊齐
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.