快捷搜索:

您的位置:澳门新葡4473网站 > 项目 > 【译】一步一步为Android实现Gradle插件

【译】一步一步为Android实现Gradle插件

发布时间:2020-04-21 19:31编辑:项目浏览(194)

    Android Studio 3.4.2 牢固版发表了,新版进级了品质和平稳,并修复了一部分 Bug。更新内容如下:

    此文翻译自Create a Standalone Gradle plugin for Android - a step-by-step guide,作者AfterEcho。

    Gradle

    下文中的“我”均代表原来的书文者。

    • Issue #131167099: Gradle Sync error: 未有为属性 'manifestOutputDirectory' 钦点值

    ============正文分界线==========

    IntelliJ

    正文中本身会详细描述从零开首为安卓创立二个Gradle插件所需的步骤。从作者写了小编的第一篇小说Monkeying around with gradle to generate code后来,小编就有写这么一篇小说的主见了。而目前Annyce Davis在caster.io上写的Gradle Plugin Basics点燃了自家去得以完成这么些主张。

    • Issue #124680708: Git Push 从 IDE 崩溃

    本人意识为Android Studio创制独立的gradle插件非常拮据。即便有非常多文书档案,然则那个文书档案就像是总是贫乏一些怎么样。你试过谷歌(Google卡塔尔寻找create a gradle plugin for android啊?小编搜过,但收获的结果用场相当小。

    Shrinker (R8)

    甚至gradle本人在此个主题材料上的文档都接济超小。关于创设独立工程的一对只提到了何等在build.gradle增多几行代码,以至编写properties文件,并未关联如何进展build。而有关公布的一部分假定了你了然公布并盘算将插件公开揭露。可是只要小编只想生成插件并本地使用,或许只想尝尝一下是或不是能健康运作吧?

    • Issue #131167099: Gradle Sync error: 未有为属性 'manifestOutputDirectory' 钦点值
    • Issue #131140696: AbortException: Error: 编写翻译时期碰到未定义的值
    • Issue #131207184: Android Studio 3.5 Canary 13 - 编写翻译时期遭逢未定义的值、无效的 dex 输入
    • Issue #130789358: java.lang.IllegalArgumentException: 具有相似键的几个条约
    • Issue #131443760: Android Gradle 插件 3.5.0-阿尔法13 因 ENVISION8 1.5.20-dev (build a85ccd499f6d149322870a8aedddc92152071a01卡塔尔 营造相当而倒闭
    • Issue #131505760: Wrangler8 不帮助字段上的 obfuscationdictionary

    万一想要作为Android Studio编写翻译过程的一某些来运转吧?有未有一些子?

    发通告示

    本文中自个儿不会覆盖你恐怕想完毕的各项意况。不过本身做过的调查研究能够提供二个好的源点。

    下载地址:

    接下去正式启幕。

    (文/开源中国State of Qatar    

    0 假设

    小编会假定你已经安装好Android开垦条件,满含安装Java、Android Studio和切合的编写翻译工具。作者以为这是个成立的只要,要是您是个Android开采新手,你不太大概一上来就想要编写gradle插件。

    从你的角度来说,你得只要小编并不驾驭gradle。小编其实并不打听多少gradle相关知识。我所写的是自己钻探得出的结论,是对本人的话有效的不二等秘书诀。假诺您愿意的话,你也足以假使作者是个帅到炸裂何况健谈的人。可是对于本文的目的而言,这么些都不是必需的。

    1 基本配置

    那是一个本身一心没办法找到任何详细新闻的步子。而这只是主题的铺排而已。

    安装groovy和gradle。在自笔者的Mac上本人是用Homebrew安装的。你也能够一向下载。

    Android Studio是定制化的英特尔lJ。但它并不适用于编写独立Gradle插件。假如你新建四个工程,这几个工程会平素是Android工程。那很客观,因为它就是编写Android专项使用的。所以率先步,下载并设置英特尔liJ。

    从https://www.jetbrains.com/idea/得到社区版。撰写本文的时候版本是15.0.3。假如您在以往的某部时间阅读本文,而自己又从不改正到新版的话,你就需求和睦去消除版本差距了。

    社区版是免费的,况兼能缓和我们的急需。假若您使用过Android Studio,你就能够感到界面特别领悟。(对用Eclipse的就只能说抱歉了。)

    设置英特尔liJ。全体的选项都暗中同意就可以。就算你真的想编写插件,确认你安装了groovy,gradle和maven。

    安装完结之后,运转IntelliJ,点击Create New Project。若是一切平常的话,你会看见如此三个窗口:

    图片 1

    假设侧面栏未有Gradle只怕右侧栏未有Groovy那么你可能缺乏须求的插件。这样的话点击Cancel,从主显示器点击Configure -> Plugins,安装插件,同样重视复新建筑工程程。

    一经Project SDK未有呈现Java版本,点击New...按键,选择你的Java安装路线。

    勾选Groovy,点击Next

    在下一屏你必要填写GroupID和ArtifactId。就算你能够随意命名,我们仍然刚毅不屈古板。GroupID和你开辟Android app同样使用集团域名,而ArtifactId使用插件的名目。(本文中自己动用com.afterecho作为GroupID,blogpost用作ArtifactId。)一时半刻不用去管版本(最近是1.0-SNAPSHOT),点击Next

    下一屏中不要做别的变动。暗中同意提议“Use default gradle wrapper”,大家有如何身份反对吗?点击Next

    在下一屏中您很恐怕也无需做其它改换。除非你想修改工程路径。达成之后,点击Finish

    2 旅途开首

    英特尔liJ成立工程产生后,你会专心到工程中完全非常不够source目录。在工程树的顶端右击,接受New,然后Directory

    图片 2

    输入路线名src/main/groovy。假使一切符合规律,groovy文件夹的颜料会与其余文件夹分化,提示这是多个source文件夹。

    图片 3

    假定你右击groovy文件夹你会看见,在New接纳下,你能够新建package和class,并非只可以新建文件和目录了。

    匡正类的概念,扩大implements Plugin<Project>,像这样:

        class BlogPlugin implements Plugin<Project> {
        }
    

    跟着你会开采Project类是未定义的。自动import在此边也是那三个的。

    3 编写翻译配置

    咱俩终将缺了什么样。为何不或许import Project呢?据Gradle的文书档案所说,大家把:

    dependencies {
      compile gradleApi()
      compile localGroovy()
    }
    

    添加到build.gradle。这很好。将这两行增添到build.gradle中本来就有的dependecies块。

    BTW,当您第叁遍加载build.gradle文件的时候英特尔liJ也许会唤醒“You can configure Gradle wrapper to use distribution with sources. It will provide IDE with Gradle API/DSL documentation.”,那应该是OK的,点击确认就好了。假使您没看出这一个,恐怕你的英特尔liJ极小钟爱你。但是没什么,那不会听得多了就能够说的详细大家继续编码。

    这两行注重加多好之后大家就足以回来Plugin类并且应用电动import作用了,对啊?有十分的大恐怕。

    借让你在遇到上边所说的提醒以前加多了信任,而且点击了规定的话,那么就实乃足以了。或者会有七个类可供import,注意选包名是org.gradle.api的那个。

    假定你的操作顺序不是如此的,那么那么些类就如故是缺点和失误的。笔者操作的时候发掘唯有一个org.apache.tools.ant.Project,不过这一个是错的。

    小编相比习于旧贯用Android Studio,在这里个里面当您向build.gradle中增添信任之后Android Studio会告诉你二只工程(Sync the project)。不过英特尔liJ不会。你须求手动同步。每便向build.gradle中增多信任都亟待手动同步一遍。

    如何是好联合啊?点击View菜单,选Tool Windows,然后Gradle

    图片 4

    Gradle窗口张开未来,点击左上角的刷新按键。

    图片 5

    您早晚无法想像本人在不得已导入Project类那事上浪费了微微日子。

    导入ProjectPlugin四个类之后你就能够看来类定义这一行上面桃红的波浪线了。大家要求完毕一个抽象方法。

    4 apply插件本人

    缺点和失误的办法是apply()。使用IntelliJ的intention快捷键(CTRL + Return,ALT

    • Return,决议于你的操作系统和飞速键配置)自动抬高方法。

    这里有一些法力。就算您在apply()中放多个println,你会在编译时看到消息输出产生在编写翻译刚起始的每日,在别的有含义的步子在此之前。那断定是一贯不用的。

    之所以这是做哪些用的吧?大家得以在这里间创办Gradle Task,用于在相符的小时动作。

    (为了简化剩下的办事,假定小编创建的插件类叫作BlogPlugin,包名com.afterecho.gradle。注意插件的包名和GroupID并不强逼相符。)

    那是大家成立Gradle Task的位置。最简易的状态,我们创建叁个仅仅在手动调用的时候才会试行的Task,权且不去酌量嵌入编写翻译流程的场地。在Android插件的task集中也可以有肖似的Task,叫作uninstallAll,它会从有着已三回九转的设施上卸载全体build和flavor配置的app。在健康的编写翻译进度中并不会试行uninstallAll,它必须要手动运维。

    咱俩创设八个名号为showDevices的Task,它归纳地实行adb devices

    将以下代码填入apply()

    @Override
    void apply(Project target) {
        def showDevicesTask = target.tasks.create("showDevices") << {
            def adbExe = target.android.getAdbExe().toString()
            println "${adbExe} devices".execute().text
        }
        showDevicesTask.group = "blogplugin"
        showDevicesTask.description = "Runs adb devices command"
    }
    

    很简短。成立了一个task,名称showDevices。这个task会获取adb的路线,并试行三个command。工程(target)具备叁个android属性(//译者注:这里的“属性”是指groovy中的property概念,下文均依此翻译),大家得以从那脾性格获取一些可行的消息。在这里间,大家能够获得adb的路径。

    设置description是为了提供贰个验证,在运行./gradlew tasks要么查看Android Studio中的作用提示时得以看来这些注脚,让使用者通晓那一个task的功效,那样对使用者尤其和谐。

    最后大家的类像那样:

    package com.afterecho.gradle
    
    import org.gradle.api.Plugin
    import org.gradle.api.Project
    
    class BlogPlugin implements Plugin<Project> {
        @Override
        void apply(Project target) {
            def showDevicesTask = target.tasks.create("showDevices") << {
                def adbExe = target.android.getAdbExe().toString()
                println "${adbExe} devices".execute().text
            }
            showDevicesTask.group = "blogplugin"
            showDevicesTask.description = "Runs adb devices command"
        }
    }
    

    接下去大家怎么使用这一个插件呢?那又是一件令人寒心的事。笔者尝试了很三种措施去生成叁个Jar文件来放置指标工程内,但是都未果了。而作者并不想将这几个刚刚写出来的插件公布到Maven Central也许JCenter上去。

    5 使用repo

    你能够在当羊眼半夏件系统创设相像maven的repo。Yay!

    在你的机械上有个别地点成立叁个索引。这里我们须要重新改正build.gradle,将以下代码增多到终极:

    apply plugin: 'maven'
    
    uploadArchives {
        repositories {
            mavenDeployer {
                repository(url: uri('repo'))
            }
        }
    }
    

    将'repo'替换为您的目录的全路线。纵然您像自身相符独自写一个'repo',它会进来plugin工程下的'repo'目录。那也会有个好处,你能够直接在AMDliJ中查看它。

    绝不忘调出Gradle工具窗口并点击刷新。将窗口保留在张开状态,你拜会到二个新的task:uploadArchives

    图片 6

    双击uploadArchives来运营它。第叁回运营的时候你会在console中来看音讯说无法找到metadata。不用惦念,metadata会自动创设,后续的施行就不会并发提醒了。

    只要您展开repo目录,你会意识如下文件:

    图片 7

    那正是您本身的maven repo了。:卡塔尔

    能够观望种种文件都带有的时候间戳。那是因为你钦赐了这一遍build是三个快照(snapshot)。(还记得刚开首的时候暗许的本子号吧?)每一趟你运维uploadArchives任务的时候,都会成立一组时刻戳不一致的公文。

    为了防止把业务搞复杂,在build.gradle文本里把版本号后边的"-SNAPSHOT"去掉,删除repo目录下的文本,然后再次执行uploadArchives

    6 索求你的插件

    我们需求另叁个文件来报告Gradle大家的插件在哪些类里面。回到大家的工程结构,右击"main",并创建目录resources/META-INF/gradle-plugins

    图片 8

    在此个目录下开创二个新文件。文件名称为您给plugin取的名字带上后缀".properties"。

    不推荐您把名字称为com.android.application。笔者那边用名字com.afterecho.blogplugin.properties

    在这里个文件里增加一行,implementation-class='你实现的Plugin<Project>`的子类的全限制名。作者那边的值正是:

    implementation-class=com.afterecho.gradle.BlogPlugin
    

    7 发布

    重复运转uploadArchives职分。现在我们得以有的时候离开英特尔liJ,去到Android Studio的条件下了。

    始建八个新的Android工程,大概张开一个你原本的工程。打开工程(project)层级的build.gradle,在buildscript块内的repositories块下增添

    maven {
        url uri('/path/to/the/repo/directory/created/earlier')
    }
    

    (将路线改为你此前放置repo的路子。)你的工程就足以到那个目录下寻觅插件了。

    buildscript内的dependencies块下增添

    classpath 'com.afterecho.gradle:blogpost:1.0'
    

    这一句注明了安卓编写翻译依赖于我们的插件。这里的名目与大家刚早先创建插件的时候有关。第多少个冒号前的是GroupId,多个冒号之间的是ArtifactId

    假设您的工程是新创制的,此时文件应该长这么:

    buildscript {
        repositories {
            jcenter()
            maven {
                url uri('/tmp/repo')
            }
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:1.5.0'
            classpath 'com.afterecho:blogpost:1.0'
            // NOTE: Do not place your application dependencies here; they belong
            // in the individual module build.gradle files
        }
    }
    
    allprojects {
        repositories {
            jcenter()
        }
    }
    

    当今展开模块(module)级别的build.gradle,在apply plugin: com.android.application以往加多

    apply plugin: 'com.afterecho.blogplugin'
    

    此间是填充PluginId之处——还记得properties文件的名字吧?

    计算一下多少个概念:
    · GroupId
    · ArtifictId
    · PluginId

    PluginId能够和GroupId以至ArtifactId完全毫无干系,不过平时的话不应有那样命名。

    Android Studio这时候应该会供给Sync了。奉行它。可是那个时候结果有一点点令人扫兴:并不曾非常的气象时有发生。

    8 结尾步骤

    平素不现象的来头是就算大家创设了贰个task,不过并未调用它。你能够从Android Studio里的Gradle工具窗口进行它。

    开采"blogplugin"块,能够看看showDevices。即使您在上头悬停鼠标,你能够看出我们事情发生前设定的职分描述。双击showDevices,静待窗口输出结果。

    您也足以从工程目录下的命令行运维task。实行:

    ./gradlew tasks
    

    您能够看看"Blogplugin tasks"模块下有大家的"showDevices",并会显得描述。再施行

    ./gradlew showDevices
    

    那般我们就马到成功调用了我们的首先个gradle插件。笔者精通这还平素不实际的功力,不过那是贰个起来。在后续的博客里作者会继续深切掌握什么编写具备实际成效的gradle插件。

    本文由澳门新葡4473网站发布于项目,转载请注明出处:【译】一步一步为Android实现Gradle插件

    关键词: