AndroidSupport(final GradleProject project) { this.project = project; this.apiVersion = project.getAndroidApiVersion(); this.modelVersion = project.getAndroidModelVersion(); }
@Override public CompileResult compileJava() throws IOException { return this.compileJava(false); }
public GradleProject(final File projectRoot) throws IOException { super(projectRoot); this.initialize(); }
private void prepareCompileAndroidTestJavaV2() { ProjectConnection connection = this.project.getProjectConnection(); try { BuildLauncher buildLauncher = connection.newBuild(); String genTestTask = this.project.getName() + genUnitTestTaskName; String genAndroidTestTask = this.project.getName() + genAndroidTestTaskName; buildLauncher.forTasks(genTestTask, genAndroidTestTask).run(); int size = this.project.getDependencies().size(); String aar = Joiner.on(File.separator) .join(this.project.getProjectRoot(), BUILD_DIR, INTERMEDIATE_DIR, EXPLODED_DIR); List<File> jars = FileUtils.collectFiles(new File(aar), EXT_JAR); for (File jar : jars) { addAAR(jar); } int after = this.project.getDependencies().size(); if (size != after) { CachedASMReflector.getInstance().createClassIndexes(jars); this.project.resetCachedClasspath(); } } finally { connection.close(); } }
private void parseIdeaModule(final IdeaModule ideaModule) throws IOException { final org.gradle.tooling.model.GradleProject gradleProject = ideaModule.getGradleProject(); String name = convertName(gradleProject.getPath()); if (nonNull(name) && !name.isEmpty()) { this.name = name; } final AndroidProject androidProject = AndroidSupport.getAndroidProject(this.rootProject, gradleProject); if (nonNull(androidProject)) { Set<ProjectDependency> projectDependencies = analyzeDependencies(ideaModule); this.dependencies.addAll(projectDependencies); // parse android this.isAndroidProject = true; this.androidApiVersion = androidProject.getApiVersion(); this.androidModelVersion = androidProject.getModelVersion(); log.info( "detect android project {}. api {} model {}", name, androidApiVersion, androidModelVersion); System.setProperty("meghanada.android.project", "true"); System.setProperty("meghanada.android.project.name", name); final AndroidSupport androidSupport = new AndroidSupport(this); androidSupport.parseAndroidProject(androidProject); } else { // normal this.parseIdeaModule(gradleProject, ideaModule); } }
@Override public CompileResult compileTestJava(boolean force) throws IOException { this.runPrepareTestCompileTask(); if (this.isAndroidProject) { new AndroidSupport(this).prepareCompileAndroidTestJava(); return super.compileTestJava(force); } else { return super.compileTestJava(force); } }
@Override public CompileResult compileJava(boolean force) throws IOException { this.runPrepareCompileTask(); if (this.isAndroidProject) { new AndroidSupport(this).prepareCompileAndroidJava(); return super.compileJava(force); } else { return super.compileJava(force); } }
private void runPrepareCompileTask() throws IOException { if (!this.prepareCompileTask.isEmpty()) { final ProjectConnection connection = this.getProjectConnection(); try { final String[] tasks = prepareCompileTask.toArray(new String[0]); final BuildLauncher buildLauncher = connection.newBuild(); log.info("project {} run tasks:{}", this.name, tasks); GradleProject.setBuildJVMArgs(buildLauncher); buildLauncher.forTasks(tasks).run(); } finally { connection.close(); } } }
void prepareCompileAndroidTestJava() { log.info("Use android api version : {}", this.apiVersion); if (this.apiVersion > 2) { // 3.0.0+ prepareCompileAndroidTestJavaV3(); } else { // 2.x.x prepareCompileAndroidTestJavaV2(); } }
@Override protected void initialize() throws IOException { super.initialize(); this.allModules = new ConcurrentHashMap<>(4); this.prepareCompileTask = new ArrayList<>(2); this.prepareTestCompileTask = new ArrayList<>(2); this.rootProject = GradleProject.searchRootProject(projectRoot); String tmp = getTmpDir(); }
private void parseExtraJavaArtifacts(Set<ProjectDependency> dependencies, Variant variant) { String buildType = variant.getBuildType(); boolean debugBuild = buildType.equals(DEBUG_BUILD); Collection<JavaArtifact> extraJavaArtifacts = variant.getExtraJavaArtifacts(); for (JavaArtifact javaArtifact : extraJavaArtifacts) { if (debugBuild) { Collection<File> generatedSourceFolders = javaArtifact.getGeneratedSourceFolders(); for (File src : generatedSourceFolders) { this.project.getSources().add(src); } } Dependencies compileDependencies = javaArtifact.getDependencies(); Collection<AndroidLibrary> libraries = compileDependencies.getLibraries(); for (AndroidLibrary androidLibrary : libraries) { Collection<File> localJars = androidLibrary.getLocalJars(); for (File jar : localJars) { addDependencies(dependencies, jar); } } Collection<JavaLibrary> javaLibraries = compileDependencies.getJavaLibraries(); for (JavaLibrary javaLibrary : javaLibraries) { File file = javaLibrary.getJarFile(); addDependencies(dependencies, file); } } }
@Before public void setUp() throws Exception { if (this.project == null) { System.setProperty("meghanada.test", "true"); this.projectRoot = new File("./").getCanonicalFile(); // this.projectRoot = new File("./").getCanonicalFile(); this.projectRootPath = this.projectRoot.getCanonicalPath(); this.project = new GradleProject(projectRoot); String tmpdir = System.getProperty("java.io.tmpdir"); File tmpParent = new File(tmpdir); if (!tmpParent.exists() && !tmpParent.mkdirs()) { log.warn("fail create tmpdir"); } final File tempDir = Files.createTempDir(); tempDir.deleteOnExit(); final String path = tempDir.getCanonicalPath(); System.setProperty(TEMP_PROJECT_SETTING_DIR, path); } }
public static void shutdown() throws Exception { ProjectDatabaseHelper.shutdown(); String p = System.getProperty(TEMP_PROJECT_SETTING_DIR); File file = new File(p); org.apache.commons.io.FileUtils.deleteDirectory(file); String tempPath = GradleProject.getTempPath(); if (nonNull(tempPath)) { org.apache.commons.io.FileUtils.deleteDirectory(new File(tempPath)); } log.info("deleted database {}", file); }
@Override public CompileResult compileTestJava() throws IOException { return this.compileTestJava(false); }
private static void setBuildJVMArgs(final BuildLauncher build) throws IOException { build.setJvmArguments("-Djava.io.tmpdir=" + getTmpDir()); }
private void addAAR(File jar) { String pkg = jar.getParentFile().getParentFile().getParentFile().getParentFile().getName(); String name = jar.getParentFile().getParentFile().getParentFile().getName(); String id = pkg + '.' + name; String version = jar.getParentFile().getParentFile().getName(); ProjectDependency projectDependency = new ProjectDependency(id, DEFAULT_SCOPE, version, jar, ProjectDependency.Type.JAR); this.project.getDependencies().add(projectDependency); }
void prepareCompileAndroidJava() { ProjectConnection connection = this.project.getProjectConnection(); try { BuildLauncher buildLauncher = connection.newBuild(); String genTask = this.project.getName() + this.genSourceTaskName; buildLauncher.forTasks(genTask).run(); int size = this.project.getDependencies().size(); String aar = Joiner.on(File.separator) .join(this.project.getProjectRoot(), BUILD_DIR, INTERMEDIATE_DIR, EXPLODED_DIR); List<File> jars = FileUtils.collectFiles(new File(aar), EXT_JAR); for (File jar : jars) { addAAR(jar); } int after = this.project.getDependencies().size(); if (size != after) { CachedASMReflector.getInstance().createClassIndexes(jars); this.project.resetCachedClasspath(); } } finally { connection.close(); } }
private void runPrepareTestCompileTask() throws IOException { if (!this.prepareTestCompileTask.isEmpty()) { final ProjectConnection connection = this.getProjectConnection(); try { final String[] tasks = prepareTestCompileTask.toArray(new String[0]); final BuildLauncher buildLauncher = connection.newBuild(); log.info("project {} run tasks:{}", this.name, tasks); GradleProject.setBuildJVMArgs(buildLauncher); buildLauncher.forTasks(tasks).run(); } finally { connection.close(); } } }
@AfterClass public static void shutdown() throws Exception { ProjectDatabaseHelper.shutdown(); String p = System.getProperty(TEMP_PROJECT_SETTING_DIR); File file = new File(p); org.apache.commons.io.FileUtils.deleteDirectory(file); String tempPath = GradleProject.getTempPath(); if (nonNull(tempPath)) { org.apache.commons.io.FileUtils.deleteDirectory(new File(tempPath)); } }