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

18

程序化获取 Android 设备中的 *.apk 文件名需要帮助吗?是否有任何 Android 方法可以提供此功能,或者在 Android 下运行的 shell 命令可以获取文件位置,如果我只知道文件名的一部分?

另外,如果有一种方法可以找出从市场或市场外下载后 *.apk 文件的位置在哪里?

预先感谢您。


你为什么需要这些信息? - Dave
也许如果我们知道你想要做什么,那么回答这个问题会更有帮助(因为我们会更清楚需要考虑什么)。 - jcuenod
尝试一下这个链接: https://dev59.com/9lvUa4cB1Zd3GeqPw8g3 - Prashant09
5个回答

35

List<ApplicationInfo> PackageManager.getInstalledApplications()将提供已安装应用程序的列表,ApplicationInfo.sourceDir是.apk文件的路径。

PackageManager pm = getPackageManager();

for (ApplicationInfo app : pm.getInstalledApplications(0)) {
  Log.d("PackageList", "package: " + app.packageName + ", sourceDir: " + app.sourceDir);
}

输出类似于这样:

package: com.tmobile.themechooser, sourceDir: /system/app/ThemeChooser.apk
package: com.tmobile.thememanager, sourceDir: /system/app/ThemeManager.apk
package: com.touchtype.swiftkey, sourceDir: /data/app/com.touchtype.swiftkey-1.apk
package: com.twitter.android, sourceDir: /data/app/com.twitter.android-2.apk
package: fm.last.android, sourceDir: /data/app/fm.last.android-1.apk

3
“sourceDir”和“publicSourceDir”有什么区别?另外,你知道为什么一些.apk文件的名称中会带有“-1”或“-2”吗? - Tony Chan
@Turbo 我认为原因是:第一次安装时为-1,未安装时为-2。如果您第一次安装一个应用程序,则会出现-1,如果是第二个、第三个等,则会出现-2。如果您第一次安装该应用程序,然后卸载它,再次安装,则会出现-1。 - Ivan
我拿了@therefromhere发布的代码,放进了一个小应用,并且为它构建了一个apk,以便任何人都可以在不同的设备上重复使用这个代码。 - zabawaba99

18
$ adb shell pm list packages -f

1
这似乎更像是一种Linux的方式,而不是编程的方式。 - Santosh Kumar
谢谢,这些帮助我检测当前安装目录以备份我的apk文件。 - Walid Ammar

3

2

您也可以执行adb bugreport并查看输出。您需要查找<package name="com.app.package" codePath="path/to/the/app.apk"...


0

你下载的应用程序会存储在/data/app目录下,因此可以使用ls命令获取已下载apk文件的列表。


谢谢j3frea。这是Android市场应用程序的默认位置。我发现,如果我从外部下载应用程序(在我的情况下是从我的服务器),该应用程序将进入sdcard / download。我可以假设外部apk将始终转到sdcard / download吗?这是每个Android市场应用程序的默认位置,还是该路径可以更改并且不是固定的?是否有一种方法可以始终将下载应用程序推送到一个位置?此外,是否有一种按名称在整个设备中查找文件的方法? - asteroidg
1
File dir = new File("/data/app"); File[] fileList = dir.listFiles();if (fileList != null) { for ( int i = 0;i - asteroidg
3
请勿对API中未明确列出的目录进行任何假设。它们可能会在不经通知的情况下发生更改。任何类似于“sdcard/下载”这样的假设都有可能在某些时候发生破坏。如果需要,请使用API返回的目录,不要使用硬编码路径。并且请记住,Android Market并不是下载应用程序的唯一途径。 - EboMike
嗨,EboMike。我不想做任何假设,但我需要解决我的问题,我非常惊讶我找不到任何API来帮助我。是否有任何API可以从整个设备中获取*.apk文件名?或者甚至是它们可以存储的路径,这些路径与操作系统一起构建?谢谢。 - asteroidg
我认为我们需要知道你在尝试做什么,才能帮助解决你的问题。 - jcuenod
APK 是一个包含应用程序的软件包,因此当您不使用应用商店下载时,它只是一个普通文件,下载到默认位置 - /sdcard/download。用户可以移动此文件或更改目录。一旦应用程序安装完成(通过使用安装程序打开 apk),它就不再是 APK 了 - 因此,简而言之,您无法保证会找到该应用程序的 apk(尝试下载一个应用程序,安装它,然后删除 apk)。 - Basic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接