gradle 自定義tansfrom如何被加載

我們的registerTransfrom操作很簡單

    public void registerTransform(@NonNull Transform transform, Object... dependencies) {
        transforms.add(transform);
        transformDependencies.add(Arrays.asList(dependencies));
    }

直線轉(zhuǎn)移到,andrdid的所有Plugin都會執(zhí)行cerateTasks方法

BasePlugin.java
    private void createTasks() {
        threadRecorder.record(
                ExecutionType.TASK_MANAGER_CREATE_TASKS,
                project.getPath(),
                null,
                () -> taskManager.createTasksBeforeEvaluate());

        project.afterEvaluate(
                CrashReporting.afterEvaluate(
                        p -> {
                            sourceSetManager.runBuildableArtifactsActions();

                            threadRecorder.record(
                                    ExecutionType.BASE_PLUGIN_CREATE_ANDROID_TASKS,
                                    project.getPath(),
                                    null,
                                    this::createAndroidTasks);
                        }));
    }

createAndroidTasks創(chuàng)建了很多android的任務(wù)

    BasePlugin.java
    @VisibleForTesting
    final void createAndroidTasks() {
      ......
 List<VariantScope> variantScopes = variantManager.createAndroidTasks();

        ApiObjectFactory apiObjectFactory =
                new ApiObjectFactory(
                        globalScope.getAndroidBuilder(),
                        extension,
                        variantFactory,
                        project.getObjects());
        for (VariantScope variantScope : variantScopes) {
            BaseVariantData variantData = variantScope.getVariantData();
            apiObjectFactory.create(variantData);
        }
      .....
    }

    com.android.build.gradle.internal.VariantManager.java
    public List<VariantScope> createAndroidTasks() {
        variantFactory.validateModel(this);
        variantFactory.preVariantWork(project);

        if (variantScopes.isEmpty()) {
            populateVariantDataList();
        }

        // Create top level test tasks.
        taskManager.createTopLevelTestTasks(!productFlavors.isEmpty());

        for (final VariantScope variantScope : variantScopes) {
            createTasksForVariantData(variantScope);
        }

        taskManager.createSourceSetArtifactReportTask(globalScope);

        taskManager.createReportTasks(variantScopes);

        return variantScopes;
    }
    com.android.build.gradle.internal.VariantManager.java
    public void createTasksForVariantData(final VariantScope variantScope) {
        final BaseVariantData variantData = variantScope.getVariantData();
        final VariantType variantType = variantData.getType();
        final GradleVariantConfiguration variantConfig = variantScope.getVariantConfiguration();

        taskManager.createAssembleTask(variantData);
        if (variantType.isBaseModule()) {
            taskManager.createBundleTask(variantData);
        }

        if (variantType.isTestComponent()) {
            ......
        } else {
            taskManager.createTasksForVariantScope(variantScope);
        }
    }

com.android.build.gradle.internal.LibraryTaskManager.java
public void createTasksForVariantScope(@NonNull final VariantScope variantScope) {
  ...... 

 List<Transform> customTransforms = extension.getTransforms();
        List<List<Object>> customTransformsDependencies = extension.getTransformsDependencies();

        for (int i = 0, count = customTransforms.size(); i < count; i++) {
            Transform transform = customTransforms.get(i);

            // Check the transform only applies to supported scopes for libraries:
            // We cannot transform scopes that are not packaged in the library
            // itself.
            Sets.SetView<? super Scope> difference =
                    Sets.difference(transform.getScopes(), TransformManager.PROJECT_ONLY);
            if (!difference.isEmpty()) {
                String scopes = difference.toString();
                globalScope
                        .getAndroidBuilder()
                        .getIssueReporter()
                        .reportError(
                                Type.GENERIC,
                                new EvalIssueException(
                                        String.format(
                                                "Transforms with scopes '%s' cannot be applied to library projects.",
                                                scopes)));
            }

            List<Object> deps = customTransformsDependencies.get(i);
            transformManager.addTransform(
                    taskFactory,
                    variantScope,
                    transform,
                    null,
                    task -> {
                        if (!deps.isEmpty()) {
                            task.dependsOn(deps);
                        }
                    },
                    taskProvider -> {
                        // if the task is a no-op then we make assemble task
                        // depend on it.
                        if (transform.getScopes().isEmpty()) {
                            TaskFactoryUtils.dependsOn(
                                    variantScope.getTaskContainer().getAssembleTask(),
                                    taskProvider);
                        }
                    });
        }
        ·······
}

createTasksForVariantScope創(chuàng)建了很多android打包任務(wù)兽掰。
extension.getTransforms()是獲取之前我們注冊的transform
extension.getTransformsDependencies()是獲取注冊的依賴

總結(jié):
plugin交由注冊到AppExtension
最后統(tǒng)一交由TaskManager執(zhí)行addTransform生成Task。一個transfrom就是一個task。
transfrom依賴關(guān)系是通過task的依賴設(shè)置來完成的

看到不錯的文章:http://www.reibang.com/p/11f030b2034f

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子敦间,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件烦磁,死亡現(xiàn)場離奇詭異,居然都是意外死亡哼勇,警方通過查閱死者的電腦和手機都伪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來积担,“玉大人陨晶,你說我怎么就攤上這事。” “怎么了先誉?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵湿刽,是天一觀的道長。 經(jīng)常有香客問我褐耳,道長诈闺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任铃芦,我火速辦了婚禮雅镊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘刃滓。我一直安慰自己仁烹,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布咧虎。 她就那樣靜靜地躺著卓缰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪老客。 梳的紋絲不亂的頭發(fā)上僚饭,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天,我揣著相機與錄音胧砰,去河邊找鬼鳍鸵。 笑死,一個胖子當(dāng)著我的面吹牛尉间,可吹牛的內(nèi)容都是我干的偿乖。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼哲嘲,長吁一口氣:“原來是場噩夢啊……” “哼贪薪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起眠副,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤画切,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后囱怕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體霍弹,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年娃弓,在試婚紗的時候發(fā)現(xiàn)自己被綠了典格。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡台丛,死狀恐怖耍缴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤防嗡,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布变汪,位于F島的核電站,受9級特大地震影響本鸣,放射性物質(zhì)發(fā)生泄漏疫衩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一荣德、第九天 我趴在偏房一處隱蔽的房頂上張望闷煤。 院中可真熱鬧,春花似錦涮瞻、人聲如沸鲤拿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽近顷。三九已至,卻和暖如春宁否,著一層夾襖步出監(jiān)牢的瞬間窒升,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工慕匠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留饱须,地道東北人。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓台谊,卻偏偏與公主長得像蓉媳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子锅铅,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,700評論 2 354