gradle 源码阅读相关

343 阅读1分钟
1.NamedDomainObjectContainer

来自 [www.jianshu.com/p/167cd4b82…]

class MyTestDomainObj {
    //必须定义一个 name 属性,并且这个属性值初始化以后不要修改
    String name
    String arr
    public MyTestDomainObj(String name) {
        this.name = name
    }
    void myArr(String arr) {
        this.arr = arr
    }
    String toString() {
        return "name = ${name}, arr = ${arr}"
    }
}
//创建一个扩展
class TestExtension {
    //定义一个 NamedDomainObjectContainer 属性
    NamedDomainObjectContainer<TestDomainObj> testDomains
    
    public TestExtension(Project project) {
        //通过 project.container(...) 方法创建 NamedDomainObjectContainer 
        NamedDomainObjectContainer<TestDomainObj> domainObjs = project.container(TestDomainObj)
        testDomains = domainObjs
    }

    //让其支持 Gradle DSL 语法
    void testDomain(Action<NamedDomainObjectContainer<TestDomainObj>> action) {
        action.execute(testDomains)
    }

    void test() {
        //遍历命名领域对象容器,打印出所有的领域对象值
        testDomains.all { data ->
            println data
        }
    }
}
//创建一个名为 test 的 Extension
def testExt = getExtensions().create("test", TestExtension, project)

test {
    testDomain {
        domain2 {
            msg "This is domain2"
        }
        domain1 {
            msg "This is domain1"
        }
        domain3 {
            msg "This is domain3"
        }
    }   
}

task myTask << {
    testExt.test()
}

2. 获取dependencies下implementation相关的aar
task getPrintln(name: "getManifest", group: "asm") {
    doLast {
        //输出 implementation
        configurations.all { item ->
            if (item.name == "implementation"){
                item.getDependencies().all{data ->
                    if (data instanceof ProjectDependency){
                        println "------------" + data.dependencyProject.name
                    }else if (data instanceof Dependency){
                        def str = "------------" + data.getGroup() 
                        		+ ":" + data.getName() 
                        		+ ":" + data.getVersion()
                        println str
                    }else{
                        println data.getClass().getName();
                    }
                }
            }
        }
    }
}

3. ImmutableMap
//创建ImmutableMap:
Map<String,Object> immutableMap = new ImmutableMap.Builder<String,Object>().build();
//在创建时放值
Map<String,Object> immutableMap = new ImmutableMap.Builder<String,Object>()
    .put("k1","v1")
    .put("k2","v2")
    .build();
//创建后不能更改
immutableMap.put("k1","v3");//会抛出java.lang.UnsupportedOperationException
ImmutableMap中key和value均不能为null,放入null值会抛出NPE
ImmutableMap的使用场景:

适合
确定性的配置, 比如根据不同的key值得到不同的请求url
写单元测试

不适合
key, value为未知参数, 可能有null产生的情况