public void copyApksToRepo(List<String> appsToCopy) {
    for (final String packageName : appsToCopy) {
      final App app = apps.get(packageName);

      if (app.installedApk != null) {
        SanitizedFile outFile = new SanitizedFile(repoDir, app.installedApk.apkName);
        if (Utils.symlinkOrCopyFile(app.installedApk.installedFile, outFile)) continue;
      }
      // if we got here, something went wrong
      throw new IllegalStateException("Unable to copy APK");
    }
  }
  private String writeFdroidApkToWebroot() {
    ApplicationInfo appInfo;
    String fdroidClientURL = "https://f-droid.org/FDroid.apk";

    try {
      appInfo = pm.getApplicationInfo(fdroidPackageName, PackageManager.GET_META_DATA);
      SanitizedFile apkFile = SanitizedFile.knownSanitized(appInfo.publicSourceDir);
      SanitizedFile fdroidApkLink = new SanitizedFile(webRoot, "fdroid.client.apk");
      attemptToDelete(fdroidApkLink);
      if (Utils.symlinkOrCopyFile(apkFile, fdroidApkLink))
        fdroidClientURL = "/" + fdroidApkLink.getName();
    } catch (PackageManager.NameNotFoundException e) {
      Log.e(TAG, "Could not set up F-Droid apk in the webroot", e);
    }
    return fdroidClientURL;
  }
 private void symlinkFileElsewhere(String fileName, String symlinkPrefix, File directory) {
   SanitizedFile index = new SanitizedFile(directory, fileName);
   attemptToDelete(index);
   Utils.symlinkOrCopyFile(new SanitizedFile(new File(directory, symlinkPrefix), fileName), index);
 }