我需要得到一个Android APK的包名。我已经尝试解压缩APK和读取AndroidManifest.xml文件的内容,但它似乎不是一个文本文件。
如何提取APK的包名?
我需要得到一个Android APK的包名。我已经尝试解压缩APK和读取AndroidManifest.xml文件的内容,但它似乎不是一个文本文件。
如何提取APK的包名?
当前回答
另一个解决方案是使用aapt列表,并使用sed来解析它:
aapt list -a $PATH_TO_YOUR_APK | sed -n "/^包组[^s]/s/.*name=//p"
其他回答
在Android设备上安装apk。然后
您可以启动adb shell并执行PM list packages -f,这将显示每个已安装apk的包名称。
这是从 找到包名称为Android应用程序使用意图启动市场应用程序从网络。
根据@hackbod的回答…但与窗户有关。
aapt命令位于Android\SDK\build-tools\version。 如果你需要更多关于什么是appt命令(Android资产打包工具)的信息,请阅读https://stackoverflow.com/a/28234956/812915
aapt的dump子命令用于显示包中各个元素或部分的值:
apt转储标记<path-to-apk>
如果只希望看到package: name info这一行,请使用findstr
apt dump badging <path-to-apk> | findstr -n "package: name" | findstr "1:"
希望对其他windows用户有所帮助!
程序性的回答
如果你需要用编程的方式来做这件事,这比把答案输入你的大脑要复杂一些。我有一个脚本,我用来签署我们所有的应用程序,但每个使用不同的密钥。这里有两种方法来获得包名作为输出,这样你就可以把它放在一个变量中或做任何你需要的事情。
示例输出:com.example.appname(仅此而已)
需求
aapt - Android资产打包工具,部分SDK工具下载
解决方案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:部分依赖apapt to output package=。我们没有从开发人员那里得到维持这种格式的承诺。
解决方案3
用apktool d展开apk文件,读取AndroidManifest.xml。
这将是最好的方法,但AndroidManifest.xml是一个二进制文件,我看到的所有SO答案转换为文本不工作。(使用apktool d而不是简单的解压缩应该为你做到这一点,但它没有。)请评论,如果你有解决这个问题的办法
你可以在模拟器上安装Package_Name_Viewer.apk,接下来你可以在模拟器上看到所有已安装应用程序的包名。
如果你没有安装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上工作。