我需要得到一个Android APK的包名。我已经尝试解压缩APK和读取AndroidManifest.xml文件的内容,但它似乎不是一个文本文件。
如何提取APK的包名?
我需要得到一个Android APK的包名。我已经尝试解压缩APK和读取AndroidManifest.xml文件的内容,但它似乎不是一个文本文件。
如何提取APK的包名?
当前回答
你可以从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}'
当然,您可以使用任何其他工具来进行筛选。
其他回答
由于在Android文档中提到AAPT已被弃用,在Linux中使用AAPT2命令获取包名如下:
./aapt2 dump packagename <path_to_apk> ./aapt2 dump
因为我使用的是旧版本的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上工作。
我认为在Linux中只提取包名的最好和最简单的方法是
aapt dump badging <APK_path> | grep package | sed -r "s/package: name='([a-z0-9.]*)'.*/\1/"
解释:
AAPT提取APK信息 Grep“package”只保留一行关于包的信息 让sed只使用以下正则表达式将整行替换为包名:package: name='([a-z0-9.]*)'。*并替换为第一个(也是唯一一个)匹配组。
另一个解决方案是使用aapt列表,并使用sed来解析它:
aapt list -a $PATH_TO_YOUR_APK | sed -n "/^包组[^s]/s/.*name=//p"
如果你正在看谷歌播放,想知道它的包名,那么你可以看看url或地址栏。您将得到包名称。这里com.landshark.yaum是包名
https://play.google.com/store/apps/details?id=com.landshark.yaum&feature=search_result#?t=W251bGwsMSwyLDEsImNvbS5sYW5kc2hhcmsueWF1bSJd