繁体   English   中英

如何以编程方式获取应用程序的 .apk 文件

[英]How to get the .apk file of an application programmatically

我想创建一个具有以下功能的应用程序。 它应该将其.apk文件保存到sdcard 想象一下我有一个Button 单击它时,我必须保存应用程序的.apk文件。

这样做很容易..

  1. 首先你得到所有已安装的应用程序,
  2. 对于每一个,获取公共源目录。
  3. 将文件复制到 SDCard。

注意:无需root。

这里是snippt代码:

final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
List<ResolveInfo> apps = getPackageManager().queryIntentActivities(mainIntent, 0);
for (ResolveInfo info : apps) {
    File file = new File(info.activityInfo.applicationInfo.publicSourceDir);
    // Copy the .apk file to wherever
}

通过一个简单的功能,很容易找到并获取所有已安装应用程序的 apk 文件。 下面我写了一个方法,它返回一个 HashMap 对象,该对象包含所有已安装的 apk 文件的绝对路径及其相应的包名。我希望它对您非常有用。

private HashMap<String, String> getAllInstalledApkFiles(Context context) {
        HashMap<String, String> installedApkFilePaths = new HashMap<>();

        PackageManager packageManager = context.getPackageManager();
        List<PackageInfo> packageInfoList = packageManager.getInstalledPackages(PackageManager.SIGNATURE_MATCH);

        if (isValid(packageInfoList)) {
            for (PackageInfo packageInfo : packageInfoList) {
                ApplicationInfo applicationInfo;

                try {
                    applicationInfo = getApplicationInfoFrom(packageManager, packageInfo);

                    String packageName = applicationInfo.packageName;
                    String versionName = packageInfo.versionName;
                    int versionCode = packageInfo.versionCode;

                    File apkFile = new File(applicationInfo.publicSourceDir);
                    if (apkFile.exists()) {
                        installedApkFilePaths.put(packageName, apkFile.getAbsolutePath());
                        LogHelper.d(getClass(), packageName + " = " + apkFile.getName());
                    }
                } catch (PackageManager.NameNotFoundException error) {
                    error.printStackTrace();
                }
            }
        }

        return installedApkFilePaths;
    }

private boolean isValid(List<PackageInfo> packageInfos) {
        return packageInfos != null && !packageInfos.isEmpty();
    }

现在您调用以下方法来获取特定包名称的 apk 文件:

public File getApkFile(Context context, String packageName) {
        HashMap<String, String> installedApkFilePaths = getAllInstalledApkFiles(context);
        File apkFile = new File(installedApkFilePaths.get(packageName));
        if (apkFile.exists()) {
            return apkFile;
        }

        return null;
    }

getApplicationInfoFrom方法:

private ApplicationInfo getApplicationInfoFrom(PackageManager packageManager, PackageInfo packageInfo) {
    return packageInfo.applicationInfo;
}

我不知道官方的方式。 但是,似乎 APK 存储在/data/app ,文件your.package.name-#.apk ,其中your.package.name是您的包名称(例如com.google.earth ), #通常为 1或 2,但我想它可以上升更多。 除非您的设备已 root,否则您无权列出/data/app中的文件,但您应该拥有对实际文件的读取权限。 您可以尝试将该文件(从 1 开始并递增直到找到)复制到 SD 卡。

或者,如果您可以访问互联网,则可以将 APK 存储在某个 Web 位置并直接将其下载到 SD 卡。

为此,您可以使用PackageManager 和 ApplicationInfo类。

List<ApplicationInfo> packagelist = new ArrayList<>();
File file;
PackageManager packageManager = getPackageManager();
packagelist = packageManager.getInstalledApplications(PackageManager.GET_META_DATA);
if (packagelist.size() > 0) {
        for (int i = 0; i < packagelist.size(); i++) {
            file = new File(packagelist.get(i).publicSourceDir);
   }

这就是您如何获取每个 apk 的 publicSourceDir。 然后您可以将该 apk 复制到特定文件夹中。 在这种情况下不需要 ROOT。

我创建了一个类似的应用程序来从系统和已安装的应用程序中提取 apk。 它还有更多的功能。 在此附上源代码和应用程​​序的链接。 看看他们。

在 Google PlayStore 上查看应用

在 Github 上查看源代码

这是我所知道的有关如何获取应用程序 apk 文件路径的最简单方法:

String classname = "com.mycompany.app.MyActivity";
String apkPath = activity.getApplication().getPackageManager().getApplicationInfo(classname, 0).sourceDir

classname 是您的应用程序 Activity 或 AppCompatActivity 类的名称。

此调用将返回如下内容:

/data/app/com.mycompany.app.MyActivity-89lzYNI0vTAV056RT-WHBw==/base.apk

您将能够读取该文件,但由于其受保护,您将无法写入。 当然,base.apk 是一个 jar。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM