14
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Android Gradle Pluginのソースコードの位置とちょっとだけコードを追ってみたメモ

Last updated at Posted at 2015-12-12

Instant Runのコードとかちょっと気になりませんか?

コードがどこにあるのかなど後で忘れそうなので、自分用メモとして残しておきます。

ソースコードの場所の特定

https://sites.google.com/a/android.com/tools/build
https://sites.google.com/a/android.com/tools/build/gradleplugin
ここらへんをみて、
repo syncなどを行ってソースコードを取ってきました。

toolsディレクトリでプロジェクト一覧を取得するために./gradlew projectsすると以下のように出てきました。

Root project 'tools'
+--- Project ':base'
|    +--- Project ':base:annotations'
省略
|    +--- Project ':base:draw9patch'
|    +--- Project ':base:dvlib'
|    +--- Project ':base:google-services'
|    +--- Project ':base:gradle'
|    +--- Project ':base:gradle-core'
|    +--- Project ':base:gradle-experimental'
|    +--- Project ':base:gradle-import'
|    +--- Project ':base:gradle-model'
|    +--- Project ':base:integration-test'
|    +--- Project ':base:jack'
|    |    +--- Project ':base:jack:jack-api'
|    |    \--- Project ':base:jack:jill-api'
|    +--- Project ':base:jobb'
|    +--- Project ':base:layoutlib-api'
|    +--- Project ':base:lint'
省略

Gradleに関係ありそうなのは
:base:gradle みたいです。

./gradlew base:gradle dependencies
で依存関係を洗ってみます。
:base:gradle-coreなどに依存しているようです。

compile - Compile classpath for source set 'main'.
\--- project :base:gradle-core
     +--- project :base:builder
     |    +--- project :base:builder-model
     |    |    \--- project :base:annotations
     |    +--- project :base:builder-test-api
     |    |    \--- project :base:ddmlib
     |    |         +--- project :base:common
     |    |         |    +--- project :base:annotations
     |    |         |    \--- com.google.guava:guava:17.0
     |    |         \--- net.sf.kxml:kxml2:2.3.0
     |    +--- project :base:sdklib
     |    |    +--- project :base:layoutlib-api
     |    |    |    +--- project :base:common (*)
     |    |    |    +--- net.sf.kxml:kxml2:2.3.0
     |    |    |    +--- project :base:annotations
     |    |    |    \--- com.intellij:annotations:12.0
     |    |    +--- project :base:dvlib
     |    |    |    \--- project :base:common (*)
     |    |    +--- com.google.code.gson:gson:2.2.4
     |    |    +--- org.apache.commons:commons-compress:1.8.1
     |    |    +--- org.apache.httpcomponents:httpclient:4.1.1
     |    |    |    +--- org.apache.httpcomponents:httpcore:4.1
     |    |    |    +--- commons-logging:commons-logging:1.1.1
     |    |    |    \--- commons-codec:commons-codec:1.4
     |    |    \--- org.apache.httpcomponents:httpmime:4.1
     |    |         +--- org.apache.httpcomponents:httpcore:4.1
     |    |         \--- commons-logging:commons-logging:1.1.1
     |    +--- project :base:sdk-common
     |    |    +--- project :base:sdklib (*)
     |    |    +--- project :base:builder-test-api (*)
     |    |    \--- project :base:builder-model (*)
     |    +--- project :base:common (*)
     |    +--- project :base:manifest-merger
     |    |    +--- project :base:common (*)
     |    |    +--- project :base:sdklib (*)
     |    |    +--- project :base:sdk-common (*)
     |    |    +--- net.sf.kxml:kxml2:2.3.0
     |    |    \--- com.google.code.gson:gson:2.2.4
     |    +--- project :base:ddmlib (*)
     |    +--- project :base:jack:jack-api
     |    +--- project :base:jack:jill-api
     |    +--- com.squareup:javawriter:2.5.0
     |    +--- org.bouncycastle:bcpkix-jdk15on:1.48
     |    |    \--- org.bouncycastle:bcprov-jdk15on:1.48
     |    +--- org.bouncycastle:bcprov-jdk15on:1.48
     |    +--- org.ow2.asm:asm:5.0.3
     |    \--- org.ow2.asm:asm-tree:5.0.3
     |         \--- org.ow2.asm:asm:5.0.3
     +--- project :base:lint
     |    +--- project :base:lint-checks
     |    |    +--- project :base:lint-api
     |    |    |    +--- project :base:sdk-common (*)
     |    |    |    +--- project :base:builder-model (*)
     |    |    |    +--- com.android.tools.external.lombok:lombok-ast:0.2.3
     |    |    |    |    \--- com.google.guava:guava:17.0
     |    |    |    +--- org.ow2.asm:asm:5.0.3
     |    |    |    \--- org.ow2.asm:asm-tree:5.0.3 (*)
     |    |    \--- org.ow2.asm:asm-analysis:5.0.3
     |    |         \--- org.ow2.asm:asm-tree:5.0.3 (*)
     |    \--- org.eclipse.jdt.core.compiler:ecj:4.4.2
     \--- net.sf.proguard:proguard-gradle:5.2.1
          \--- net.sf.proguard:proguard-base:5.2.1

gradle :base:gradle:properties

projectDir: /Users/xxxxx/tools/base/build-system/gradle
になっているので
この辺りにあるみたい
https://android.googlesource.com/platform/tools/base/+/master/build-system

そもそもGradle Pluginは
src/main/resources/META-INF/gradle-plugins/org.samples.greeting.properties
みたいなところに

implementation-class=org.gradle.GreetingPlugin

のような記述をして、そのファイルクラスをPluginとして読みに行くらしい
https://docs.gradle.org/current/userguide/custom_plugins.html

grepして ./gradle/src/main/resources/META-INF/gradle-plugins/com.android.application.propertiesを発見

ソースコードをちょっとだけ読む

これを参考に読む
https://docs.gradle.org/current/userguide/custom_plugins.html

https://android.googlesource.com/platform/tools/base/+/master/build-system/gradle/src/main/resources/META-INF/gradle-plugins/com.android.application.properties に記載されているので、プラグインの実態はこれみたい
android.build.gradle.AppPlugin

https://android.googlesource.com/platform/tools/base/+/gradle-dev/build-system/gradle/src/main/groovy/com/android/build/gradle/AppPlugin.groovy
BasePluginを継承していてこっちがたくさん実装されている
https://android.googlesource.com/platform/tools/base/+/cb896f5/build-system/gradle/src/main/groovy/com/android/build/gradle/BasePlugin.groovy#302

Androidエクステンション android{...}の内容はどこに保管されている?

ここで"android{"から始まるextenstionを設定しているみたい
BasePlugin.groovy

        extension = project.getExtensions().create("android", getExtensionClass(),
                project, instantiator, androidBuilder, sdkHandler,
                buildTypeContainer, productFlavorContainer, signingConfigContainer,
                extraModelInfo, isLibrary());

AppPlugin.groovy

    @Override
    protected Class<? extends BaseExtension> getExtensionClass() {
        return AppExtension.class
    }

AppExtensionはgradle-coreモジュールにある模様
AppExtension
https://android.googlesource.com/platform/tools/base/+/cb896f5/build-system/gradle-core/src/main/groovy/com/android/build/gradle/AppExtension.groovy
BaseExtensionを継承している
https://android.googlesource.com/platform/tools/base/+/cb896f5/build-system/gradle-core/src/main/groovy/com/android/build/gradle/BaseExtension.groovy

ここに実際に、メンバ変数として色んなオブジェクトがあるみたい

public abstract class BaseExtension {
    private String target
    private FullRevision buildToolsRevision
    /** Default config, shared by all flavors. */
    final ProductFlavor defaultConfig
    /** Options for aapt, tool for packaging resources. */
    final AaptOptions aaptOptions
    /** Lint options. */
    final LintOptions lintOptions
    /** Dex options. */
    final DexOptions dexOptions

タスクはどこで作られている?

AppPlugin
https://android.googlesource.com/platform/tools/base/+/cb896f5/build-system/gradle/src/main/groovy/com/android/build/gradle/AppPlugin.groovy#57
ここでApplicationTaskManagerクラスのインスタンスを作って返している

    @Override
    protected TaskManager createTaskManager(
            Project project,
            TaskContainer tasks,
            AndroidBuilder androidBuilder,
            BaseExtension extension,
            SdkHandler sdkHandler,
            DependencyManager dependencyManager,
            ToolingModelBuilderRegistry toolingRegistry) {
        return new ApplicationTaskManager (
                project,
                tasks,
                androidBuilder,
                extension,
                sdkHandler,
                dependencyManager,
                toolingRegistry)
    }

ApplicationTaskManagerは以下のようになっていて
https://android.googlesource.com/platform/tools/base/+/cb896f5/build-system/gradle-core/src/main/groovy/com/android/build/gradle/internal/ApplicationTaskManager.groovy?autodive=0%2F%2F%2F%2F%2F#47

色んなタスクを追加していくみたい

    @Override
    public void createTasksForVariantData(
            @NonNull BaseVariantData<? extends BaseVariantOutputData> variantData) {
        assert variantData instanceof ApplicationVariantData;
        ApplicationVariantData appVariantData = (ApplicationVariantData) variantData;
        createAnchorTasks(variantData);
        createCheckManifestTask(variantData);
        handleMicroApp(variantData);
        // Add a task to process the manifest(s)
        createMergeAppManifestsTask(variantData);
        // Add a task to create the res values
        createGenerateResValuesTask(variantData);
        // Add a task to compile renderscript files.
        createRenderscriptTask(variantData);
        // Add a task to merge the resource folders
        createMergeResourcesTask(variantData, true /*process9Patch*/);

実際にcreateTasksのメソッドが生えているのはTaskManagerクラスみたい
https://android.googlesource.com/platform/tools/base/+/cb896f5/build-system/gradle-core/src/main/groovy/com/android/build/gradle/internal/TaskManager.groovy?autodive=0%2F%2F%2F%2F%2F

Instant Runのコードを追いたい

AOSP上ではブランチがgradleのブランチが1.3までしかみつからないみたいです。
ただjcenterから落としてこれるみたい
http://jcenter.bintray.com/com/android/tools/build/gradle-core/2.0.0-alpha2/gradle-core-2.0.0-alpha2-sources.jar
jar xvf でAndroid Studio 2.0のinstant runのコードが見れる??

com.android.build.gradle.internal.incrementalパッケージが怪しいけど少し見ただけでは全然わからないです。
読める方がいれば読んでまとめてください!

14
15
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?