天天看點

Android 建構 修改apk 包名的gradle 插件 并上傳本地maven 倉庫

         Android 工程打包的時候apk 的名字會使用預設的名字,每次釋出還需要手工修改名字比較麻煩 之前 是在module 的build.gradle 中添加了 groovy 代碼,但是在進行其他項目的時候還需要将代碼添加到新的工程中不是很友善 是以覺得制作一個簡單的gradle 插件 用起來友善點。

        //第一步将建立一個library module ,然後将apply library 修改為 apply groovy 删除 android 等用不到的閉包

        //删除 src 檔案下的 Androidtest test 檔案夾 這些都用不到 隻留下 main檔案夾

        //删除 main 檔案加下 的 res 檔案夾(裡面是Android 的資源檔案 用不到), Androidmanfest 檔案 (android 配置檔案)

        //将java 檔案夾修改為 groovy 

        //在main 檔案夾下 建立 resources 檔案 resources/META-INF/gradle-plugins 路徑格式強制要求

     (建立properties檔案,該檔案名字就是你插件的名字 在其他地方引用的時候 apply 的時候用的就是這個檔案的名字, 我這裡就是  apply plugin: 'com.zjhcsoft.apkname')implementation-class=com.zjhcsoft.fyh.ApkNamePlugin

        //一行代碼 就是你繼承Plugin<Project> 類的groovy 檔案 路徑

Android 建構 修改apk 包名的gradle 插件 并上傳本地maven 倉庫

ApkNamePlugin.groovy 檔案用來實作功能 内容如下:

package com.zjhcsoft.apknameplugin

import org.gradle.api.Plugin
import org.gradle.api.Project

/**
 * @author by nate_fu on 2019/3/6.
 * @version vision 1.0
 * @Email: [email protected]
 * @description: groovy 的文法和Java很相似 我們把之前 寫在 build.gradle 的 修改apk 名字的代碼搬到這裡
 */
 class ApkNamePlugin implements Plugin<Project>{
     @Override
     void apply(Project project) {
         project.extensions.create('apkname',ApkNameExtension)


         project.android.applicationVariants.all { variant ->
             variant.outputs.all { output->
                 //找到工程的 Android 
                 def androidExtensions = project.extensions.findByName("android")
                 //得到versionName
                 def versionName = androidExtensions.defaultConfig.versionName
                             
                 def outputFile = output.outputFile
                 def fileName
                 def apkName = project.extensions.apkname.apkName == "" ? project.name : project.extensions.apkname.apkName
                 if (outputFile!=null&&outputFile.name.endsWith('.apk')){
                     if (variant.buildType.name.equals('release')){
                         fileName = "${apkName}${versionName}.apk"
                     }else if (variant.buildType.name.equals('debug')){
                         fileName = "${apkName}_debug.apk"
                     }
                     outputFileName =fileName
                 }
             }
         }
     }
 }
           
ApkNameExtension.groovy 檔案是自定義的 一些屬性 可以用來傳遞參數
           
package com.zjhcsoft.apknameplugin;

/**
 * @author by nate_fu on 2019/3/6.
 * @version vision 1.0
 * @Email: [email protected]
 * @description:
 */
 class ApkNameExtension {
  String apkName="";
}
           

在這裡我們隻定義了一個apkName  我們在工程中使用這個插件的時候 就可以吧工程的apk 包名傳遞過來。

apkname{
    apkName="test_apk"
}
           

在工程的build.gradle 中使用這個屬性

插件的 build.gradle 我們需要配置一些資訊 包括apply  groovy     添加 gradle 依賴  等

apply plugin: 'groovy'
apply plugin: 'maven'

// maven 本地倉庫路徑
def MAVEN_LOCAL_PATH = uri('../../local_repo')

def ARTIFACT_ID = 'apknameplugin'
def VERSION_NAME = '1.0.0'
def GROUP_ID = 'com.zjhcsoft.fyh'

//加入依賴
dependencies {
    compile gradleApi()
    compile localGroovy()
}

uploadArchives{
    repositories {
        mavenDeployer {
            repository(url: MAVEN_LOCAL_PATH)
            pom.project{
                groupId GROUP_ID
                artifactId ARTIFACT_ID
                version VERSION_NAME
            }
        }
    }
}
           

使用  gradle 的uploadArchives指令  我們添加的 URL 是本地的maven 倉 相對位址  

def ARTIFACT_ID = 'apknameplugin'

def VERSION_NAME = '1.0.0'

def GROUP_ID = 'com.zjhcsoft.fyh'

定義這個插件的三個标記 用于在倉庫中找到這個插件

之後我們可以點選右側的 uploadArchives 指令上傳到本地 倉庫

Android 建構 修改apk 包名的gradle 插件 并上傳本地maven 倉庫

然後我們在檔案夾下就找到了我們倉庫中的插件

Android 建構 修改apk 包名的gradle 插件 并上傳本地maven 倉庫

最後是我們将上傳到本地倉庫的插件在 我們的工程中使用

在工程的根目錄下的 build.gradle中引入本地maven 倉庫

repositories {
        //引入本地maven 倉庫
        maven{
            url uri('../local_repo')
            name 'local-repo'
        }
        jcenter()
        maven {
            url 'https://maven.google.com/'
            name 'Google'
        }
    }
           

再 添加 插件的依賴

dependencies {
        classpath 'com.zjhcsoft.fyh:apknameplugin:1.0.0'
      
    }
           

然後再在我們module 的 build.gradle  中 apply 我們的插件 

apply plugin: 'com.zjhcsoft.apkname' 
           

插件的名字 需要注意使用的就是我們之前建立的 resources  檔案夾下 的 properties 檔案的名字。

繼續閱讀