use of com.android.build.gradle.internal.api.AppVariantContext in project atlas by alibaba.
the class AtlasAppTaskManager method runTask.
@Override
public void runTask() {
appExtension.getApplicationVariants().forEach(new Consumer<ApplicationVariant>() {
@Override
public void accept(ApplicationVariant applicationVariant) {
AppVariantContext appVariantContext = AtlasBuildContext.sBuilderAdapter.appVariantContextFactory.getAppVariantContext(project, applicationVariant);
if (!AtlasBuildContext.atlasMainDexHelperMap.containsKey(appVariantContext.getVariantName())) {
AtlasBuildContext.atlasMainDexHelperMap.put(appVariantContext.getVariantName(), new AtlasMainDexHelper());
}
TransformReplacer transformReplacer = new TransformReplacer(appVariantContext);
repalceAndroidBuilder(applicationVariant);
List<MtlTaskContext> mtlTaskContextList = new ArrayList<MtlTaskContext>();
mtlTaskContextList.add(new MtlTaskContext(appVariantContext.getVariantData().preBuildTask));
mtlTaskContextList.add(new MtlTaskContext(BuildAtlasEnvTask.ConfigAction.class, null));
mtlTaskContextList.add(new MtlTaskContext(ScanDupResTask.ConfigActon.class, null));
mtlTaskContextList.add(new MtlTaskContext(LogDependenciesTask.ConfigAction.class, null));
mtlTaskContextList.add(new MtlTaskContext(PrepareAPTask.ConfigAction.class, null));
mtlTaskContextList.add(new MtlTaskContext(appVariantContext.getVariantData().mergeAssetsTask));
mtlTaskContextList.add(new MtlTaskContext(RenderscriptCompile.class));
mtlTaskContextList.add(new MtlTaskContext(StandardizeLibManifestTask.ConfigAction.class, null));
mtlTaskContextList.add(new MtlTaskContext(PrepareBundleInfoTask.ConfigAction.class, null));
if (!atlasExtension.getTBuildConfig().getClassInject() && atlasExtension.isAtlasEnabled()) {
mtlTaskContextList.add(new MtlTaskContext(GenerateAtlasSourceTask.ConfigAction.class, null));
}
mtlTaskContextList.add(new MtlTaskContext(PreparePackageIdsTask.ConfigAction.class, null));
mtlTaskContextList.add(new MtlTaskContext(PrepareAaptTask.ConfigAction.class, null));
mtlTaskContextList.add(new MtlTaskContext(AidlCompile.class));
mtlTaskContextList.add(new MtlTaskContext(GenerateBuildConfig.class));
mtlTaskContextList.add(new MtlTaskContext(MergeResAwbsConfigAction.class, null));
mtlTaskContextList.add(new MtlTaskContext(MergeAssetAwbsConfigAction.class, null));
if (null != androidExtension.getDataBinding() && androidExtension.getDataBinding().isEnabled() && !appVariantContext.getAtlasExtension().getTBuildConfig().getAllBundlesToMdex()) {
// mtlTaskContextList.add(
// new MtlTaskContext(AwbDataBindingProcessLayoutTask.ConfigAction.class, null));
mtlTaskContextList.add(new MtlTaskContext(AwbDataBindingExportBuildInfoTask.ConfigAction.class, null));
mtlTaskContextList.add(new MtlTaskContext(AwbDataBindingMergeArtifactsTask.ConfigAction.class, null));
}
mtlTaskContextList.add(new MtlTaskContext(MergeManifests.class));
mtlTaskContextList.add(new MtlTaskContext(MergeManifestAwbsConfigAction.class, null));
// mtlTaskContextList.add(new MtlTaskContext(MergeResV4Dir.ConfigAction.class, null));
mtlTaskContextList.add(new MtlTaskContext(ProcessAndroidResources.class));
ProcessAndroidResources processAndroidResources = appVariantContext.getScope().getProcessResourcesTask().get(new TaskContainerAdaptor(appVariantContext.getProject().getTasks()));
if (processAndroidResources.isAapt2Enabled()) {
processAndroidResources.doLast(new Action<Task>() {
@Override
public void execute(Task task) {
File processResourcePackageOutputDirectory = appVariantContext.getScope().getProcessResourcePackageOutputDirectory();
File[] files = processResourcePackageOutputDirectory.listFiles((file, name) -> name.endsWith(SdkConstants.DOT_RES));
for (File file : files) {
try {
ResourcePatch.makePatchable(file);
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
}
});
}
mtlTaskContextList.add(new MtlTaskContext(ProcessResAwbsTask.ConfigAction.class, null));
mtlTaskContextList.add(new MtlTaskContext(JavacAwbsTask.ConfigAction.class, null));
if (null != androidExtension.getDataBinding() && androidExtension.getDataBinding().isEnabled() && !appVariantContext.getAtlasExtension().getTBuildConfig().getAllBundlesToMdex()) {
mtlTaskContextList.add(new MtlTaskContext(AwbDataBindingRenameTask.ConfigAction.class, null));
}
mtlTaskContextList.add(new MtlTaskContext(TransformTask.class));
mtlTaskContextList.add(new MtlTaskContext(PackageAwbsTask.ConfigAction.class, null));
if (appVariantContext.getAtlasExtension().getTBuildConfig().isIncremental() && (appVariantContext.getBuildType().getPatchConfig() == null || !appVariantContext.getBuildType().getPatchConfig().isCreateTPatch())) {
// mtlTaskContextList.add(new MtlTaskContext(PrepareBaseApkTask.ConfigAction.class, null));
final TaskFactory tasks = new TaskContainerAdaptor(project.getTasks());
VariantScope variantScope = appVariantContext.getVariantData().getScope();
// create the stream generated from this task
variantScope.getTransformManager().addStream(OriginalStream.builder(project, applicationVariant.getName()).addContentType(QualifiedContent.DefaultContentType.RESOURCES).addScope(QualifiedContent.Scope.PROJECT).setFolders(new Supplier<Collection<File>>() {
@Override
public Collection<File> get() {
return ImmutableList.of(new File(appVariantContext.apContext.getBaseApk() + "_"));
}
}).build());
}
final TaskFactory tasks = new TaskContainerAdaptor(project.getTasks());
VariantScope variantScope = appVariantContext.getVariantData().getScope();
mtlTaskContextList.add(new MtlTaskContext(PackageApplication.class));
if (appVariantContext.getAtlasExtension().isInstantAppEnabled()) {
mtlTaskContextList.add(new MtlTaskContext(AtlasBundleInstantApp.ConfigAction.class, null));
}
mtlTaskContextList.add(new MtlTaskContext(ApBuildTask.ConfigAction.class, null));
mtlTaskContextList.add(new MtlTaskContext(DiffBundleInfoTask.ConfigAction.class, null));
mtlTaskContextList.add(new MtlTaskContext(TPatchDiffResAPBuildTask.ConfigAction.class, null));
mtlTaskContextList.add(new MtlTaskContext(TPatchDiffApkBuildTask.ConfigAction.class, null));
mtlTaskContextList.add(new MtlTaskContext(TPatchTask.ConfigAction.class, null));
mtlTaskContextList.add(new MtlTaskContext("assemble"));
new MtlTaskInjector(appVariantContext).injectTasks(mtlTaskContextList, tAndroidBuilder);
List<MtlTransformContext> mtlTransformContextList = new ArrayList<MtlTransformContext>();
if (atlasExtension.getTBuildConfig().getClassInject()) {
mtlTransformContextList.add(new MtlTransformContext(ClassInjectTransform.class, ProGuardTransform.class, DexTransform.class));
}
if (variantScope.getInstantRunBuildContext().isInInstantRunMode() && appVariantContext.getVariantConfiguration().getBuildType().isMinifyEnabled()) {
mtlTransformContextList.add(new MtlTransformContext(DelegateProguardTransform.class, ExtractJarsTransform.class, InstantRunTransform.class));
}
if (!mtlTransformContextList.isEmpty()) {
new MtlTransformInjector(appVariantContext).injectTasks(mtlTransformContextList);
}
Collection<BaseVariantOutput> baseVariantOutputDataList = appVariantContext.getVariantOutputData();
boolean multiDexEnabled = appVariantContext.getVariantData().getVariantConfiguration().isMultiDexEnabled();
if (atlasExtension.getTBuildConfig().isAtlasMultiDex() && multiDexEnabled) {
transformReplacer.replaceMultiDexListTransform();
}
transformReplacer.replaceProguardTransform();
transformReplacer.disableCache();
if (variantScope.getGlobalScope().getExtension().getDataBinding().isEnabled() && !appVariantContext.getAtlasExtension().getTBuildConfig().getAllBundlesToMdex()) {
transformReplacer.replaceDataBindingMergeArtifactsTransform();
}
for (final BaseVariantOutput vod : baseVariantOutputDataList) {
transformReplacer.replaceFixStackFramesTransform(vod);
transformReplacer.replaceDesugarTransform(vod);
transformReplacer.replaceDexArchiveBuilderTransform(vod);
transformReplacer.replaceDexExternalLibMerge(vod);
transformReplacer.replaceDexMerge(vod);
transformReplacer.replaceDexTransform(appVariantContext, vod);
transformReplacer.replaceShrinkResourcesTransform();
transformReplacer.replaceMergeJavaResourcesTransform(appVariantContext, vod);
transformReplacer.repalaceSomeInstantTransform(vod);
if (atlasExtension.getTBuildConfig().isIncremental()) {
InstantRunPatchingPolicy patchingPolicy = variantScope.getInstantRunBuildContext().getPatchingPolicy();
BaseVariantOutputImpl variantOutput = (BaseVariantOutputImpl) vod;
ApkData data = ApkDataUtils.get(variantOutput);
AtlasDependencyTree atlasDependencyTree = AtlasBuildContext.androidDependencyTrees.get(variantScope.getFullVariantName());
//
}
}
// Boolean includeCompileClasspath =
// appVariantContext.getScope().getVariantConfiguration()
// .getJavaCompileOptions()
// .getAnnotationProcessorOptions()
// .getIncludeCompileClasspath();
// appVariantContext.getVariantData().javaCompilerTask.doFirst(task -> {
// JavaCompile compile = (JavaCompile) task;
// Set<File> mainDexFiles = new MainFilesCollection(appVariantContext.getVariantName()).getFiles();
// FileCollection mainFiles = appVariantContext.getProject().files(mainDexFiles);
// FileCollection files = appVariantContext.getScope().getArtifactFileCollection(ANNOTATION_PROCESSOR, ALL, JAR);
// FileCollection bootFiles = appVariantContext.getProject().files(appVariantContext.getScope().getGlobalScope().getAndroidBuilder().getBootClasspath(false));
// mainFiles = mainFiles.plus(bootFiles);
// FileCollection fileCollection = compile.getClasspath();
// File kotlinClasses = null;
// for (File file : fileCollection) {
// if (file.getAbsolutePath().contains("kotlin-classes")) {
// mainFiles = mainFiles.plus(appVariantContext.getProject().files(file));
// kotlinClasses = file;
// break;
// }
// }
// compile.setClasspath(mainFiles);
// if (Boolean.TRUE.equals(includeCompileClasspath)) {
// compile.getOptions().setAnnotationProcessorPath(files.plus(mainFiles));
// }
// });
appVariantContext.getVariantData().javaCompilerTask.doLast(new Action<Task>() {
@Override
public void execute(Task task) {
JavaCompile compile = (JavaCompile) task;
AtlasBuildContext.atlasMainDexHelperMap.get(appVariantContext.getVariantName()).getInputDirs().add(compile.getDestinationDir());
}
});
PackageAndroidArtifact packageAndroidArtifact = appVariantContext.getVariantData().getTaskByType(PackageAndroidArtifact.class);
if (packageAndroidArtifact != null) {
ReflectUtils.updateField(packageAndroidArtifact, "javaResourceFiles", new AbstractFileCollection() {
@Override
public String getDisplayName() {
return "java-merge-res.jar";
}
@Override
public Set<File> getFiles() {
if (AtlasBuildContext.atlasMainDexHelperMap.get(packageAndroidArtifact.getVariantName()).getMainJavaRes() == null) {
return Sets.newHashSet();
}
return Sets.newHashSet(AtlasBuildContext.atlasMainDexHelperMap.get(packageAndroidArtifact.getVariantName()).getMainJavaRes());
}
});
}
TaskCollection<ExtractTryWithResourcesSupportJar> taskCollection = appVariantContext.getProject().getTasks().withType(ExtractTryWithResourcesSupportJar.class);
for (ExtractTryWithResourcesSupportJar task : taskCollection) {
task.doLast(new Action<Task>() {
@Override
public void execute(Task task) {
ConfigurableFileCollection fileCollection = variantScope.getTryWithResourceRuntimeSupportJar();
for (File file : fileCollection.getFiles()) {
if (file.exists()) {
AtlasBuildContext.atlasMainDexHelperMap.get(variantScope.getFullVariantName()).addMainDex(new BuildAtlasEnvTask.FileIdentity("runtime-deps-try-with-resources", file, false, false));
break;
}
}
}
});
}
}
});
}
use of com.android.build.gradle.internal.api.AppVariantContext in project atlas by alibaba.
the class DexByteCodeConverterHook method convertByteCode.
// @Override
// public void runDexer(DexProcessBuilder builder, DexOptions dexOptions, ProcessOutputHandler processOutputHandler) throws ProcessException, IOException, InterruptedException {
// builder.addInputs(inputFile);
// super.runDexer(builder,dexOptions,processOutputHandler);
//
//
// }
@Override
public void convertByteCode(Collection<File> inputs, File outDexFolder, boolean multidex, final File mainDexList, DexOptions dexOptions, ProcessOutputHandler processOutputHandler, int minSdkVersion) throws IOException, InterruptedException, ProcessException {
logger.warning("outDexFolder:" + outDexFolder.getAbsolutePath());
FileUtils.forceMkdir(outDexFolder);
// outDexFolder.mkdirs();
AtlasDependencyTree atlasDependencyTree = AtlasBuildContext.androidDependencyTrees.get(variantContext.getVariantName());
if (null != atlasDependencyTree) {
ProcessOutputHandler outputHandler = new ParsingProcessOutputHandler(new ToolOutputParser(new DexParser(), Message.Kind.ERROR, LoggerWrapper.getLogger(DexByteCodeConverterHook.class)), new ToolOutputParser(new DexParser(), LoggerWrapper.getLogger(DexByteCodeConverterHook.class)), AtlasBuildContext.androidBuilderMap.get(variantContext.getProject()).getErrorReporter());
for (final AwbBundle awbBundle : atlasDependencyTree.getAwbBundles()) {
waitableExecutor.execute((Callable<Void>) () -> {
try {
long start = System.currentTimeMillis();
// create dex
File dexOutputFile = ((AppVariantContext) variantContext).getAwbDexOutput(awbBundle.getName());
if (dexOutputFile.exists()) {
FileUtils.cleanDirectory(dexOutputFile);
} else {
FileUtils.forceMkdir(dexOutputFile);
}
// if some of our .jar input files exist, just reset the inputDir to null
AwbTransform awbTransform = variantOutputContext.getAwbTransformMap().get(awbBundle.getName());
List<File> inputFiles = new ArrayList<File>();
inputFiles.addAll(awbTransform.getInputFiles());
inputFiles.addAll(awbTransform.getInputLibraries());
if (null != awbTransform.getInputDirs()) {
inputFiles.addAll(awbTransform.getInputDirs());
}
if (variantContext.getScope().getDexer() == DexerTool.DX) {
AtlasBuildContext.androidBuilderMap.get(variantContext.getProject()).convertByteCode(inputFiles, dexOutputFile, false, null, dexOptions, outputHandler, true);
} else if (variantContext.getScope().getDexer() == DexerTool.D8) {
new AtlasD8Creator(inputFiles, ((AppVariantContext) variantContext).getAwbDexAchiveOutput(awbBundle), multidex, mainDexList, dexOptions, minSdkVersion, fileCache, processOutputHandler, variantContext, variantOutputContext).create(awbBundle);
}
if (awbBundle.isMBundle) {
mBundleSets.add(awbBundle);
}
} catch (Exception e) {
throw new ProcessException(awbBundle.getName(), e);
}
return null;
});
}
}
File tempDexFolder = null;
inputFile.addAll(AtlasBuildContext.atlasMainDexHelperMap.get(variantContext.getVariantName()).getAllMainDexJars());
inputFile.addAll(AtlasBuildContext.atlasMainDexHelperMap.get(variantContext.getVariantName()).getInputDirs());
logger.warning("maindex inputFile size :" + inputFile.size());
if (variantContext.getScope().getDexer() == DexerTool.D8) {
AtlasD8Creator atlasD8Creator = new AtlasD8Creator(inputs, ((AppVariantContext) variantContext).getMainDexAchive(), multidex, mainDexList, dexOptions, minSdkVersion, fileCache, processOutputHandler, variantContext, variantOutputContext);
atlasD8Creator.setMainDexOut(outDexFolder);
atlasD8Creator.create(new AwbBundle());
return;
}
initDexExecutorService(dexOptions);
if (!multidex) {
if (fileCache != null && globalCacheBuilder == null) {
globalCacheBuilder = new FileCache.Inputs.Builder(FileCache.Command.PREDEX_LIBRARY).putBoolean("multidex", false).putLong("minisdk", minSdkVersion).putString("dexoptions", dexOptions.getAdditionalParameters().toString()).putBoolean("jumbomode", dexOptions.getJumboMode()).putString("type", type);
inputFile = new ArrayList<>(inputFile);
Collections.sort((List<File>) inputFile);
FileCache.Inputs inputsKey = globalCacheBuilder.putString("md5", MD5Util.getFileMd5(inputFile)).build();
try {
fileCache.createFile(outDexFolder, inputsKey, () -> {
logger.warning("dex inputFile missCache: " + inputFile.toString());
outDexFolder.mkdirs();
DexByteCodeConverterHook.super.convertByteCode(inputFile, outDexFolder, multidex, mainDexList, dexOptions, processOutputHandler, minSdkVersion);
});
} catch (ExecutionException e) {
e.printStackTrace();
failures.add(e);
}
} else {
DexByteCodeConverterHook.super.convertByteCode(inputFile, outDexFolder, multidex, mainDexList, dexOptions, processOutputHandler, minSdkVersion);
}
// try {
// for (Future future : futureList) {
// future.get();
// }
// } catch (Exception e) {
// throw new ProcessException(e);
// }
} else {
if (mainDexList != null && !mainDexList.exists()) {
generateMainDexList(mainDexList);
}
tempDexFolder = variantOutputContext.getMainDexOutDir();
if (tempDexFolder.exists()) {
FileUtils.cleanDirectory(tempDexFolder);
}
File finalTempDexFolder = tempDexFolder;
if (fileCache != null && globalCacheBuilder == null) {
if (mainDexList != null) {
globalCacheBuilder = new FileCache.Inputs.Builder(FileCache.Command.PREDEX_LIBRARY).putBoolean("multidex", true).putFile("multidexlist", mainDexList, FileCache.FileProperties.HASH).putLong("minisdk", minSdkVersion).putString("dexoptions", dexOptions.getAdditionalParameters().toString()).putBoolean("jumbomode", dexOptions.getJumboMode()).putString("type", type);
} else {
globalCacheBuilder = new FileCache.Inputs.Builder(FileCache.Command.PREDEX_LIBRARY).putBoolean("multidex", true).putLong("minisdk", minSdkVersion).putString("dexoptions", dexOptions.getAdditionalParameters().toString()).putBoolean("jumbomode", dexOptions.getJumboMode()).putString("type", type);
}
}
if (inputFile.size() == 1) {
splitFile();
}
inputFile.parallelStream().forEach(file -> {
File outPutFolder = new File(finalTempDexFolder, FilenameUtils.getBaseName(file.getName()));
if (globalCacheBuilder != null && file.isFile()) {
FileCache.Inputs.Builder builder = copyOf(globalCacheBuilder);
FileCache.Inputs cacheInputs = null;
if (file.isFile()) {
cacheInputs = builder.putFile("hash", file, FileCache.FileProperties.HASH).build();
} else {
Collection<File> files = FileUtils.listFiles(file, new String[] { "class" }, true);
Collections.sort((List<File>) files);
cacheInputs = builder.putString("hash", MD5Util.getFileMd5(files)).build();
}
try {
fileCache.createFile(outPutFolder, cacheInputs, () -> {
logger.warning("maindex inputFile missCache:" + file.getAbsolutePath());
outPutFolder.mkdirs();
DexByteCodeConverterHook.super.convertByteCode(Arrays.asList(file), outPutFolder, true, mainDexList, dexOptions, processOutputHandler, minSdkVersion);
});
} catch (Exception e) {
failures.add(e);
e.printStackTrace();
}
} else {
logger.warning("maindex inputFile:" + file.getAbsolutePath());
outPutFolder.mkdirs();
try {
DexByteCodeConverterHook.super.convertByteCode(Arrays.asList(file), outPutFolder, true, mainDexList, dexOptions, processOutputHandler, minSdkVersion);
} catch (Exception e) {
e.printStackTrace();
failures.add(e);
}
}
});
if (failures.size() > 0) {
throw new ProcessException(failures.get(0));
}
// for (Future future : futureList) {
// try {
// future.get();
// } catch (ExecutionException e) {
// throw new ProcessException(e);
// }
// }
//
// inputFile.stream().parallel().forEach(new Consumer<File>() {
// @Override
// public void accept(File file) {
// fileCache.createFile()fileCacheMap.get(file)
// }
// });
Collection<File> dexFiles = FileUtils.listFiles(tempDexFolder, new String[] { "dex" }, true);
if (dexFiles != null) {
logger.warning("maindex outDexFiles size:" + dexFiles.size());
dexPaths = dexFiles.stream().map(file -> file.toPath()).collect(Collectors.toList());
}
mainforkJoinPool = new ForkJoinPool();
atlasDexArchiveMerger = new AtlasDexArchiveMerger(mainforkJoinPool);
if (!variantContext.getAtlasExtension().getTBuildConfig().getMergeBundlesDex()) {
try {
atlasDexArchiveMerger.mergeDexArchives(dexPaths, outDexFolder.toPath(), mainDexList == null ? null : mainDexList.toPath(), DexingType.LEGACY_MULTIDEX);
} catch (DexArchiveMergerException e) {
throw new ProcessException(e);
}
}
}
waitableExecutor.waitForTasksWithQuickFail(true);
atomicInteger.set(FileUtils.listFiles(outDexFolder, new String[] { "dex" }, true).size());
logger.warning("maindex final dexs size:" + atomicInteger.get());
for (AwbBundle bundle : mBundleSets) {
File awbDex = new File(((AppVariantContext) variantContext).getAwbDexOutput(bundle.getName()), "classes.dex");
if (awbDex.exists() && !variantContext.getAtlasExtension().getTBuildConfig().getMergeBundlesDex()) {
FileUtils.moveFile(awbDex, new File(outDexFolder, "classes" + atomicInteger.incrementAndGet() + ".dex"));
} else if (awbDex.exists() && variantContext.getAtlasExtension().getTBuildConfig().getMergeBundlesDex()) {
dexPaths.add(awbDex.toPath());
} else {
logger.warning(awbDex.getAbsoluteFile() + " is not exist!");
}
}
if (variantContext.getAtlasExtension().getTBuildConfig().getMergeBundlesDex()) {
try {
atlasDexArchiveMerger.mergeDexArchives(dexPaths, outDexFolder.toPath(), null, DexingType.LEGACY_MULTIDEX);
} catch (DexArchiveMergerException e) {
e.printStackTrace();
} finally {
}
}
if (tempDexFolder != null && tempDexFolder.exists()) {
FileUtils.deleteDirectory(tempDexFolder);
}
}
use of com.android.build.gradle.internal.api.AppVariantContext in project atlas by alibaba.
the class AppVariantContextFactory method create.
@NotNull
public AppVariantContext create(Project project, ApplicationVariantImpl applicationVariant) {
AppVariantContext appVariantContext;
AppExtension appExtension = project.getExtensions().getByType(AppExtension.class);
AtlasExtension atlasExtension = project.getExtensions().getByType(AtlasExtension.class);
appVariantContext = new AppVariantContext(applicationVariant, project, atlasExtension, appExtension);
return appVariantContext;
}
use of com.android.build.gradle.internal.api.AppVariantContext in project atlas by alibaba.
the class BuildAtlasEnvTask method generate.
@TaskAction
void generate() throws TransformException {
Set<ResolvedArtifactResult> compileArtifacts = compileManifests.getArtifacts();
Set<ResolvedArtifactResult> jarArtifacts = compileJars.getArtifacts();
Set<ResolvedArtifactResult> nativeLibsArtifacts = nativeLibs.getArtifacts();
Set<ResolvedArtifactResult> javaResourcesArtifacts = javaResources.getArtifacts();
Set<ResolvedArtifactResult> androidRes = res.getArtifacts();
Set<ResolvedArtifactResult> androidAssets = assets.getArtifacts();
Set<ResolvedArtifactResult> androidRnames = symbolListWithPackageNames.getArtifacts();
AtlasDependencyTree androidDependencyTree = AtlasBuildContext.androidDependencyTrees.get(getVariantName());
List<AwbBundle> bundles = new ArrayList<>();
bundles.add(androidDependencyTree.getMainBundle());
bundles.addAll(androidDependencyTree.getAwbBundles());
// this is no used ,if used in future add to transform!
Set<ResolvedArtifactResult> nativeLibsArtifacts2 = nativeLibs2.getArtifacts();
nativeLibsArtifacts.addAll(nativeLibsArtifacts2);
AtlasBuildContext.localLibs = nativeLibs2.getArtifactFiles().getFiles();
for (ResolvedArtifactResult resolvedArtifactResult : jarArtifacts) {
ComponentIdentifier componentIdentifier = resolvedArtifactResult.getId().getComponentIdentifier();
if (componentIdentifier instanceof DefaultModuleComponentIdentifier) {
allJars.add(new FileIdentity(((DefaultModuleComponentIdentifier) componentIdentifier).getGroup() + ":" + ((DefaultModuleComponentIdentifier) componentIdentifier).getModule(), resolvedArtifactResult.getFile(), resolvedArtifactResult.getId().getDisplayName().startsWith("classes.jar") ? false : true, false));
} else if (componentIdentifier instanceof DefaultProjectComponentIdentifier) {
String projectPath = ((DefaultProjectComponentIdentifier) resolvedArtifactResult.getId().getComponentIdentifier()).getProjectPath();
allJars.add(new FileIdentity(projectPath.substring(projectPath.lastIndexOf(":") + 1), resolvedArtifactResult.getFile(), resolvedArtifactResult.getId().getDisplayName().startsWith("classes.jar") ? false : true, true));
} else if (componentIdentifier instanceof OpaqueComponentArtifactIdentifier) {
if (resolvedArtifactResult.getFile().getAbsolutePath().contains("renderscript"))
appLocalJars.add(new FileIdentity(componentIdentifier.getDisplayName(), resolvedArtifactResult.getFile(), true, false));
}
}
for (ResolvedArtifactResult resolvedArtifactResult : compileArtifacts) {
if (resolvedArtifactResult.getId().getComponentIdentifier() instanceof DefaultModuleComponentIdentifier) {
allManifests.put(((DefaultModuleComponentIdentifier) resolvedArtifactResult.getId().getComponentIdentifier()).getGroup() + ":" + ((DefaultModuleComponentIdentifier) resolvedArtifactResult.getId().getComponentIdentifier()).getModule(), resolvedArtifactResult.getFile());
} else if (resolvedArtifactResult.getId().getComponentIdentifier() instanceof DefaultProjectComponentIdentifier) {
String projectPath = ((DefaultProjectComponentIdentifier) resolvedArtifactResult.getId().getComponentIdentifier()).getProjectPath();
allManifests.put(projectPath.substring(projectPath.lastIndexOf(":") + 1), resolvedArtifactResult.getFile());
}
}
for (ResolvedArtifactResult resolvedArtifactResult : nativeLibsArtifacts) {
if (resolvedArtifactResult.getId().getComponentIdentifier() instanceof DefaultModuleComponentIdentifier) {
allSolibs.put(((DefaultModuleComponentIdentifier) resolvedArtifactResult.getId().getComponentIdentifier()).getGroup() + ":" + ((DefaultModuleComponentIdentifier) resolvedArtifactResult.getId().getComponentIdentifier()).getModule(), resolvedArtifactResult.getFile());
} else if (resolvedArtifactResult.getId().getComponentIdentifier() instanceof DefaultProjectComponentIdentifier) {
String projectPath = ((DefaultProjectComponentIdentifier) resolvedArtifactResult.getId().getComponentIdentifier()).getProjectPath();
allSolibs.put(projectPath.substring(projectPath.lastIndexOf(":") + 1), resolvedArtifactResult.getFile());
}
}
for (ResolvedArtifactResult resolvedArtifactResult : javaResourcesArtifacts) {
if (resolvedArtifactResult.getId().getComponentIdentifier() instanceof DefaultModuleComponentIdentifier) {
allJavaRes.put(((DefaultModuleComponentIdentifier) resolvedArtifactResult.getId().getComponentIdentifier()).getGroup() + ":" + ((DefaultModuleComponentIdentifier) resolvedArtifactResult.getId().getComponentIdentifier()).getModule(), resolvedArtifactResult.getFile());
} else if (resolvedArtifactResult.getId().getComponentIdentifier() instanceof DefaultProjectComponentIdentifier) {
String projectPath = ((DefaultProjectComponentIdentifier) resolvedArtifactResult.getId().getComponentIdentifier()).getProjectPath();
allJavaRes.put(projectPath.substring(projectPath.lastIndexOf(":") + 1), resolvedArtifactResult.getFile());
}
}
for (ResolvedArtifactResult resolvedArtifactResult : androidRes) {
if (resolvedArtifactResult.getId().getComponentIdentifier() instanceof DefaultModuleComponentIdentifier) {
allAndroidRes.put(((DefaultModuleComponentIdentifier) resolvedArtifactResult.getId().getComponentIdentifier()).getGroup() + ":" + ((DefaultModuleComponentIdentifier) resolvedArtifactResult.getId().getComponentIdentifier()).getModule(), resolvedArtifactResult);
} else if (resolvedArtifactResult.getId().getComponentIdentifier() instanceof DefaultProjectComponentIdentifier) {
String projectPath = ((DefaultProjectComponentIdentifier) resolvedArtifactResult.getId().getComponentIdentifier()).getProjectPath();
allAndroidRes.put(projectPath.substring(projectPath.lastIndexOf(":") + 1), resolvedArtifactResult);
}
}
for (ResolvedArtifactResult resolvedArtifactResult : androidAssets) {
if (resolvedArtifactResult.getId().getComponentIdentifier() instanceof DefaultModuleComponentIdentifier) {
allAndroidAssets.put(((DefaultModuleComponentIdentifier) resolvedArtifactResult.getId().getComponentIdentifier()).getGroup() + ":" + ((DefaultModuleComponentIdentifier) resolvedArtifactResult.getId().getComponentIdentifier()).getModule(), resolvedArtifactResult);
} else if (resolvedArtifactResult.getId().getComponentIdentifier() instanceof DefaultProjectComponentIdentifier) {
String projectPath = ((DefaultProjectComponentIdentifier) resolvedArtifactResult.getId().getComponentIdentifier()).getProjectPath();
allAndroidAssets.put(projectPath.substring(projectPath.lastIndexOf(":") + 1), resolvedArtifactResult);
}
}
for (ResolvedArtifactResult resolvedArtifactResult : androidRnames) {
if (resolvedArtifactResult.getId().getComponentIdentifier() instanceof DefaultModuleComponentIdentifier) {
allAndroidRnames.put(((DefaultModuleComponentIdentifier) resolvedArtifactResult.getId().getComponentIdentifier()).getGroup() + ":" + ((DefaultModuleComponentIdentifier) resolvedArtifactResult.getId().getComponentIdentifier()).getModule(), resolvedArtifactResult);
} else if (resolvedArtifactResult.getId().getComponentIdentifier() instanceof DefaultProjectComponentIdentifier) {
String projectPath = ((DefaultProjectComponentIdentifier) resolvedArtifactResult.getId().getComponentIdentifier()).getProjectPath();
allAndroidRnames.put(projectPath.substring(projectPath.lastIndexOf(":") + 1), resolvedArtifactResult);
}
}
// app localJar is not support , this may course duplicate localjars
appLocalJars.stream().forEach(fileIdentity -> AtlasBuildContext.atlasMainDexHelperMap.get(getVariantName()).addMainDex(fileIdentity));
AtlasDependencyTree atlasDependencyTree = AtlasBuildContext.androidDependencyTrees.get(getVariantName());
List<AndroidLibrary> androidLibraries = atlasDependencyTree.getAllAndroidLibrarys();
androidLibraries.stream().forEach(androidLibrary -> {
if (androidLibrary instanceof AtlasAndroidLibraryImpl) {
AndroidDependency fakeAndroidLibrary = ((AtlasAndroidLibraryImpl) androidLibrary).getAndroidLibrary();
File id = null;
if ((id = allManifests.get(androidLibrary.getResolvedCoordinates().getGroupId() + ":" + androidLibrary.getResolvedCoordinates().getArtifactId())) == null) {
id = allManifests.get(androidLibrary.getResolvedCoordinates().toString().split(":")[1]);
}
if (id == null) {
getLogger().warn("id == null---------------------" + androidLibrary.getResolvedCoordinates().getGroupId() + ":" + androidLibrary.getResolvedCoordinates().getArtifactId());
throw new GradleException("excute failed! ");
}
ReflectUtils.updateField(fakeAndroidLibrary, "extractedFolder", id.getParentFile());
ReflectUtils.updateField(fakeAndroidLibrary, "jarsRootFolder", id.getParentFile());
((AtlasAndroidLibraryImpl) androidLibrary).setAndroidLibrary(AndroidDependency.createExplodedAarLibrary(null, androidLibrary.getResolvedCoordinates(), androidLibrary.getName(), ((AtlasAndroidLibraryImpl) androidLibrary).getPath(), id.getParentFile()));
appVariantContext.manifestMap.put(androidLibrary.getManifest().getAbsolutePath(), appVariantContext.getModifyManifest(androidLibrary));
}
});
List<AndroidLibrary> mainDexAndroidLibraries = atlasDependencyTree.getMainBundle().getAndroidLibraries();
List<JavaLibrary> mainDexJarLibraries = atlasDependencyTree.getMainBundle().getJavaLibraries();
List<SoLibrary> mainSoLibraries = atlasDependencyTree.getMainBundle().getSoLibraries();
for (AndroidLibrary androidLibrary : mainDexAndroidLibraries) {
String name = androidLibrary.getResolvedCoordinates().getGroupId() + ":" + androidLibrary.getResolvedCoordinates().getArtifactId();
String moudleName = androidLibrary.getResolvedCoordinates().toString().split(":")[1];
fillMainManifest(name, moudleName);
fillMainJar(name, moudleName);
fillAllJavaRes(name, moudleName);
fillMainSolibs(name, moudleName);
}
for (JavaLibrary jarLibrary : mainDexJarLibraries) {
String moudleName = jarLibrary.getName().split(":")[1];
String name = jarLibrary.getResolvedCoordinates().getGroupId() + ":" + jarLibrary.getResolvedCoordinates().getArtifactId();
fillMainJar(name, moudleName);
fillAllJavaRes(name, moudleName);
}
for (SoLibrary soLibrary : mainSoLibraries) {
String name = soLibrary.getResolvedCoordinates().getGroupId() + ":" + soLibrary.getResolvedCoordinates().getArtifactId();
String moudleName = soLibrary.getResolvedCoordinates().toString().split(":")[1];
fillMainSolibs(name, moudleName);
}
for (AwbBundle awbBundle : atlasDependencyTree.getAwbBundles()) {
List<AndroidLibrary> awbAndroidLibraries = awbBundle.getAndroidLibraries();
List<JavaLibrary> awbJarLibraries = awbBundle.getJavaLibraries();
List<SoLibrary> awbSoLibraries = awbBundle.getSoLibraries();
for (AndroidLibrary androidLibrary : awbAndroidLibraries) {
String name = androidLibrary.getResolvedCoordinates().getGroupId() + ":" + androidLibrary.getResolvedCoordinates().getArtifactId();
String moudleName = androidLibrary.getResolvedCoordinates().toString().split(":")[1];
fillAwbManifest(name, moudleName, awbBundle);
fillAwbJar(name, moudleName, awbBundle);
fillAwbAllJavaRes(name, moudleName, awbBundle);
fillAwbSolibs(name, moudleName, awbBundle);
fillAwbAndroidRes(name, moudleName, awbBundle);
fillAwbAndroidAssets(name, moudleName, awbBundle);
fillAwbAndroidRs(name, moudleName, awbBundle);
}
for (JavaLibrary jarLibrary : awbJarLibraries) {
String moudleName = jarLibrary.getName().split(":")[1];
String name = jarLibrary.getResolvedCoordinates().getGroupId() + ":" + jarLibrary.getResolvedCoordinates().getArtifactId();
fillAwbJar(name, moudleName, awbBundle);
}
for (SoLibrary soLibrary : awbSoLibraries) {
String name = soLibrary.getResolvedCoordinates().getGroupId() + ":" + soLibrary.getResolvedCoordinates().getArtifactId();
String moudleName = soLibrary.getResolvedCoordinates().toString().split(":")[1];
fillAwbSolibs(name, moudleName, awbBundle);
}
String name = awbBundle.getResolvedCoordinates().getGroupId() + ":" + awbBundle.getResolvedCoordinates().getArtifactId();
String moudleName = awbBundle.getResolvedCoordinates().toString().split(":")[1];
fillAwbManifest(name, moudleName, awbBundle);
fillAwbJar(name, moudleName, awbBundle);
fillAwbAllJavaRes(name, moudleName, awbBundle);
fillAwbSolibs(name, moudleName, awbBundle);
fillAwbAndroidRes(name, moudleName, awbBundle);
fillAwbAndroidAssets(name, moudleName, awbBundle);
fillAwbAndroidRs(name, moudleName, awbBundle);
}
MergeResources mergeResources = appVariantContext.getScope().getMergeResourcesTask().get(new TaskContainerAdaptor(getProject().getTasks()));
try {
// mergeresources
Field field = MergeResources.class.getDeclaredField("libraries");
field.setAccessible(true);
field.set(mergeResources, new MainArtifactsCollection((ArtifactCollection) field.get(mergeResources), getProject(), mergeResources.getVariantName()));
appVariantOutputContext.getAwbTransformMap().values().stream().forEach(awbTransform -> {
if (isMBundle(appVariantContext, awbTransform.getAwbBundle())) {
try {
awbTransform.getAwbBundle().isMBundle = true;
awbTransform.getAwbBundle().bundleInfo.setIsMBundle(true);
field.set(mergeResources, new AppendMainArtifactsCollection(appVariantContext.getProject(), (ArtifactCollection) field.get(mergeResources), awbTransform.getAwbBundle(), ANDROID_RES));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
});
mergeResources.doLast(task -> FileUtils.listFiles(((MergeResources) task).getOutputDir(), new String[] { "xml" }, true).parallelStream().forEach(file -> {
if (!AppendMainArtifactsCollection.bundle2Map.containsKey(file.getName())) {
return;
}
List<String> lines = null;
List<String> newLines = new ArrayList<>();
try {
lines = FileUtils.readLines(file);
lines.forEach(s -> {
String s1 = s;
if (s.contains("http://schemas.android.com/apk/res/" + AppendMainArtifactsCollection.bundle2Map.get(file.getName()))) {
s1 = s.replace("http://schemas.android.com/apk/res/" + AppendMainArtifactsCollection.bundle2Map.get(file.getName()), "http://schemas.android.com/apk/res-auto");
}
newLines.add(s1);
});
FileUtils.writeLines(file, newLines);
} catch (IOException e) {
e.printStackTrace();
}
}));
// mergeSourcesSets
MergeSourceSetFolders mergeSourceSetFolders = appVariantContext.getScope().getMergeAssetsTask().get(new TaskContainerAdaptor(getProject().getTasks()));
Field assetsField = MergeSourceSetFolders.class.getDeclaredField("libraries");
assetsField.setAccessible(true);
assetsField.set(mergeSourceSetFolders, new MainArtifactsCollection((ArtifactCollection) assetsField.get(mergeSourceSetFolders), getProject(), mergeSourceSetFolders.getVariantName()));
appVariantOutputContext.getAwbTransformMap().values().stream().forEach(awbTransform -> {
if (isMBundle(appVariantContext, awbTransform.getAwbBundle())) {
try {
awbTransform.getAwbBundle().isMBundle = true;
awbTransform.getAwbBundle().bundleInfo.setIsMBundle(true);
assetsField.set(mergeSourceSetFolders, new AppendMainArtifactsCollection(appVariantContext.getProject(), (ArtifactCollection) assetsField.get(mergeSourceSetFolders), awbTransform.getAwbBundle(), ASSETS));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
});
AtlasBuildContext.atlasMainDexHelperMap.get(getVariantName()).getMainSoFiles().put(appVariantContext.getScope().getMergeNativeLibsOutputDir().getAbsolutePath(), true);
} catch (Exception e) {
}
// process resources
ProcessAndroidResources processAndroidResources = appVariantContext.getScope().getProcessResourcesTask().get(new TaskContainerAdaptor(appVariantContext.getProject().getTasks()));
FileCollection fileCollection = processAndroidResources.getSymbolListsWithPackageNames();
Set<String> filesNames = new HashSet<>();
for (String fileName : AtlasBuildContext.atlasMainDexHelperMap.get(getVariantName()).getMainManifestFiles().keySet()) {
filesNames.add(fileName.substring(fileName.lastIndexOf(File.separatorChar) + 1));
}
FileCollection updateFileCollection = fileCollection.filter(element -> filesNames.contains(element.getParentFile().getParentFile().getName()));
ReflectUtils.updateField(processAndroidResources, "symbolListsWithPackageNames", updateFileCollection);
appVariantOutputContext.getAwbTransformMap().values().stream().forEach(awbTransform -> {
if (isMBundle(appVariantContext, awbTransform.getAwbBundle())) {
awbTransform.getAwbBundle().isMBundle = true;
awbTransform.getAwbBundle().bundleInfo.setIsMBundle(true);
FileCollection fc = new AppendMainArtifactsCollection(appVariantContext.getProject(), processAndroidResources.getSymbolListsWithPackageNames(), awbTransform.getAwbBundle(), SYMBOL_LIST_WITH_PACKAGE_NAME).getArtifactFiles();
ReflectUtils.updateField(processAndroidResources, "symbolListsWithPackageNames", fc);
}
});
appVariantContext.processResAwbsTask.mainDexSymbolFileCollection = updateFileCollection;
// FileCollection fs = appVariantContext.getScope().getArtifactFileCollection(AndroidArtifacts.ConsumedConfigType.COMPILE_CLASSPATH,AndroidArtifacts.ArtifactScope.ALL,AndroidArtifacts.ArtifactType.CLASSES);
// fs.getFiles().forEach(new Consumer<File>() {
// @Override
// public void accept(File file) {
// if (file.exists()){
// try {
// JarFile jarFile = new JarFile(file);
// Enumeration<JarEntry>enumeration = jarFile.entries();
// while (enumeration.hasMoreElements()){
// JarEntry jarEntry = enumeration.nextElement();
// if (jarEntry.getName().endsWith(".class")){
// ClassReader classReader = new ClassReader(jarFile.getInputStream(jarEntry));
// String[]ss = classReader.getInterfaces();
// if (ss!= null){
// for (String s:ss){
// if (s.contains("IExternalComponentGetter")||s.contains("IExternalComponentGetter.class")){
// System.out.println("IExternalComponentGetter:"+jarEntry.getName());
// }else if (s.contains("IExternalModuleGetter")||s.contains("IExternalModuleGetter.class")){
// System.out.println("IExternalModuleGetter:"+jarEntry.getName());
// }
// }
// }
//
// }
// }
// } catch (IOException e) {
// e.printStackTrace();
// }
// }
// }
// });
allManifests.clear();
allJavaRes.clear();
allSolibs.clear();
allJars.clear();
allAndroidAssets.clear();
allAndroidRes.clear();
//
// try {
// duplicateClazzNote();
// } catch (IOException e) {
// e.printStackTrace();
// }
}
use of com.android.build.gradle.internal.api.AppVariantContext in project atlas by alibaba.
the class PrepareBundleInfoTask method generateBundleListCfg.
private void generateBundleListCfg(AppVariantContext appVariantContext) throws IOException {
List<String> bundleLists = AtlasBuildContext.awbBundleMap.values().stream().filter(awbBundle -> !awbBundle.isMBundle).map(awbBundle -> {
return appVariantOutputContext.getAwbPackageOutputFilePath(awbBundle);
}).sorted().collect(Collectors.toList());
File outputFile = new File(appVariantContext.getScope().getGlobalScope().getOutputsDir(), "bundleList.cfg");
FileUtils.deleteQuietly(outputFile);
outputFile.getParentFile().mkdirs();
FileUtils.writeLines(outputFile, bundleLists);
appVariantContext.bundleListCfg = outputFile;
// Set the bundle dependencies
List<BundleInfo> bundleInfos = new ArrayList<>();
AtlasBuildContext.awbBundleMap.values().stream().forEach(awbBundle -> bundleInfos.add(awbBundle.bundleInfo));
}
Aggregations