Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance. Project price only 1 $
You can buy this project and download/modify it how often you want.
/*
* Copyright (C) 2009 Jayway AB
* Copyright (C) 2007-2008 JVending Masa
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.jayway.maven.plugins.android.phase09package;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.model.Resource;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.codehaus.plexus.archiver.ArchiverException;
import org.codehaus.plexus.archiver.jar.JarArchiver;
import org.codehaus.plexus.archiver.util.DefaultFileSet;
import com.jayway.maven.plugins.android.AbstractAndroidMojo;
import com.jayway.maven.plugins.android.CommandExecutor;
import com.jayway.maven.plugins.android.ExecutionException;
import static com.jayway.maven.plugins.android.common.AndroidExtension.APKLIB;
/**
* Creates the apklib file.
* apklib files do not generate deployable artifacts.
*
* @author [email protected]
* @goal apklib
* @phase package
* @requiresDependencyResolution compile
*/
public class ApklibMojo extends AbstractAndroidMojo {
public void execute() throws MojoExecutionException, MojoFailureException {
generateIntermediateAp_();
CommandExecutor executor = CommandExecutor.Factory.createDefaultCommmandExecutor();
executor.setLogger(this.getLog());
File outputFile = createApkLibraryFile();
// Set the generated .apklib file as the main artifact (because the pom states apklib)
project.getArtifact().setFile(outputFile);
}
protected File createApkLibraryFile() throws MojoExecutionException {
final File apklibrary = new File(project.getBuild().getDirectory(), project.getBuild().getFinalName() + "." + APKLIB);
FileUtils.deleteQuietly(apklibrary);
try {
JarArchiver jarArchiver = new JarArchiver();
jarArchiver.setDestFile(apklibrary);
jarArchiver.addFile(androidManifestFile, "AndroidManifest.xml");
addDirectory(jarArchiver, assetsDirectory, "assets");
addDirectory(jarArchiver, resourceDirectory, "res");
addDirectory(jarArchiver, sourceDirectory, "src");
addJavaResources(jarArchiver, project.getBuild().getResources(), "src");
// Lastly, add any native libraries
addNativeLibraries(jarArchiver);
jarArchiver.createArchive();
} catch (ArchiverException e) {
throw new MojoExecutionException("ArchiverException while creating ."+APKLIB+" file.", e);
} catch (IOException e) {
throw new MojoExecutionException("IOException while creating ."+APKLIB+" file.", e);
}
return apklibrary;
}
private void addNativeLibraries(final JarArchiver jarArchiver) throws MojoExecutionException {
try {
addDirectory(jarArchiver, nativeLibrariesDirectory, "libs");
} catch (ArchiverException e) {
throw new MojoExecutionException("IOException while creating ."+APKLIB+" file.", e);
}
// TODO: Next is to check for any:
// TODO: - compiled in (as part of this build) libs
// TODO: - That is of course easy if the artifact is indeed attached
// TODO: - If not attached, it gets a little trickier - check the target dir for any compiled .so files (generated by NDK mojo)
// TODO: - But where is that directory configured?
}
protected void addJavaResources(JarArchiver jarArchiver, List javaResources, String prefix) throws ArchiverException, IOException {
for (Resource javaResource : javaResources) {
addJavaResource(jarArchiver, javaResource, prefix);
}
}
/**
* Adds a Java Resources directory (typically "src/main/resources") to a {@link JarArchiver}.
*
* @param jarArchiver
* @param javaResource The Java resource to add.
* @param prefix An optional prefix for where in the Jar file the directory's contents should go.
* @throws ArchiverException
* @throws java.io.IOException in case the resource path can not be resolved
*/
protected void addJavaResource(JarArchiver jarArchiver, Resource javaResource, String prefix) throws ArchiverException, IOException {
if (javaResource != null) {
final File javaResourceDirectory = new File(javaResource.getDirectory());
if (javaResourceDirectory.exists()) {
final String resourcePath = javaResourceDirectory.getCanonicalPath();
final String apkLibUnpackBasePath = unpackedApkLibsDirectory.getCanonicalPath();
// Don't include our dependencies' resource dirs.
if (!resourcePath.startsWith(apkLibUnpackBasePath)) {
final DefaultFileSet javaResourceFileSet = new DefaultFileSet();
javaResourceFileSet.setDirectory(javaResourceDirectory);
javaResourceFileSet.setPrefix(endWithSlash(prefix));
jarArchiver.addFileSet(javaResourceFileSet);
}
}
}
}
/**
* Makes sure the string ends with "/"
*
* @param prefix any string, or null.
* @return the prefix with a "/" at the end, never null.
*/
protected String endWithSlash(String prefix) {
prefix = StringUtils.defaultIfEmpty(prefix, "/");
if (!prefix.endsWith("/")) {
prefix = prefix + "/";
}
return prefix;
}
/**
* Adds a directory to a {@link JarArchiver} with a directory prefix.
*
* @param jarArchiver
* @param directory The directory to add.
* @param prefix An optional prefix for where in the Jar file the directory's contents should go.
* @throws ArchiverException
*/
protected void addDirectory(JarArchiver jarArchiver, File directory, String prefix) throws ArchiverException {
if (directory != null && directory.exists()) {
final DefaultFileSet fileSet = new DefaultFileSet();
fileSet.setPrefix(endWithSlash(prefix));
fileSet.setDirectory(directory);
jarArchiver.addFileSet(fileSet);
}
}
/**
* Generates an intermediate apk file (actually .ap_) containing the resources and assets.
*
* @throws MojoExecutionException
*/
private void generateIntermediateAp_() throws MojoExecutionException {
CommandExecutor executor = CommandExecutor.Factory.createDefaultCommmandExecutor();
executor.setLogger(this.getLog());
File[] overlayDirectories;
if (resourceOverlayDirectories == null || resourceOverlayDirectories.length == 0) {
overlayDirectories = new File[]{resourceOverlayDirectory};
} else {
overlayDirectories = resourceOverlayDirectories;
}
File androidJar = getAndroidSdk().getAndroidJar();
File outputFile = new File(project.getBuild().getDirectory(), project.getBuild().getFinalName() + ".ap_");
List commands = new ArrayList();
commands.add("package");
commands.add("-f");
commands.add("-M");
commands.add(androidManifestFile.getAbsolutePath());
for (File resOverlayDir : overlayDirectories) {
if (resOverlayDir != null && resOverlayDir.exists()) {
commands.add("-S");
commands.add(resOverlayDir.getAbsolutePath());
}
}
if (combinedRes.exists()) {
commands.add("-S");
commands.add(combinedRes.getAbsolutePath());
} else {
if (resourceDirectory.exists()) {
commands.add("-S");
commands.add(resourceDirectory.getAbsolutePath());
}
}
for (Artifact apkLibraryArtifact: getRelevantDependencyArtifacts()) {
if (apkLibraryArtifact.getType().equals(APKLIB)) {
commands.add("-S");
commands.add(getLibraryUnpackDirectory(apkLibraryArtifact)+"/res");
}
}
commands.add("--auto-add-overlay");
if (assetsDirectory.exists()) {
commands.add("-A");
commands.add(assetsDirectory.getAbsolutePath());
}
if (extractedDependenciesAssets.exists()) {
commands.add("-A");
commands.add(extractedDependenciesAssets.getAbsolutePath());
}
commands.add("-I");
commands.add(androidJar.getAbsolutePath());
commands.add("-F");
commands.add(outputFile.getAbsolutePath());
if (StringUtils.isNotBlank(configurations)) {
commands.add("-c");
commands.add(configurations);
}
getLog().info(getAndroidSdk().getPathForTool("aapt") + " " + commands.toString());
try {
executor.executeCommand(getAndroidSdk().getPathForTool("aapt"), commands, project.getBasedir(), false);
} catch (ExecutionException e) {
throw new MojoExecutionException("", e);
}
}
}