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

如何提取APK的包名?


当前回答

下面的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

其他回答

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

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

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

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

如果你想读取应用中典型APK文件的包名,有一个简单的方法来分析PackageInfo:

fun getAPKPackageName(apkFile: File?): String? {
        if (apkFile == null || !apkFile.isFile || !apkFile.exists()) return null
        val apkFilePath = apkFile.absolutePath
        if (apkFilePath.isNullOrEmpty()) return null
        val packageManager = App.context.packageManager ?: return null
        val packageInfo = packageManager.getPackageArchiveInfo(apkFilePath, 0) ?: return null
        return packageInfo.packageName
    }

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

packageManager.getPackageArchiveInfo(apkFilePath, 0)?.packageName

在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