如何以编程方式获取 apk 文件名和路径?

Posted

技术标签:

【中文标题】如何以编程方式获取 apk 文件名和路径?【英文标题】:How can i get the apk file name and path programmatically? 【发布时间】:2013-06-03 02:52:53 【问题描述】:

如果我已经知道目标 apk 的包名,我想获取程序的确切文件名。例如,如果我知道我的 apk 的包名称,即 com.packagename,我如何才能获得该包的确切路径和文件名?顺便说一句,我不想​​只获得我的 apk 位置,我想要我申请的任何包名称的位置。 SystemTuner pro 能够做到这一点,所以我知道这是可能的,只是不确定如何。

谢谢大家!

【问题讨论】:

【参考方案1】:

PackageManager.getPackageInfo() 返回有关包的信息,PackageInfo.applicationInfo 字段包含有关应用程序的必需信息。

【讨论】:

请注意,在最近或未来的 android 版本中,其他第三方应用可能无法再访问如此发现的目标 apk 文件。 为什么会这样?【参考方案2】:

好吧,我想将 Yuri 标记为答案,但我已经知道这些内容。所以我从PackageManager.ApplicationInfo 中检查了每一个选项,发现.publicSourceDir

所以我的问题的完整答案是代码

PackageManager pm = getPackageManager();
    try 
        ApplicationInfo ai = pInfo.getApplicationInfo(<packageName here>, 0);
        String sourceApk = ai.publicSourceDir;
     catch (NameNotFoundException e) 
        // TODO Auto-generated catch block
        e.printStackTrace();
    

所以再次感谢大家,让我的大脑再次开始爱 ***!

【讨论】:

如果你“已经知道这些东西”,你可能会在你的问题中这么说,并得到一个更具体的你不知道的答案。 Seith,您询问了程序的确切文件名,以及包的确切路径和文件名。考虑到这一点,ApplicationInfo 是我能想到的最佳答案,我不能更准确:) @Yuri 您的回答确实有帮助!我会选择你的答案,就好像它不是你的答案一样,我不会回到那个班级。我浏览得太快而错过了它:P 我正在寻找诸如“目录”或“getDir”之类的东西,但我错过了“publicSourceDir”,所以再次感谢! 谢谢赛斯!我只是试图解释为什么我没有深入了解 ApplicationInfo 的细节,那里没有抱怨。我非常感谢您选择我的答案。 根据 ApplicationInfo 源中的 JavaDoc - 您想要 'sourceDir' 而不是 'publicSourceDir'(sourceDir 注释说“此应用程序的基本 APK 的完整路径。”)【参考方案3】:
/**
 * Get the apk path of this application.
 * @param context any context (e.g. an Activity or a Service)
 * @return full apk file path, or null if an exception happened (it should not happen)
 */
public static String getApkName(Context context) 
    String packageName = context.getPackageName();
    PackageManager pm = context.getPackageManager();
    try 
        ApplicationInfo ai = pm.getApplicationInfo(packageName, 0);
        String apk = ai.publicSourceDir;
        return apk;
     catch (Throwable x) 
    
    return null;

编辑 在这种情况下为catch (Throwable x)辩护。起初,现在众所周知的是Checked Exceptions are Evil。其次,您无法预测未来版本的 Android 会发生什么。已经有一种趋势将检查的异常包装到运行时异常中并重新抛出它们。 (并且有一种趋势是做一些过去无法想象的愚蠢事情。)对于 Error 的孩子,如果包管理器找不到正在运行的 apk,那就是引发 Errors 的那种问题。可能最后几行可能是

     catch (Throwable x) 
        return null;
    

但我不会在未测试的情况下更改工作代码。

【讨论】:

伙计们,我看到这个被否决了。它仍然适用于现代 Android 吗? 它确实可以在较新的设备上运行(在 Android X 模拟器上尝试过并且可以正常工作)。不过,我认为在Throwable 那里不太好。不建议使用(仅在极少数情况下,我会说)。我会按照 getApplicationInfo 的要求将PackageManager.NameNotFoundException 放在那里(这可能是您看到的反对票的原因吗?)。除此之外它是完美的。谢谢。【参考方案4】:

在上面的答案中需要将 pInfo 更改为 pm

喜欢这个

PackageManager pm = getPackageManager();
try 
    ApplicationInfo ai = pm.getApplicationInfo(<packageName here>, 0);
    String sourceApk = ai.publicSourceDir;
 catch (NameNotFoundException e) 
    // TODO Auto-generated catch block
    e.printStackTrace();

Seth的这个回答

【讨论】:

以上是关于如何以编程方式获取 apk 文件名和路径?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 中以编程方式反编译 dex 文件?

如何以编程方式获取资源目录路径

如何在 Android 设备中获取文件 *.apk 位置

如何在 Android 10 中以编程方式安装任何 Android 应用

编写单元测试:如何以编程方式获取包含测试文件的文件夹

在java中以编程方式编辑apk文件