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

时间:2011-11-29 07:02:11

标签: android

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

5 个答案:

答案 0 :(得分:58)

很容易做到这一点..

  1. 首先,您将获得所有已安装的应用程序
  2. 对于每一个,获取公共源目录。
  3. 将文件复制到SD卡。
  4. 注意:无需扎根。

    这是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
    }
    

答案 1 :(得分:4)

通过一个简单的功能很容易找到并获得所有已安装的应用程序的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;
}

答案 2 :(得分:3)

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

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

答案 3 :(得分:0)

您可以为此目的使用 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。它具有更多功能。在此处附加源代码和应用程​​序的链接。看看他们。

View app on Google PlayStore

View Source Code on Github

答案 4 :(得分:0)

这是我知道的关于如何获取应用程序 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。