精选案例技术文章Android基础

gradle知识点总结分享

2017-09-12  本文已影响421人  NoValue

本文原作者为:kale2010 .blog地址:http://www.cnblogs.com/tianzhijiexian/
微博:https://weibo.com/shark0017

Gradle技巧


全局配置

Android工程的每个module都有一个自己私有的build.gradle(绿色部分),而整个项目的根目录中也有一个build.gradle(灰色部分),我们这里谈论的全局配置基本都是在根build.gradle中进行的。

2.配置maven的url为本地地址:

allprojects {
    repositories {
        maven {
            // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
            url "$rootDir/module_name/libs/android" // 路径是根据放置的目录来定的
        }
    }
}

3.正常使用:

dependencies {
    implementation 'com.facebook.react:react-native:0.32.0'
}

这里用到了$rootDir来屏蔽多个开发者机器环境的差异性,保证了项目的兼容性。

依赖冲突

我们依赖本地jar的时候可能会出现jar中也打包了别的库代码的情况,如果是aar我们可以通过gradle来做处理,但在面对依赖冲突的时候,jar文件就变得令人棘手了。

shevek/jarjar是一个再次打包工具,它可以为我们提供一次性更换包名的功能,是一个解决一来冲突的利器。

它还提供了gradle的脚本来操作你依赖的jar文件:

dependencies {
    // Use jarjar.repackage in place of a dependency notation.
    compile jarjar.repackage {
        from 'com.google.guava:guava:18.0'

        classDelete "com.google.common.base.**"

        classRename "com.google.**" "org.private.google.@1"
    }
}

这回我们尝试通过手动的方式来操作gson.jar,我们希望把原本的com.google.gson的包换为com.gg.gson

1.先建立一个rule.txt的文本文件,内容:

rule  com.google.gson.** com.gg.gson.@1

2.执行命令:

java -jar jarjar.jar process rule.txt gson.jar gg.jar

执行后我们可以看到在当前目录生成了一个gg.jar的文件,分析后就可以发现其内容已经变了:

image_1bpo183ba1jhu1u7g5ibmln2m423.png-20.9kBimage_1bpo183ba1jhu1u7g5ibmln2m423.png-20.9kB

jarjar并不提供修改META-INF的功能,但这并不影响我们使用。

如果你想要删除特定包或特定的类,那么就在rule.txt中加入zap命令。

rule  com.google.gson.** com.gg.gson.@1

zap com.google.gson.reflect.TypeToken // 删除某个类

zap com.google.gson.stream.**

zap com.google.gson.annotations.**

zap com.google.gson.internal.**

原始的gson:

image_1bpo1tnunvgabiki9jsl813m12g.png-29.3kBimage_1bpo1tnunvgabiki9jsl813m12g.png-29.3kB

删除后:

image_1bpo1u8rk179i1991qurps81igr2t.png-16.8kBimage_1bpo1u8rk179i1991qurps81igr2t.png-16.8kB

除了上面提到的rule、zap外还是有keep。首先zap会删除需要删除的所有类,然后执行rule替换符合要求的类,最后如果配置了keep的话,将不符合规则的所有类的移除,只保留keep指定的包。总结来说,这三条命令的执行优先级是:zap > rule > keep。

需要注意的是:jarjar无法支持反射,如果jar包内有使用反射调用的情况,替换操作是十分危险的

另一个插件dinuscxj/ClassPlugin还提供了替换依赖中的类的功能,有兴趣可以尝试一下。

题外话:

对于aar文件,我们只有将aar解压后对解压的jar进行处理,最后再打包成aar。

资源管理

多个manifest
指定资源目录
微信组件化
替换资源的前缀

还没有写!!!!!

总结

还没有写!!!!!

上一篇 下一篇

猜你喜欢

热点阅读