Search in sources :

Example 1 with AtlasDependencyTree

use of com.taobao.android.builder.dependency.AtlasDependencyTree 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;
                            }
                        }
                    }
                });
            }
        }
    });
}
Also used : TPatchDiffApkBuildTask(com.taobao.android.builder.tasks.tpatch.TPatchDiffApkBuildTask) AwbDataBindingMergeArtifactsTask(com.taobao.android.builder.tasks.app.databinding.AwbDataBindingMergeArtifactsTask) AwbDataBindingExportBuildInfoTask(com.taobao.android.builder.tasks.app.databinding.AwbDataBindingExportBuildInfoTask) PackageAwbsTask(com.taobao.android.builder.tasks.app.bundle.PackageAwbsTask) TransformTask(com.android.build.gradle.internal.pipeline.TransformTask) AwbDataBindingRenameTask(com.taobao.android.builder.tasks.app.databinding.AwbDataBindingRenameTask) PrepareAPTask(com.taobao.android.builder.tasks.PrepareAPTask) TPatchDiffResAPBuildTask(com.taobao.android.builder.tasks.tpatch.TPatchDiffResAPBuildTask) ProcessResAwbsTask(com.taobao.android.builder.tasks.app.bundle.ProcessResAwbsTask) TPatchTask(com.taobao.android.builder.tasks.tpatch.TPatchTask) BuildAtlasEnvTask(com.taobao.android.builder.tasks.app.BuildAtlasEnvTask) AbstractTask(org.gradle.api.internal.AbstractTask) PreparePackageIdsTask(com.taobao.android.builder.tasks.app.prepare.PreparePackageIdsTask) PrepareAaptTask(com.taobao.android.builder.tasks.app.prepare.PrepareAaptTask) Task(org.gradle.api.Task) JavacAwbsTask(com.taobao.android.builder.tasks.app.bundle.JavacAwbsTask) StandardizeLibManifestTask(com.taobao.android.builder.tasks.app.manifest.StandardizeLibManifestTask) PrepareBundleInfoTask(com.taobao.android.builder.tasks.app.prepare.PrepareBundleInfoTask) DiffBundleInfoTask(com.taobao.android.builder.tasks.tpatch.DiffBundleInfoTask) AwbDataBindingExportBuildInfoTask(com.taobao.android.builder.tasks.app.databinding.AwbDataBindingExportBuildInfoTask) ApplicationVariant(com.android.build.gradle.api.ApplicationVariant) TPatchTask(com.taobao.android.builder.tasks.tpatch.TPatchTask) ConfigurableFileCollection(org.gradle.api.file.ConfigurableFileCollection) UncheckedIOException(java.io.UncheckedIOException) ExtractTryWithResourcesSupportJar(com.android.build.gradle.internal.tasks.ExtractTryWithResourcesSupportJar) BaseVariantOutput(com.android.build.gradle.api.BaseVariantOutput) StandardizeLibManifestTask(com.taobao.android.builder.tasks.app.manifest.StandardizeLibManifestTask) MtlTaskContext(com.taobao.android.builder.tasks.manager.MtlTaskContext) PrepareAPTask(com.taobao.android.builder.tasks.PrepareAPTask) ImmutableList(com.google.common.collect.ImmutableList) TPatchDiffResAPBuildTask(com.taobao.android.builder.tasks.tpatch.TPatchDiffResAPBuildTask) BuildAtlasEnvTask(com.taobao.android.builder.tasks.app.BuildAtlasEnvTask) MtlTransformContext(com.taobao.android.builder.tasks.manager.transform.MtlTransformContext) AtlasMainDexHelper(com.taobao.android.builder.AtlasMainDexHelper) InstantRunPatchingPolicy(com.android.build.gradle.internal.incremental.InstantRunPatchingPolicy) AbstractFileCollection(org.gradle.api.internal.file.AbstractFileCollection) TaskCollection(org.gradle.api.tasks.TaskCollection) AbstractFileCollection(org.gradle.api.internal.file.AbstractFileCollection) ConfigurableFileCollection(org.gradle.api.file.ConfigurableFileCollection) FileCollection(org.gradle.api.file.FileCollection) AwbDataBindingRenameTask(com.taobao.android.builder.tasks.app.databinding.AwbDataBindingRenameTask) File(java.io.File) JavaCompile(org.gradle.api.tasks.compile.JavaCompile) Action(org.gradle.api.Action) PrepareBundleInfoTask(com.taobao.android.builder.tasks.app.prepare.PrepareBundleInfoTask) AwbDataBindingMergeArtifactsTask(com.taobao.android.builder.tasks.app.databinding.AwbDataBindingMergeArtifactsTask) TaskContainerAdaptor(com.android.build.gradle.internal.TaskContainerAdaptor) TPatchDiffApkBuildTask(com.taobao.android.builder.tasks.tpatch.TPatchDiffApkBuildTask) MtlTransformInjector(com.taobao.android.builder.tasks.manager.transform.MtlTransformInjector) TransformReplacer(com.taobao.android.builder.tasks.transform.TransformReplacer) PackageAwbsTask(com.taobao.android.builder.tasks.app.bundle.PackageAwbsTask) DiffBundleInfoTask(com.taobao.android.builder.tasks.tpatch.DiffBundleInfoTask) Supplier(com.google.common.base.Supplier) ApkData(com.android.ide.common.build.ApkData) JavacAwbsTask(com.taobao.android.builder.tasks.app.bundle.JavacAwbsTask) VariantScope(com.android.build.gradle.internal.scope.VariantScope) BaseVariantOutputImpl(com.android.build.gradle.internal.api.BaseVariantOutputImpl) AtlasBundleInstantApp(com.taobao.android.builder.tasks.instantapp.AtlasBundleInstantApp) UncheckedIOException(java.io.UncheckedIOException) IOException(java.io.IOException) MtlTaskInjector(com.taobao.android.builder.tasks.manager.MtlTaskInjector) AtlasDependencyTree(com.taobao.android.builder.dependency.AtlasDependencyTree) TaskCollection(org.gradle.api.tasks.TaskCollection) TaskFactory(com.android.build.gradle.internal.TaskFactory) PreparePackageIdsTask(com.taobao.android.builder.tasks.app.prepare.PreparePackageIdsTask) PrepareAaptTask(com.taobao.android.builder.tasks.app.prepare.PrepareAaptTask) ProcessResAwbsTask(com.taobao.android.builder.tasks.app.bundle.ProcessResAwbsTask) AppVariantContext(com.android.build.gradle.internal.api.AppVariantContext)

Example 2 with AtlasDependencyTree

use of com.taobao.android.builder.dependency.AtlasDependencyTree 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);
    }
}
Also used : ToolOutputParser(com.android.ide.common.blame.parser.ToolOutputParser) AwbBundle(com.taobao.android.builder.dependency.model.AwbBundle) ParsingProcessOutputHandler(com.android.ide.common.blame.ParsingProcessOutputHandler) ParsingProcessOutputHandler(com.android.ide.common.blame.ParsingProcessOutputHandler) AtlasDependencyTree(com.taobao.android.builder.dependency.AtlasDependencyTree) FileCacheException(com.taobao.android.builder.tools.cache.FileCacheException) FileCache(com.android.builder.utils.FileCache) DexParser(com.android.ide.common.blame.parser.DexParser) AwbTransform(com.android.build.gradle.internal.api.AwbTransform) JarFile(java.util.jar.JarFile) AppVariantContext(com.android.build.gradle.internal.api.AppVariantContext)

Example 3 with AtlasDependencyTree

use of com.taobao.android.builder.dependency.AtlasDependencyTree in project atlas by alibaba.

the class DelegateProguardTransform method applyBundleInOutConfigration.

public File applyBundleInOutConfigration(final AppVariantContext appVariantContext) {
    VariantScope variantScope = appVariantContext.getScope();
    GlobalScope globalScope = variantScope.getGlobalScope();
    File proguardOut = new File(Joiner.on(File.separatorChar).join(String.valueOf(globalScope.getBuildDir()), FD_OUTPUTS, "mapping", variantScope.getVariantConfiguration().getDirName()));
    File awbInOutConfig = new File(proguardOut, "awb_inout_config.cfg");
    // Add awb configuration
    AtlasDependencyTree dependencyTree = AtlasBuildContext.androidDependencyTrees.get(variantScope.getVariantConfiguration().getFullName());
    if (dependencyTree.getAwbBundles().size() > 0) {
        BaseVariantOutput vod = (BaseVariantOutput) appVariantContext.getVariantOutputData().iterator().next();
        AppVariantOutputContext appVariantOutputContext = appVariantContext.getAppVariantOutputContext(ApkDataUtils.get(vod));
        File awbObfuscatedDir = new File(globalScope.getIntermediatesDir(), "/classes-proguard/" + variantScope.getVariantConfiguration().getDirName());
        AwbProguardConfiguration awbProguardConfiguration = new AwbProguardConfiguration(appVariantOutputContext.getAwbTransformMap().values(), awbObfuscatedDir, appVariantOutputContext);
        try {
            awbProguardConfiguration.printConfigFile(awbInOutConfig);
        } catch (IOException e) {
            throw new GradleException("", e);
        }
        defaultProguardFiles.add(awbInOutConfig);
    }
    return awbInOutConfig;
}
Also used : GlobalScope(com.android.build.gradle.internal.scope.GlobalScope) BaseVariantOutput(com.android.build.gradle.api.BaseVariantOutput) VariantScope(com.android.build.gradle.internal.scope.VariantScope) AwbProguardConfiguration(com.taobao.android.builder.tools.proguard.AwbProguardConfiguration) GradleException(org.gradle.api.GradleException) AppVariantOutputContext(com.android.build.gradle.internal.api.AppVariantOutputContext) IOException(java.io.IOException) File(java.io.File) AtlasDependencyTree(com.taobao.android.builder.dependency.AtlasDependencyTree)

Example 4 with AtlasDependencyTree

use of com.taobao.android.builder.dependency.AtlasDependencyTree 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();
// }
}
Also used : IOFileFilter(org.apache.commons.io.filefilter.IOFileFilter) AbstractFileCollection(org.gradle.api.internal.file.AbstractFileCollection) ProjectComponentIdentifier(org.gradle.api.artifacts.component.ProjectComponentIdentifier) ResourceType(com.android.resources.ResourceType) JarFile(java.util.jar.JarFile) MergeSourceSetFolders(com.android.build.gradle.tasks.MergeSourceSetFolders) AndroidDependency(com.android.builder.dependency.level2.AndroidDependency) MtlBaseTaskAction(com.taobao.android.builder.tasks.manager.MtlBaseTaskAction) TaskAction(org.gradle.api.tasks.TaskAction) AtlasDependencyGraph(com.android.build.gradle.internal.ide.AtlasDependencyGraph) AtlasAndroidArtifacts(com.android.build.gradle.internal.publishing.AtlasAndroidArtifacts) com.android.ide.common.res2(com.android.ide.common.res2) AtlasDependencyTree(com.taobao.android.builder.dependency.AtlasDependencyTree) Task(org.gradle.api.Task) RUNTIME_CLASSPATH(com.android.build.gradle.internal.publishing.AndroidArtifacts.ConsumedConfigType.RUNTIME_CLASSPATH) JavaLibrary(com.android.builder.model.JavaLibrary) AtlasBuildContext(com.taobao.android.builder.AtlasBuildContext) DefaultModuleComponentIdentifier(org.gradle.internal.component.external.model.DefaultModuleComponentIdentifier) com.google.common.collect(com.google.common.collect) TrueFileFilter(org.apache.commons.io.filefilter.TrueFileFilter) AppVariantContext(com.android.build.gradle.internal.api.AppVariantContext) TransformException(com.android.build.api.transform.TransformException) Project(org.gradle.api.Project) Nullable(com.android.annotations.Nullable) SoLibrary(com.taobao.android.builder.dependency.model.SoLibrary) AndroidArtifacts(com.android.build.gradle.internal.publishing.AndroidArtifacts) ALL(com.android.build.gradle.internal.publishing.AndroidArtifacts.ArtifactScope.ALL) ArtifactCollection(org.gradle.api.artifacts.ArtifactCollection) COMPILE_CLASSPATH(com.android.build.gradle.internal.publishing.AndroidArtifacts.ConsumedConfigType.COMPILE_CLASSPATH) AppVariantOutputContext(com.android.build.gradle.internal.api.AppVariantOutputContext) Spec(org.gradle.api.specs.Spec) ClassReader(org.objectweb.asm.ClassReader) NonNull(com.android.annotations.NonNull) FalseFileFilter(org.apache.commons.io.filefilter.FalseFileFilter) DocumentBuilderFactory(javax.xml.parsers.DocumentBuilderFactory) ResolvedArtifactResult(org.gradle.api.artifacts.result.ResolvedArtifactResult) NotNull(org.jetbrains.annotations.NotNull) AppendMainArtifactsCollection(com.taobao.android.builder.tasks.app.merge.AppendMainArtifactsCollection) MergeManifests(com.android.build.gradle.tasks.MergeManifests) FilenameFilter(java.io.FilenameFilter) BaseTask(com.android.build.gradle.internal.tasks.BaseTask) java.util(java.util) MainArtifactsCollection(com.taobao.android.builder.tasks.app.merge.MainArtifactsCollection) OpaqueComponentArtifactIdentifier(org.gradle.internal.component.local.model.OpaqueComponentArtifactIdentifier) BaseVariantOutput(com.android.build.gradle.api.BaseVariantOutput) AndroidLibrary(com.android.builder.model.AndroidLibrary) FileCollection(org.gradle.api.file.FileCollection) ComponentIdentifier(org.gradle.api.artifacts.component.ComponentIdentifier) JarEntry(java.util.jar.JarEntry) ANNOTATION_PROCESSOR(com.android.build.gradle.internal.publishing.AndroidArtifacts.ConsumedConfigType.ANNOTATION_PROCESSOR) AwbBundle(com.taobao.android.builder.dependency.model.AwbBundle) JavaCompile(org.gradle.api.tasks.compile.JavaCompile) ReflectUtils(com.taobao.android.builder.tools.ReflectUtils) Action(org.gradle.api.Action) ProjectDependency(org.gradle.api.artifacts.ProjectDependency) FileUtils(org.apache.commons.io.FileUtils) IOException(java.io.IOException) ProcessAndroidResources(com.android.build.gradle.tasks.ProcessAndroidResources) Field(java.lang.reflect.Field) AtlasAndroidLibraryImpl(com.android.build.gradle.internal.ide.AtlasAndroidLibraryImpl) File(java.io.File) Consumer(java.util.function.Consumer) MainFilesCollection(com.taobao.android.builder.tasks.app.merge.MainFilesCollection) GradleException(org.gradle.api.GradleException) DefaultProjectComponentIdentifier(org.gradle.internal.component.local.model.DefaultProjectComponentIdentifier) ArtifactType(com.android.build.gradle.internal.publishing.AndroidArtifacts.ArtifactType) Preconditions(com.google.common.base.Preconditions) AwbTransform(com.android.build.gradle.internal.api.AwbTransform) TaskContainerAdaptor(com.android.build.gradle.internal.TaskContainerAdaptor) MergeResources(com.android.build.gradle.tasks.MergeResources) AppendMainArtifactsCollection(com.taobao.android.builder.tasks.app.merge.AppendMainArtifactsCollection) MainArtifactsCollection(com.taobao.android.builder.tasks.app.merge.MainArtifactsCollection) ProjectComponentIdentifier(org.gradle.api.artifacts.component.ProjectComponentIdentifier) DefaultModuleComponentIdentifier(org.gradle.internal.component.external.model.DefaultModuleComponentIdentifier) ComponentIdentifier(org.gradle.api.artifacts.component.ComponentIdentifier) DefaultProjectComponentIdentifier(org.gradle.internal.component.local.model.DefaultProjectComponentIdentifier) AbstractFileCollection(org.gradle.api.internal.file.AbstractFileCollection) FileCollection(org.gradle.api.file.FileCollection) TaskContainerAdaptor(com.android.build.gradle.internal.TaskContainerAdaptor) Field(java.lang.reflect.Field) MergeResources(com.android.build.gradle.tasks.MergeResources) ArtifactCollection(org.gradle.api.artifacts.ArtifactCollection) AppendMainArtifactsCollection(com.taobao.android.builder.tasks.app.merge.AppendMainArtifactsCollection) ResolvedArtifactResult(org.gradle.api.artifacts.result.ResolvedArtifactResult) AwbBundle(com.taobao.android.builder.dependency.model.AwbBundle) DefaultModuleComponentIdentifier(org.gradle.internal.component.external.model.DefaultModuleComponentIdentifier) IOException(java.io.IOException) DefaultProjectComponentIdentifier(org.gradle.internal.component.local.model.DefaultProjectComponentIdentifier) SoLibrary(com.taobao.android.builder.dependency.model.SoLibrary) AtlasDependencyTree(com.taobao.android.builder.dependency.AtlasDependencyTree) TransformException(com.android.build.api.transform.TransformException) IOException(java.io.IOException) GradleException(org.gradle.api.GradleException) MergeSourceSetFolders(com.android.build.gradle.tasks.MergeSourceSetFolders) AtlasAndroidLibraryImpl(com.android.build.gradle.internal.ide.AtlasAndroidLibraryImpl) AndroidDependency(com.android.builder.dependency.level2.AndroidDependency) ProcessAndroidResources(com.android.build.gradle.tasks.ProcessAndroidResources) JavaLibrary(com.android.builder.model.JavaLibrary) AndroidLibrary(com.android.builder.model.AndroidLibrary) GradleException(org.gradle.api.GradleException) OpaqueComponentArtifactIdentifier(org.gradle.internal.component.local.model.OpaqueComponentArtifactIdentifier) JarFile(java.util.jar.JarFile) File(java.io.File) MtlBaseTaskAction(com.taobao.android.builder.tasks.manager.MtlBaseTaskAction) TaskAction(org.gradle.api.tasks.TaskAction)

Example 5 with AtlasDependencyTree

use of com.taobao.android.builder.dependency.AtlasDependencyTree in project atlas by alibaba.

the class LogDependenciesTask method generate.

@TaskAction
void generate() {
    AtlasDependencyTree atlasDependencyTree = AtlasBuildContext.androidDependencyTrees.get(getVariantName());
    if (null == atlasDependencyTree) {
        return;
    }
    File treeFile = new File(getProject().getBuildDir(), "outputs/dependencyTree-" + getVariantName() + ".json");
    File treeFileWithFileSize = new File(getProject().getBuildDir(), "outputs/dependencyTree-fileSize-" + getVariantName() + ".json");
    File dependenciesFile = new File(getProject().getBuildDir(), "outputs/dependencies.txt");
    File versionProperties = new File(getProject().getBuildDir(), "outputs/version.properties");
    File buildInfo = new File(getProject().getBuildDir(), "outputs/build.txt");
    File pluginDependencies = new File(getProject().getBuildDir(), "outputs/pluginDependencies.txt");
    File atlasConfig = new File(getProject().getBuildDir(), "outputs/atlasConfig.json");
    appBuildInfo.setDependencyTreeFile(treeFile);
    appBuildInfo.setDependenciesFile(dependenciesFile);
    appBuildInfo.setVersionPropertiesFile(versionProperties);
    appBuildInfo.setBuildInfoFile(buildInfo);
    treeFile.delete();
    dependenciesFile.delete();
    versionProperties.delete();
    buildInfo.delete();
    treeFile.getParentFile().mkdirs();
    try {
        DependencyJson dependencyJson = atlasDependencyTree.getDependencyJson();
        Collections.sort(dependencyJson.getMainDex());
        FileUtils.write(treeFile, JSON.toJSONString(dependencyJson, true));
        dependencyJson = atlasDependencyTree.createDependencyJson(true);
        Collections.sort(dependencyJson.getMainDex());
        FileUtils.write(treeFileWithFileSize, JSON.toJSONString(dependencyJson, true));
        // add to ap
        appBuildInfo.getOtherFilesMap().put("awo/dependencyTree.json", treeFile);
    } catch (IOException e) {
        e.printStackTrace();
    }
    // Output runtime plug-in dependency list
    try {
        // ClassLoader cl = ClassLoader.getSystemClassLoader();
        URL[] urls = ((URLClassLoader) LogDependenciesTask.class.getClassLoader()).getURLs();
        List<String> libraries = new ArrayList<>();
        for (URL url : urls) {
            libraries.add(url.getFile());
        }
        FileUtils.writeLines(pluginDependencies, libraries);
    } catch (IOException e) {
        e.printStackTrace();
    }
    try {
        FileUtils.writeStringToFile(dependenciesFile, JSON.toJSONString(atlasDependencyTree.getDependencyJson()));
    } catch (IOException e) {
        e.printStackTrace();
    }
    try {
        FileUtils.writeLines(versionProperties, getSortVersionList(atlasDependencyTree));
    } catch (IOException e) {
        e.printStackTrace();
    }
    try {
        List<String> lines = new ArrayList<>();
        lines.add("gradleVersion:" + getProject().getGradle().getGradleVersion());
        lines.add("androidPluginVersion:" + com.android.builder.Version.ANDROID_GRADLE_PLUGIN_VERSION);
        lines.add("buildToolsVersion:" + appVariantContext.getAppExtension().getBuildToolsVersion());
        lines.add("compileSdkVersion:" + appVariantContext.getAppExtension().getCompileSdkVersion());
        lines.add("atlasPluginVersion:" + FileNameUtils.getJarVersionName(LogDependenciesTask.class));
        lines.addAll(AtlasBuildContext.sBuilderAdapter.buildInfos);
        FileUtils.writeLines(buildInfo, lines);
    } catch (IOException e) {
        e.printStackTrace();
    }
    try {
        FileUtils.write(atlasConfig, JSON.toJSONString(new AtlasExtensionOutput(appVariantContext.getAtlasExtension(), appVariantContext.getBuildType().getName()), true));
    } catch (IOException e) {
        e.printStackTrace();
    }
    if (null != AtlasBuildContext.conflictDependencies && !AtlasBuildContext.conflictDependencies.isEmpty()) {
        try {
            FileUtils.writeLines(new File(getProject().getBuildDir(), "outputs/warning-dependencyConflict.properties"), AtlasBuildContext.conflictDependencies);
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (appVariantContext.getAtlasExtension().getTBuildConfig().isAbortIfDependencyConflict()) {
            throw new GradleException("Rely on conflict, specific see warning - dependencyConflict. Properties");
        }
    }
}
Also used : ArrayList(java.util.ArrayList) DependencyJson(com.taobao.android.builder.dependency.output.DependencyJson) IOException(java.io.IOException) AtlasDependencyTree(com.taobao.android.builder.dependency.AtlasDependencyTree) URL(java.net.URL) AtlasExtensionOutput(com.taobao.android.builder.tools.guide.AtlasExtensionOutput) URLClassLoader(java.net.URLClassLoader) GradleException(org.gradle.api.GradleException) File(java.io.File) MtlBaseTaskAction(com.taobao.android.builder.tasks.manager.MtlBaseTaskAction) TaskAction(org.gradle.api.tasks.TaskAction)

Aggregations

AtlasDependencyTree (com.taobao.android.builder.dependency.AtlasDependencyTree)38 AwbBundle (com.taobao.android.builder.dependency.model.AwbBundle)26 File (java.io.File)21 ArrayList (java.util.ArrayList)16 MtlBaseTaskAction (com.taobao.android.builder.tasks.manager.MtlBaseTaskAction)13 GradleException (org.gradle.api.GradleException)13 TaskAction (org.gradle.api.tasks.TaskAction)12 IOException (java.io.IOException)11 ExecutorServicesHelper (com.taobao.android.builder.tools.concurrent.ExecutorServicesHelper)8 AwbTransform (com.android.build.gradle.internal.api.AwbTransform)7 VariantScope (com.android.build.gradle.internal.scope.VariantScope)7 BaseVariantOutput (com.android.build.gradle.api.BaseVariantOutput)6 AppVariantOutputContext (com.android.build.gradle.internal.api.AppVariantOutputContext)6 JarFile (java.util.jar.JarFile)6 BundleInfo (com.taobao.android.builder.tools.bundleinfo.model.BundleInfo)5 AppVariantContext (com.android.build.gradle.internal.api.AppVariantContext)4 DefaultTask (org.gradle.api.DefaultTask)4 TaskContainerAdaptor (com.android.build.gradle.internal.TaskContainerAdaptor)3 GlobalScope (com.android.build.gradle.internal.scope.GlobalScope)3 Task (org.gradle.api.Task)3