Search in sources :

Example 1 with Input

use of com.taobao.android.builder.tools.proguard.domain.Input in project atlas by alibaba.

the class AtlasProguardTransform method doMainBundleProguard.

private void doMainBundleProguard(TransformInvocation invocation) throws Exception {
    // apply bundle Inout
    Profiler.enter("bundleKeep");
    File bundleKeep = AtlasProguardHelper.generateBundleKeepCfg(appVariantContext);
    Profiler.release();
    Input input = new Input();
    AwbBundle awbBundle = new AwbBundle();
    awbBundle.getAndroidLibraries().addAll(AtlasBuildContext.androidDependencyTrees.get(appVariantContext.getVariantName()).getMainBundle().getAndroidLibraries());
    AwbTransform awbTransform = new AwbTransform(awbBundle);
    input.getAwbBundles().add(awbTransform);
    List<File> unProguardJars = new ArrayList<>();
    // Enter the input
    for (TransformInput transformInput : invocation.getInputs()) {
        for (JarInput jarInput : transformInput.getJarInputs()) {
            File file = jarInput.getFile();
            if (file.getName().startsWith("combined-rmerge")) {
                unProguardJars.add(file);
            } else if (AtlasBuildContext.atlasMainDexHelperMap.get(appVariantContext.getVariantName()).inMainDex(jarInput)) {
                awbTransform.getInputLibraries().add(file);
            }
        }
        for (DirectoryInput directoryInput : transformInput.getDirectoryInputs()) {
            if (AtlasBuildContext.atlasMainDexHelperMap.get(appVariantContext.getVariantName()).getInputDirs().contains(directoryInput.getFile())) {
                awbTransform.getInputLibraries().add(directoryInput.getFile());
            }
        }
    }
    // inputting librarys
    input.getLibraries().addAll(appVariantContext.getScope().getGlobalScope().getAndroidBuilder().getBootClasspath(true));
    input.getLibraries().addAll(unProguardJars);
    // The default proguard configuration
    input.getDefaultProguardFiles().addAll(defaultProguardFiles);
    // bundle keeps
    input.getParentKeeps().add(bundleKeep);
    File outFile = invocation.getOutputProvider().getContentLocation("main", getOutputTypes(), getScopes(), Format.JAR);
    outFile.delete();
    input.proguardOutputDir = invocation.getOutputProvider().getContentLocation("main", getOutputTypes(), getScopes(), Format.DIRECTORY);
    input.printMapping = (File) ReflectUtils.getField(oldTransform, "printMapping");
    input.dump = (File) ReflectUtils.getField(oldTransform, "dump");
    input.printSeeds = (File) ReflectUtils.getField(oldTransform, "printSeeds");
    input.printUsage = (File) ReflectUtils.getField(oldTransform, "printUsage");
    input.printConfiguration = new File(appVariantContext.getProject().getBuildDir(), "outputs/proguard.cfg");
    Profiler.enter("executeproguard");
    BundleProguarder.execute(appVariantContext, input);
    transformInput(input);
    Profiler.release();
    for (File jar : unProguardJars) {
        File to = invocation.getOutputProvider().getContentLocation(FileNameUtils.getUniqueJarName(jar), getOutputTypes(), getScopes(), Format.JAR);
        FileUtils.copyFile(jar, to);
    }
    OriginalStream originalStream = OriginalStream.builder(appVariantContext.getProject(), "proguard-classes").addContentTypes(com.android.build.gradle.internal.pipeline.TransformManager.CONTENT_CLASS).addScope(QualifiedContent.Scope.PROJECT).setFileCollection(appVariantContext.getProject().files(AtlasBuildContext.atlasMainDexHelperMap.get(appVariantContext.getVariantName()).getAllMainDexJars())).build();
    if (nextTransformTask != null) {
        Collection consumedInputStreams = (Collection) ReflectUtils.getField(nextTransformTask, "consumedInputStreams");
        if (appVariantContext.getAtlasExtension().getTBuildConfig().isFastProguard() && consumedInputStreams != null) {
            consumedInputStreams.add(originalStream);
        }
    }
}
Also used : Input(com.taobao.android.builder.tools.proguard.domain.Input) AwbTransform(com.android.build.gradle.internal.api.AwbTransform) ArrayList(java.util.ArrayList) ConfigurableFileCollection(org.gradle.api.file.ConfigurableFileCollection) Collection(java.util.Collection) AwbBundle(com.taobao.android.builder.dependency.model.AwbBundle) File(java.io.File) OriginalStream(com.android.build.gradle.internal.pipeline.OriginalStream)

Example 2 with Input

use of com.taobao.android.builder.tools.proguard.domain.Input in project atlas by alibaba.

the class AtlasProguardHelper method doBundleProguard.

public static void doBundleProguard(final AppVariantContext appVariantContext, List<File> mainDexJars) throws Exception {
    Profiler.enter("preparebundleproguard");
    VariantScope variantScope = appVariantContext.getScope();
    AtlasDependencyTree dependencyTree = AtlasBuildContext.androidDependencyTrees.get(variantScope.getVariantConfiguration().getFullName());
    if (dependencyTree.getAwbBundles().isEmpty()) {
        return;
    }
    List<File> libs = new ArrayList<>(appVariantContext.getScope().getGlobalScope().getAndroidBuilder().getBootClasspath(true));
    // All dependent classes
    Profiler.enter("getDefaultClasses");
    Set<String> defaultLibClasses = getClassList(libs);
    Profiler.release();
    libs.addAll(mainDexJars);
    // Get the basic proguard configuration
    List<File> defaultProguardFiles = new ArrayList<>(appVariantContext.getVariantConfiguration().getBuildType().getProguardFiles());
    Collections.sort(defaultProguardFiles);
    BaseVariantOutput vod = (BaseVariantOutput) appVariantContext.getVariantOutputData().iterator().next();
    AppVariantOutputContext appVariantOutputContext = appVariantContext.getAppVariantOutputContext(ApkDataUtils.get(vod));
    int parallelCount = appVariantContext.getAtlasExtension().getTBuildConfig().getProguardParallelCount();
    // //FIXME
    // parallelCount = 1;
    Map<BundleInfo, AwbTransform> bundleInfoAwbTransformMap = new HashMap<>();
    for (AwbTransform awbTransform : appVariantOutputContext.getAwbTransformMap().values()) {
        bundleInfoAwbTransformMap.put(awbTransform.getAwbBundle().bundleInfo, awbTransform);
    }
    Profiler.release();
    BundleGraphExecutor.execute(new ArrayList<>(bundleInfoAwbTransformMap.keySet()), parallelCount, new BundleItemRunner() {

        @Override
        public void execute(BundleItem bundleItem) {
            try {
                Input input = new Input();
                AwbTransform awbTransform = bundleInfoAwbTransformMap.get(bundleItem.bundleInfo);
                input.getAwbBundles().add(awbTransform);
                for (BundleInfo sub : bundleItem.circles) {
                    input.getAwbBundles().add(bundleInfoAwbTransformMap.get(sub));
                }
                input.getDefaultProguardFiles().addAll(defaultProguardFiles);
                input.getLibraries().addAll(libs);
                input.getDefaultLibraryClasses().addAll(defaultLibClasses);
                input.printConfiguration = new File(appVariantContext.getAwbProguardDir(input.getAwbBundles().get(0).getAwbBundle()), "proguard.cfg");
                input.printUsage = new File(appVariantContext.getAwbProguardDir(input.getAwbBundles().get(0).getAwbBundle()), "usage.cfg");
                addLibraryProguardFiles(appVariantContext, input);
                addChildDependency(bundleItem, input, bundleInfoAwbTransformMap);
                addParentKeeps(bundleItem, input, awbTransform, bundleInfoAwbTransformMap, appVariantContext);
                BundleProguarder.execute(appVariantContext, input);
            } catch (Exception e) {
                e.printStackTrace();
                throw new GradleException("proguard " + bundleItem.bundleInfo.getPkgName(), e);
            }
        }
    });
}
Also used : VariantScope(com.android.build.gradle.internal.scope.VariantScope) BundleItemRunner(com.taobao.android.builder.tools.bundleinfo.BundleItemRunner) AppVariantOutputContext(com.android.build.gradle.internal.api.AppVariantOutputContext) AtlasDependencyTree(com.taobao.android.builder.dependency.AtlasDependencyTree) IOException(java.io.IOException) GradleException(org.gradle.api.GradleException) BaseVariantOutput(com.android.build.gradle.api.BaseVariantOutput) Input(com.taobao.android.builder.tools.proguard.domain.Input) BundleInfo(com.taobao.android.builder.tools.bundleinfo.model.BundleInfo) BundleItem(com.taobao.android.builder.tools.bundleinfo.BundleItem) AwbTransform(com.android.build.gradle.internal.api.AwbTransform) GradleException(org.gradle.api.GradleException) JarFile(java.util.jar.JarFile) File(java.io.File)

Aggregations

AwbTransform (com.android.build.gradle.internal.api.AwbTransform)2 Input (com.taobao.android.builder.tools.proguard.domain.Input)2 File (java.io.File)2 BaseVariantOutput (com.android.build.gradle.api.BaseVariantOutput)1 AppVariantOutputContext (com.android.build.gradle.internal.api.AppVariantOutputContext)1 OriginalStream (com.android.build.gradle.internal.pipeline.OriginalStream)1 VariantScope (com.android.build.gradle.internal.scope.VariantScope)1 AtlasDependencyTree (com.taobao.android.builder.dependency.AtlasDependencyTree)1 AwbBundle (com.taobao.android.builder.dependency.model.AwbBundle)1 BundleItem (com.taobao.android.builder.tools.bundleinfo.BundleItem)1 BundleItemRunner (com.taobao.android.builder.tools.bundleinfo.BundleItemRunner)1 BundleInfo (com.taobao.android.builder.tools.bundleinfo.model.BundleInfo)1 IOException (java.io.IOException)1 ArrayList (java.util.ArrayList)1 Collection (java.util.Collection)1 JarFile (java.util.jar.JarFile)1 GradleException (org.gradle.api.GradleException)1 ConfigurableFileCollection (org.gradle.api.file.ConfigurableFileCollection)1