AndroidStudio多渠道打包之路一-----aar包改名

前言

很早之前做了個aar的依賴庫,但是給到對方開發(fā)人員都是同一個名字,導致對方覺得管理不方便,請求做個類似多渠道打包的控制,于是開始了自己的aar包修改命名之路。

如何修改打包后的aar包名字

修改apk包的名字相信大家都不陌生,因為這個需求對于Android開發(fā)來說再平常不過了,需要多渠道打包,重命名apk名字等
這里就先用給apk包修改名字為引,因為aar包改名基本一致。

gradle配置多渠道打包apk相應(yīng)配置

在項目文件app下的build.gradle中的android{}模塊下配置混淆壓縮:

 buildTypes {
        debug {
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release
        }
        release {
            minifyEnabled false
            zipAlignEnabled true
            buildConfigField "boolean", "LOG_DEBUG", "false"
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release
        }
    }

這里發(fā)布debug或release的相應(yīng)配置。

多渠道打包需要創(chuàng)建和buildTypes的同級別的productFlavors來實現(xiàn),如:

   //配置多版本的apk
    productFlavors {
        Offline {
            applicationId "com.bm.*****.beta"
            manifestPlaceholders = [app_name: "測試粑粑", icon: "@drawable/common_app_icon"]
            resValue("string", "baseUrl", "http://192.168.1.35/")
        }
        Online {
            applicationId "com.bm.*****"
            manifestPlaceholders = [app_name: "正式粑粑", icon: "@drawable/common_app_icon"]
            resValue("string", "baseUrl", "http://haha.cheche.com/")
        }
    }

這樣就配置了兩個版本渠道Offline和Online,并對不同的baseUrl參數(shù)進行定義,在響應(yīng)的java代碼中獲取該參數(shù)的方法是:

Application.getContext().getResources().getString(R.string.baseUrl);

自定義發(fā)布包的名字:

 applicationVariants.all { variant ->
        variant.outputs.all { output ->  // each 改為 all
            def fileName = "CheMiClientApp_" + buildType.name + "_V" + defaultConfig.versionName + ".apk"
            def outFile = output.outputFile
            if (outFile != null && outFile.name.endsWith('.apk')) {
                outputFileName = fileName  //  output.outputFile 改為 outputFileName
            }
        }
    }

這個是AS升級到3.0以后的配置方式,AS3.0之前的配置方式會報錯。

AS3.0之前的配置:
想要生成的apk中加上版本號,或者當前的時間等信息,該如何生成呢?
以上邊為例,我想要offline的版本加上版本號和當前日期,格式為app_offline_debug_v1.0-20170419.apk這樣的格式!

首先我們需要在build.gradle根目錄,定義得到當前日期的函數(shù):

def releaseTime() {
    return new Date().format("yyyyMMdd", TimeZone.getTimeZone("UTC"))
}

然后在build.gradle中android{}標簽下,添加:

//在apk文件后邊生成版本號信息
android.applicationVariants.all {
    variant ->
        variant.outputs.each {
        output -> output.outputFile = new File(output.outputFile.parent, "app_" + productFlavors[0].name + "_" + buildType.name + "_v" + defaultConfig.versionName + "-${releaseTime()}.apk");
        }
}

output.outputFile.parent表示生成apk的路徑,這個是默認路徑在項目/app/build/outpus/apk,當然我們可以自己寫路徑。
productFlavors[0].name表示productFlavors標簽下的名稱,這里就是offline或者online。
buildType.name指編譯類型,就是debug或者release
defaultConfig.versionName表示在defaultConfig標簽下寫的版本號
releaseTime()表示我們定義的得到日期的函數(shù)

但是AS3.0之后這樣配置會報錯:
Error

Error:(56, 0) Cannot set the value of read-only property 'outputFile' for ApkVariantOutputImpl_Decorated{apkData=Main{type=MAIN, fullName=debug, filters=[]}} of type com.android.build.gradle.internal.api.ApkVariantOutputImpl.

Solution
outputFile變?yōu)橹蛔x,不能修改輸出的名稱所以報錯。修改為:

applicationVariants.all { variant ->
    variant.outputs.all { output ->  // each 改為 all
    def fileName = "${variant.versionName}_release.apk"
    def outFile = output.outputFile
    if (outFile != null && outFile.name.endsWith('.apk')) {
        outputFileName = fileName  //  output.outputFile 改為 outputFileName 
    }    
}

each修改為all,然后通過outputFileName修改生成apk的名稱。此外,AS 3.0后打包完,除了apk包文件,還會多一個 output.json 參數(shù)文件。

AS3.0后的很多填坑之路可以看這個blog:
Android Studio 3.0正式版填坑之路

aar自定義名字

查找的資料出處:https://stackoverflow.com/questions/45101309/could-not-get-unknown-property-for-applicationvariants-for-buildtype-decorated
代碼模板:

//自動追加版本號和版本名稱
    android.libraryVariants.all {
        variant->variant.outputs.each {
            output-> output.outputFile = new File(output.outputFile.parent,"wimiftSDKLibrary_"+defaultConfig.versionName+"_"+new Date().format("yyyy-MM-dd")+"_"+buildType.name+".aar")
        }
    }

親測有效。

另外aar打包混淆發(fā)包的代碼模板:

buildTypes {
        release {
            //簽名
            signingConfig signingConfigs.release
            //混淆
            minifyEnabled true
            //對齊
            zipAlignEnabled true
            //移除無用的resource 文件
            shrinkResources true
            //加載默認混淆配置文件
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

打完收工!??!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 說明 本文主要介紹和Gradle關(guān)系密切、相對不容易理解的配置,偏重概念介紹。部分內(nèi)容是Android特有的(例如...
    搬磚的小明閱讀 16,145評論 1 62
  • 關(guān)于作者: 李濤,騰訊Android工程師,14年加入騰訊SNG增值產(chǎn)品部,期間主要負責手Q動漫、企鵝電競等項目的...
    稻草人_3e17閱讀 3,887評論 0 10
  • 本文原作者為:kale2010 .blog地址:http://www.cnblogs.com/tianzhijie...
    NoValue閱讀 3,719評論 0 11
  • 001 手機智能化后,給我們的生活帶來很多便利,以前出門帶老三樣"手機、錢包、鑰匙",現(xiàn)在只要拿著手機基本都能搞定...
    阿黛拉_soda閱讀 293評論 0 3
  • 運動打卡第18天 堅持1小時運動,酣暢淋漓的感覺很舒服,每次都能讓自己有不同的身體聯(lián)結(jié),身、心的全然當下,感受了運...
    源依閱讀 113評論 0 0

友情鏈接更多精彩內(nèi)容