private void recordMetrics() { long metricsStartTime = System.nanoTime(); GradleBuildProjectMetrics.Builder metrics = GradleBuildProjectMetrics.newBuilder(); Long apkSize = getSize(getOutputFile()); if (apkSize != null) { metrics.setApkSize(apkSize); } Long resourcesApSize = getSize(getResourceFile()); if (resourcesApSize != null) { metrics.setResourcesApSize(resourcesApSize); } metrics.setMetricsTimeNs(System.nanoTime() - metricsStartTime); ProcessProfileWriter.getProject(getProject().getPath()).setMetrics(metrics); }
@InputFiles public FileTree getNativeLibraries() { FileTree src = null; Set<File> folders = getJniFolders(); if (!folders.isEmpty()) { src = getProject().files(new ArrayList<Object>(folders)).getAsFileTree(); } return src == null ? getProject().files().getAsFileTree() : src; }
@Override protected void doFullTaskAction() { try { final File dir = getJavaResourceDir(); getBuilder().packageApk(getResourceFile().getAbsolutePath(), getDexFolder(), getDexedLibraries(), getPackagedJars(), (dir == null ? null : dir.getAbsolutePath()), getJniFolders(), getMergingFolder(), getAbiFilters(), getJniDebugBuild(), getSigningConfig(), getPackagingOptions(), getOutputFile().getAbsolutePath()); } catch (DuplicateFileException e) { Logger logger = getLogger(); logger.error("Error: duplicate files during packaging of APK " + getOutputFile() .getAbsolutePath()); logger.error("\tPath in archive: " + e.getArchivePath()); logger.error("\tOrigin 1: " + e.getFile1()); logger.error("\tOrigin 2: " + e.getFile2()); logger.error("You can ignore those files in your build.gradle:"); logger.error("\tandroid {"); logger.error("\t packagingOptions {"); logger.error("\t exclude \'" + e.getArchivePath() + "\'"); logger.error("\t }"); logger.error("\t}"); throw new BuildException(e.getMessage(), e); } catch (Exception e) { throw new BuildException(e.getMessage(), e); } }
@Override public void execute(@NonNull final PackageApplication packageApplication) { packageApplication.setOutputFile(mOutputFile); super.execute(packageApplication); packageApplication.instantRunFileType = FileType.RESOURCES; // Don't try to add any special dex files to this zip. packageApplication.dexPackagingPolicy = DexPackagingPolicy.STANDARD; // Skip files which are not needed for hot/cold swap. for (String prop : ImmutableList.of("dexFolders", "jniFolders", "javaResourceFiles")) { ConventionMappingHelper.map( packageApplication, prop, Collections::<File>emptySet); } // Don't sign. packageApplication.setSigningConfig(null); } }
packageApp.setAndroidBuilder(scope.getGlobalScope().getAndroidBuilder()); packageApp.setMergingFolder(new File(scope.getGlobalScope().getIntermediatesDir(), variantOutputData.getFullName() + "/merging")); packageApp.setSigningConfig(sc); if (sc != null) { String validateSigningTaskName = "validate" + StringHelper.capitalize(sc.getName()) + "Signing"; packageApp.dependsOn(validateSigningTask);
@Override public File get() { return getOutputFile(); }
@Override public void setOutputFile(@NonNull File file) { if (zipAlignTask != null) { zipAlignTask.setOutputFile(file); } else { packageApplicationTask.setOutputFile(file); } }
@Nullable @Override public File getOutputFile() { if (zipAlignTask != null) { return zipAlignTask.getOutputFile(); } return packageApplicationTask == null ? null : packageApplicationTask.getOutputFile(); }
@Override public File call() throws Exception { // wire to the output of the package task. PackageApplication packageApplicationTask = ((ApkVariantOutputData) scope .getVariantOutputData()).packageApplicationTask; return packageApplicationTask == null ? scope.getPackageApk() : packageApplicationTask.getOutputFile(); } });