AndroidStudio3.0下命令行打包自定義輸出路徑和輸出命名

新年伊始

過了雨水節(jié)氣,天氣漸暖,想到了一首非常喜歡的古詩:

王維 <<山居秋暝>>

空山新雨后,天氣晚來秋.
明月松間照,清泉石上流.
竹喧歸浣女,蓮動下漁舟.
隨意春芳歇,王孫自可留.

正題

之前寫過一篇命令行打出多個應(yīng)用包

這一次在之前的基礎(chǔ)上,進(jìn)一步加強(qiáng),實(shí)現(xiàn)修改打包的名稱,自定義輸出apk地址

項(xiàng)目結(jié)構(gòu)

image.png

在工程src目錄下新建:comone comtwo兩個文件夾,主要目的是為了實(shí)現(xiàn)打包出多個apk,當(dāng)然我并沒有在這兩個文件夾里面添加任何東西,如果需要可以參考:命令行打出多個應(yīng)用包

項(xiàng)目下的build.gradle 文件配置

  • 在android{ } 里面配置多個工程包
//根據(jù)項(xiàng)目工程配置出不同的包
flavorDimensions "app"
productFlavors {
    comone {
        applicationId "com.huayi.one"
        dimension "app"
        versionCode 1
        versionName "1.0"
        signingConfig signingConfigs.comone
    }
    comontwo {
        applicationId "com.huayi.two"
        dimension "app"
        versionCode 1
        versionName "2.0"
        signingConfig signingConfigs.comtwo
    }
}

  • 在android{ } 里面配置簽名
signingConfigs {
    comone {
        keyAlias 'huayi_one'
        keyPassword 'qq2016'
        storeFile file('D:\\ASDemo\\keyStore\\comone.jks')
        storePassword 'qq2016'
    }
    comtwo {
        keyAlias 'huayi_two'
        keyPassword 'qq2016'
        storeFile file('D:\\ASDemo\\keyStore\\comtwo.jks')
        storePassword 'qq2016'
    }
}

  • 在android{ } 里面控住輸出路徑
//定義一個裝apk文件路徑的數(shù)組
def fileArray = []
android.applicationVariants.all { variant ->
    variant.outputs.all { output ->
        def outputFile = output.outputFile
        if (outputFile != null && outputFile.name.contains('release')) {
            //獲取每個打包產(chǎn)物
            def variantProd = variant.productFlavors[0]
            def fileName = "huayi_${variantProd.versionName}_${variantProd.versionCode}" + "_${variantProd.name}.apk"
            println "自定義輸出apk的名字:" + fileName;
            outputFileName = fileName;
            println "輸出apk地址:" + outputFile.parentFile.absolutePath + java.io.File.separator + fileName
            fileArray.add(outputFile.parentFile.absolutePath + java.io.File.separator + fileName);
        }

    }
}

  • 在android{ } 里面寫一個apk的復(fù)制重命名的任務(wù)(task)
build {
    doLast() {
        println "任務(wù)1編譯打包完成后需要復(fù)制apk的數(shù)量:" + fileArray.size()
        forEachFile(fileArray)
    }
}

  • 最后在android{ }之外 當(dāng)然是定義一個執(zhí)行復(fù)制命名的方法了
def forEachFile(fileArray) {
    fileArray.forEach { file ->
        //遍歷進(jìn)行文件操作
        println "任務(wù)3遍歷apk文件"
        rename_and_moveout_apk(file)
    }
}


def rename_and_moveout_apk(orignalFile) {
    def intoFile = rootDir.parentFile.getAbsolutePath() + File.separator + "apk"
    copy {
        from orignalFile
        into intoFile
        println "任務(wù)4復(fù)制apk到指定位置:" + intoFile
        rename("${android.defaultConfig.versionName}_${android.defaultConfig.versionCode}_", "")
        println "任務(wù)5修改apk的命名"
    }
}

看看Terminal控制臺結(jié)果

配置上面的一切之后,再AndroidStudio3.0 的Terminal中輸入 : gradle build

  • 看看結(jié)果:


    image.png

    image.png
  • 上面的結(jié)果清晰明了,先編譯打包,最后執(zhí)行復(fù)制命名任務(wù),一氣呵成.

貼出全部build.gradle,不留一點(diǎn)的

apply plugin: 'com.android.application'

android {
    compileSdkVersion 26
    defaultConfig {
        applicationId "com.huayi.app"
        minSdkVersion 15
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    //定義一個裝apk文件路徑的數(shù)組
    def fileArray = []
    android.applicationVariants.all { variant ->
        variant.outputs.all { output ->
            def outputFile = output.outputFile
            if (outputFile != null && outputFile.name.contains('release')) {
                //獲取每個打包產(chǎn)物
                def variantProd = variant.productFlavors[0]
                def fileName = "huayi_${variantProd.versionName}_${variantProd.versionCode}" + "_${variantProd.name}.apk"
                println "自定義輸出apk的名字:" + fileName;
                outputFileName = fileName;
                println "輸出apk地址:" + outputFile.parentFile.absolutePath + java.io.File.separator + fileName
                fileArray.add(outputFile.parentFile.absolutePath + java.io.File.separator + fileName);
            }

        }
    }

    lintOptions {
        abortOnError false
    }
    signingConfigs {
        comone {
            keyAlias 'huayi_one'
            keyPassword 'qq2016'
            storeFile file('D:\\ASDemo\\keyStore\\comone.jks')
            storePassword 'qq2016'
        }
        comtwo {
            keyAlias 'huayi_two'
            keyPassword 'qq2016'
            storeFile file('D:\\ASDemo\\keyStore\\comtwo.jks')
            storePassword 'qq2016'
        }
    }
    //根據(jù)項(xiàng)目工程配置出不同的包
    flavorDimensions "app"
    productFlavors {
        comone {
            applicationId "com.huayi.one"
            dimension "app"
            versionCode 1
            versionName "1.0"
            signingConfig signingConfigs.comone
        }
        comontwo {
            applicationId "com.huayi.two"
            dimension "app"
            versionCode 1
            versionName "2.0"
            signingConfig signingConfigs.comtwo
        }
    }


    build {
        doLast() {
            println "任務(wù)1編譯打包完成后需要復(fù)制apk的數(shù)量:" + fileArray.size()
            forEachFile(fileArray)
        }
    }


}


def forEachFile(fileArray) {
    fileArray.forEach { file ->
        //遍歷進(jìn)行文件操作
        println "任務(wù)3遍歷apk文件"
        rename_and_moveout_apk(file)
    }
}


def rename_and_moveout_apk(orignalFile) {
    def intoFile = rootDir.parentFile.getAbsolutePath() + File.separator + "apk"
    copy {
        from orignalFile
        into intoFile
        println "任務(wù)4復(fù)制apk到指定位置:" + intoFile
        rename("${android.defaultConfig.versionName}_${android.defaultConfig.versionCode}_", "")
        println "任務(wù)5修改apk的命名"
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}

最后

  • 如果有具體問題可以私聊
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末闸翅,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子坚冀,更是在濱河造成了極大的恐慌鉴逞,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件液南,死亡現(xiàn)場離奇詭異叭喜,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)闪幽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門盯腌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人腕够,你說我怎么就攤上這事舌劳。” “怎么了大诸?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵贯卦,是天一觀的道長。 經(jīng)常有香客問我贿堰,道長羹与,這世上最難降的妖魔是什么外遇? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任契吉,我火速辦了婚禮,結(jié)果婚禮上菲语,老公的妹妹穿的比我還像新娘惑灵。我一直安慰自己,他們只是感情好佩憾,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著楞黄,像睡著了一般抡驼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上碎税,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天雷蹂,我揣著相機(jī)與錄音杯道,去河邊找鬼。 笑死虐杯,一個胖子當(dāng)著我的面吹牛昧港,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播创肥,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼叹侄,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了趾代?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤禽捆,失蹤者是張志新(化名)和其女友劉穎胚想,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體浊服,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年鸿吆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了惩淳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乓搬。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡进肯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出学辱,到底是詐尸還是另有隱情,我是刑警寧澤策泣,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布萨咕,位于F島的核電站火本,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏茫陆。R本人自食惡果不足惜擎析,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一叔锐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦解取、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽秉扑。三九已至调限,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間秦躯,已是汗流浹背裆装。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留哨免,地道東北人琢唾。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓慧耍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親煌珊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,099評論 25 707
  • 這一章主要針對項(xiàng)目中可以用到的一些實(shí)用功能來介紹Android Gradle踪危,比如如何隱藏我們的證書文件,降低風(fēng)險(xiǎn)...
    acc8226閱讀 7,610評論 3 25
  • 1.介紹 如果你正在查閱build.gradle文件的所有可選項(xiàng)畴博,請點(diǎn)擊這里進(jìn)行查閱:DSL參考 1.1新構(gòu)建系統(tǒng)...
    Chuckiefan閱讀 12,131評論 8 72
  • 循著前世的足跡俱病,與今生的輪回里與你相約。 彈指一揮間亮隙,時(shí)光已過了千年。千年前的那一天维费,你輕撫玉笛與窗前,幽婉的笛聲...
    悟姑娘閱讀 715評論 0 1
  • 班上聚餐,她照顧其它同學(xué)最后才落座硼砰。 一抬頭,對面坐著的他恶阴,讓她慶幸自己的照顧豹障。 席間,大家調(diào)侃他該找個女朋友...
    椿丫閱讀 401評論 0 3