Gradle 플러그인 시작

12895 단어 groovy
안드로이드가gradle을 사용하여 포장하는 응용 프로그램이 점점 보편화되고gradle 포장의 형식이 점점 다양해지고 있다.butterknife는 R2 파일을 생성하기 위한 플러그인을 사용자 정의합니다.tinker는 diff를 만들기 위해 플러그인을 사용자 정의했습니다.플러그인을 쓰면 자신이 포장하는 과정을 더욱 뚜렷하게 볼 수 있을 뿐만 아니라 플러그인을 잘 쓰는 것도 포장하는 절차에 대해 매우 익숙해야 한다.물론 이 글은 플러그인을 사용자 정의하는 방법과 간단한 패키지 명령과 설정을 간단하게 소개하는 깊이가 없다.플러그인으로 할 수 있는 일이 너무 많아요.
사용자 정의Gradle Plugin
  • 자바 library 모듈을 새로 만듭니다.
  • apply plugin: 'java'
    apply plugin: 'groovy'  // gradle library
    
    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        compile gradleApi()
    }
    
    sourceCompatibility = "1.7"
    targetCompatibility = "1.7"
    
    
    group='com.egos.gradle.plugins'
    name='pluginsample'
    version='0.0.1'
  • 새 클래스 (.groovy) 계승Plugin을 만들면 간단한 플러그인이 정의됩니다.
  • //          groovy, .groovy      
    package com.egos.gradle.plugins;
    class SamplePlugin implements Plugin<Project> {
        protected final Logger log = Logging.getLogger(getClass());
    
        void apply(Project project) {
            println 'This is a sample plugin.'
        }
    }
  • 생성.properties는 플러그인 실행 클래스를 지정하고 로컬에 발표합니다. (gradle upload Archives를 호출해서plugin을 로컬에 발표할 수 있습니다.)main 디렉터리 아래에 만들기 resources/META-INF.gradle-plugins/com.egos.gradle.properties.
  • #          com.egos.gradle。
    implementation-class=com.egos.gradle.plugins. SamplePlugin
    실행gradle uploadArchives은 로컬 창고에 발표됩니다.
    apply plugin: 'maven'
    
    group='com.egos.gradle.plugins'
    name='pluginsample'
    version='0.0.1'
    
    uploadArchives {
        repositories {
            mavenDeployer {
                repository(url: uri('../repo'))
            }
        }
    }
  • Gradle Plugin을 사용합니다.전역적으로 (루트 디렉터리에서build.gradle) 사용하거나 모뎀에서 사용할 수 있습니다.설정이 완료된 후에 패키지를 실행할 때 This is a sample plugin. 출력을 볼 수 있습니다.
  • buildscript {
        repositories { //       
            // jcenter() //      jcenter  
            maven { //           maven 。
                url uri('../repo')
            }
        }
        dependencies {
            classpath 'com.egos.gradle.plugins: pluginsample:0.0.1'
            //        jar        ,      
            // classpath fileTree(dir:'../pluginsample/build/libs', include: ['*.jar']) }
    }
    
    apply plugin: 'com.egos.gradle'
  • 고급 용법.위의 간단한 데모를 보면 아무런 실제적인 작용이 없다. 다음은 몇 가지 예를 들자.
  • (1)build.gradle의 코드가plugin으로 이동합니다.작용은 같지만 디버깅이 편리하고 쓰기가 편리하다(build.gradle는 디버깅이 불가능하며 개인적인 감각 효율이 비교적 낮다).그리고 만약 필요한 작업이 너무 복잡하다면, 예를 들어 파일을 생성할 때build에 쓰십시오.gradle 중에 더 불편해.
    //    SamplePlugin apply       。
    project.afterEvaluate {
        //  preDebugBuild  ,      Action
        project.tasks.getByName("preDebugBuild") {
            it.doFirst {
                println "preDebugBuild doFirst"
            }
        }
    }
    (2) 고급 방법을 정의한다.맨 앞에 소개된 Tinker는gradle을 사용하여 diff를 생성할 수 있다.마찬가지로 디버깅과 테스트가 편리합니다.
    Gradle Plugin 디버그
    위에서 줄곧 디버깅 플러그인을 말하고 있는데, 플러그인은 어떻게 디버깅해야 합니까?이 질문은 자신을 괴롭혔습니다. 지금까지jar 패키지 경로를 통해 플러그인의 경로를 지정해 왔습니다. 매번 로그 정보를 출력해서 보고 방법을 찾았습니다(다음 참고로 Intellij/Android Studio 디버깅Gradle Plugin).여기에도 일부 내용을 쓰고, 다른 것은 위의 블로그를 참고할 수 있다.
  • 먼저 위에서 Gradle Plugin 작업을 사용하여 플러그인 주소를 지정해야 합니다.지정한 일 원격 창고나jar 주소는 디버깅할 수 없습니다.
  • buildscript { repositories { maven { //           maven 。 url uri('../repo') }
        }
        dependencies { classpath 'com.egos.gradle.plugins: pluginsample:0.0.1' }
    
    apply plugin: 'com.egos.gradle'
  • 디버깅이 필요한 내용을 선택합니다.
  • //  terminal       。   gradlew assembleDebug      ,    gradle assembleDebug
    gradlew assembleDebug -Dorg.gradle.daemon=false -Dorg.gradle.debug=true
    일반gradle 명령
    gradle tasks //   task  
    gradle dependencies //       
    gradle assembleDebug //   Debug
    gradle :app:tasks // app(module  )         module 。            。
    gradle lint // lint  
    build.gradle 자주 사용하는 설정
  • sourceSets:프로필 디렉터리
  • android{
        sourceSets {
            main {  //         
                manifest.srcFile 'AndroidManifest.xml'
                java.srcDirs = ['src']
                resources.srcDirs = ['src']
                aidl.srcDirs = ['src']
                renderscript.srcDirs = ['src']
                res.srcDirs = ['res']
                assets.srcDirs = ['assets']
                jniLibs.srcDirs = ['libs']
            }
    
            test { //    java    
                java.srcDirs = ['test/java']
            }
    
            xxFlavor { //   flavor     ( Build Variant       flavor           flavor   )
                manifest.srcFile 'xxFlovar/AndroidManifest.xml'
                java.srcDirs = ['xxFlovar/java']
                res.srcDirs = ['xxFlovar/res']
            }
    }
  • productFlavors: 다른 패키지 구성
  • android {
        deft{}  //    
        removeAd{} //       
        ...etc
    }
  • signingConfigs: 서명 구성
  • adroid {
        signingConfigs {
            config {
                storeFile "key.store"
                storePassword "key.store.password"
                keyAlias "key.alias"
                keyPassword "key.alias.password"
            }
        }
    }
  • buildTypes: 패키지별 구성
  • android {
        buildTypes {
            haha { //             ,     haha,      debug release
                minifyEnabled true
            }
            debug {
                signingConfig signingConfigs.config
            }
            release {
                //   Manifest       
                manifestPlaceholders = [UMENG_CHANNEL_VALUE: "umeng_xx"]
                minifyEnabled true //     
                signingConfig signingConfigs.config  //     
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard.cfg'  //       
            }   
        }
    }
    
    //   Manifest       ,         AndroidManifext.xml          
    "UMENG_CHANNEL"
        android:value="umeng_${UMENG_CHANNEL_VALUE}"/>  // manifestPlaceholders   
  • applicationVariants
  • android {
        applicationVariants.all { variant -> }
    }
  • 기타 주요 구성
  • android {
        defaultConfig {
            multiDexEnabled true  //    dex 
        }
        lintOptions { //      false,lint       
            abortOnError false
        }
        dexOptions {
            incremental false
            preDexLibraries = false
            jumboMode = true
        }
        packagingOptions {
            exclude 'META-INF/LICENSE.txt' //          
            exclude 'META-INF/NOTICE.txt'
        }
    
        ndk {
            abiFilters 'armeabi' //   ndk   ,       arm   so  
        }
    }
    컴파일 정보 구성
    gradle build 설정 정보.예: gradle build -xx -yy.실제로 사용할 때는 모형을 하나 만들어야 한다.gradle build-Pxx=xx - Py=yy - Pxx는 고정된 모델/build입니다.gradle에서 Properties()는 안의 속성, 프로젝트(org.gradle.api.Project, 하나의 프로젝트에 해당)에 해당합니다.android –defaultConfig – 아래에서buildConfigField 정보를 설정할 수 있습니다.
    // build.gradle  
    // gradle build -Phaha="  "
    Properties buildProperties = new Properties();
    buildProperties.put("haha", "  "); //        
    
    //      haha  
    if(project.hasProperty("haha")){  
       buildProperties.put("haha",project.property("haha"))
    }
    android {
        defaultConfig {
            //    BuildConfig 。
            buildConfigField("String", "haha", "\"" +buildProperties.get("haha") + "\"")
        }
    }
    사색
    2015 프로젝트 코드가 Eclipse에서 AS로 옮겨졌을 때를 떠올리면build.gradle은 매우 신비로운 것이다. 나중에 일부 플러그인을 접했고 자신도 몇 가지 (포장이 끝난 후에 지정한 폴더로 출력하는 등)를 썼다. 지금까지 원본 코드를 볼 때 많은 라이브러리에서groovy를 통해 자신의 플러그인을 썼다.build.gradle은 더 이상 신비로운 것이 아니다. 설정이 원래 많을수록 프로젝트가 커지면서 너무 비대해 보인다. (원본 파일이 아닐 수도 있고 항상 비대해 보일 수도 있다.)아마도 비교적 복잡한 임무들을build에서gradle에서 처리를 벗어나 플러그인으로 쓰는 것은 더 좋은 해결 방안으로 디버깅도 편리하고 복용도 편리하다.
    문제.
  • 정제판 apk는 어떻게 칩니까?실제 프로젝트에는 항상 여러 개의flavor가 있을 수 있고 포장된 코드가 다를 수 있습니다. 예를 들어 기본 패키지, 광고 패키지가 하나 있지만 초기화된 조작을 사용할 수 있습니다. 어떻게 포장할 때 초기화된 조작을 모두 제거합니까?
  • 참고 자료
    사용자 정의Gradle 플러그인 Intellij/Android Studio 디버깅Gradle Plugin Android 공식 기술 문서 번역--Gradle 플러그인 사용자 안내서(7)

    좋은 웹페이지 즐겨찾기