Android 多渠道打包

Android 多渠道打包看這一篇就夠了

本文三個流程

一、多渠道配置

1、多渠道配置
2垦江、不同渠道不同簽名配置
3、不同渠道不同資源文件配置
4搅方、不同渠道不同依賴配置

二比吭、注意事項

三、打包

1姨涡、命令行打包

2衩藤、IDE 打包

多渠道配置(2 種方式)

1、可寫在主模塊(app)的 build.gradle 下

android {  
  compileSdkVersion 29  
  buildToolsVersion "29.0.3"  
  
  defaultConfig {  
      applicationId "com.test.moduledemo"  
      minSdkVersion 21  
      targetSdkVersion 29  
      versionCode 1  
      versionName "1.0"  
  }  
  
  flavorDimensions "versionCode"  
  
  productFlavors {  
      xiaomi{  
          applicationId  = “com.test.xiaomi"  
          //不同渠道配置不同參數(shù)  
          buildConfigField "int", "TEST_VALUE", "1"  
          buildConfigField "String", "TEST_NAME", "\"xiaomi\""  
      }  
      huawei{  
          applicationId = "com.test.huawei"  
          //不同渠道配置不同參數(shù)  
          buildConfigField "int", "TEST_VALUE", "2"  
          buildConfigField "String", "TEST_NAME", "\"huawei\""  
      }     
      productFlavors.all {//遍歷productFlavors多渠道涛漂,設(shè)置渠道號(xiaomi 赏表、huawei)  
          flavor -> flavor.manifestPlaceholders.put("CHANNEL", name)  
      }
  }
  applicationVariants.all { variant ->  
      // 打包完成后輸出路徑
      def name = ((project.name != "app") ? project.name : rootProject.name.replace(" ", "")) + 
      "_" + variant.flavorName + 
      "_" + variant.buildType.name + 
      "_" + variant.versionName + 
      "_" + new Date().format('yyyyMMddhhmm') + ".apk"  
      //相對路徑app/build/outputs/apk/huawei/release/
      def path = "../../../../../apk/" //相當(dāng)于路徑 app/apk/
      variant.outputs.each { output ->
          def outputFile = output.outputFile
          if (outputFile != null && outputFile.name.endsWith('.apk')) {
               //指定路徑輸出
               output.outputFileName = new File(path, name)
          }
      } 
      // 在打包完成后還可以做一些別的操作,可以復(fù)制到指定目錄匈仗,或者移動文件到指定目錄
      variant.assemble.doLast {  
          File out = new File(“${project.rootDir}/apk”)  
          variant.outputs.forEach { file ->  
            //復(fù)制apk到指定文件夾
            //copy {  
            //  from file.outputFile  
            //  into out  
            //}
         //把文件移動到指定文件夾  
          ant.move file: file.outputFile,  
                 todir: "${project.rootDir}/apk"
        }  
      } 
  }
//多渠道簽名的配置
  signingConfigs {
     test {
        storeFile file("../test.keystore")
        storePassword 'test'
        keyAlias 'test'
        keyPassword 'test'
        v1SigningEnabled true
        v2SigningEnabled true
     }
     xiaomi {
        storeFile file("../xiaomi.keystore")
        storePassword 'xiaomi'
        keyAlias 'xiaomi'
        keyPassword 'xiaomi'
        v1SigningEnabled true
        v2SigningEnabled true
     }
     huawei {
        storeFile file("../huawei.keystore")
        storePassword 'huawei'
        keyAlias 'huawei'
        keyPassword 'huawei'
        v1SigningEnabled true
        v2SigningEnabled true
     }
  }
  buildTypes {
       debug {
//        debug這里設(shè)置不起作用瓢剿,可能是編譯器的問題?
//         productFlavors.xiaomi.signingConfig signingConfigs.test
//         productFlavors.huawei.signingConfig signingConfigs.test
       }
       release {
           productFlavors.xiaomi.signingConfig signingConfigs.xiaomi
           productFlavors.huawei.signingConfig signingConfigs.huawei
       }
  }
//不同渠道不同資源文件配置
  sourceSets{
      xiaomi.res.srcDirs 'src/main/res-xiaomi'
      huawei.res.srcDirs 'src/main/res-huawei'
  }
//不同渠道不同的依賴文件
  dependencies {
      xiaomiApi('xxxxxxx')
      huaweiImplementation('xxxxxxxx')
  }    
}

2锚沸、在項目根目錄下(與settings.gradle同目錄)新建 flavors.gradle 文件

android {  
 flavorDimensions "versionCode"  
 
 productFlavors {  
     xiaomi{ 
     applicationId = "com.test.xiaomi"   
         //不同渠道配置不同參數(shù)  
         buildConfigField "int", "TEST_VALUE", "1"  
         buildConfigField "String", "TEST_NAME", "\"xiaomi\""  
     }  
     huawei{  
      applicationId = "com.test.huawei"  
         //不同渠道配置不同參數(shù)  
         buildConfigField "int", "TEST_VALUE", "2"  
         buildConfigField "String", "TEST_NAME", "\"huawei\""  
     } 
     productFlavors.all {//遍歷productFlavors多渠道跋选,設(shè)置渠道號(xiaomi 、huawei)  
         flavor -> flavor.manifestPlaceholders.put("CHANNEL", name)  
     } 
 }
// ............ 更多配置
}

在主模塊(app)的 build.gradle 下引用該 flavors.gradle 文件即可
apply from: rootProject.file('flavors.gradle')

注意

如果項目較為復(fù)雜哗蜈,有可能通過 buildConfigField 設(shè)置不同的渠道包前标,不同的信息字段有可能失效,則把
buildConfigField "int", "TEST_VALUE", "1"
換成
manifestPlaceholders.put("TEST_VALUE", 1)
然后再 AndroidManifest.xml 里添加

<application>
    <meta-data  
      android:name="TEST_VALUE"  
      android:value="${TEST_VALUE}" />
</application> 

在 代碼通過一下操作獲取其值:

ApplicationInfo applicationInfo = getPackageManager().getApplicationInfo(getPackageName(),  
  PackageManager.GET_META_DATA);
  int testValue = applicationInfo.metaData.getInt("TEST_VALUE");

打包

命令行打包:

Windows下: gradlew assembleRelease
Mac 下:./gradlew assembleRelease
assembleRelease 是打所有渠道的 Release 包
assembleDebug 是打所有渠道的 Debug 包
還可以打指定渠道的包:
gradlew assembleXiaoMiRelease assembleHuaWeiRelease
(空格隔開要打的渠道包的任務(wù)名稱即可距潘,任務(wù)名稱可以通過點擊 android studio 右邊的 Gradle 根據(jù)圖中目錄查看)


多渠道打包
image

編譯器打包

image

image

image

當(dāng)渠道很多的時候炼列,不同渠道不同配置就會變得相當(dāng)繁瑣了,歡迎查看我的下一篇推文多渠道打包-進階

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末音比,一起剝皮案震驚了整個濱河市俭尖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌洞翩,老刑警劉巖稽犁,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異骚亿,居然都是意外死亡已亥,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門来屠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來虑椎,“玉大人震鹉,你說我怎么就攤上這事±” “怎么了传趾?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長泥技。 經(jīng)常有香客問我浆兰,道長,這世上最難降的妖魔是什么珊豹? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任镊讼,我火速辦了婚禮,結(jié)果婚禮上平夜,老公的妹妹穿的比我還像新娘。我一直安慰自己卸亮,他們只是感情好忽妒,可當(dāng)我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著兼贸,像睡著了一般段直。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上溶诞,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天鸯檬,我揣著相機與錄音,去河邊找鬼螺垢。 笑死喧务,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的枉圃。 我是一名探鬼主播功茴,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼孽亲!你這毒婦竟也來了坎穿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤返劲,失蹤者是張志新(化名)和其女友劉穎玲昧,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體篮绿,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡孵延,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了搔耕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片隙袁。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡痰娱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出菩收,到底是詐尸還是另有隱情梨睁,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布娜饵,位于F島的核電站坡贺,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏箱舞。R本人自食惡果不足惜遍坟,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望晴股。 院中可真熱鬧愿伴,春花似錦、人聲如沸电湘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽寂呛。三九已至怎诫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間贷痪,已是汗流浹背幻妓。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留劫拢,地道東北人肉津。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像舱沧,于是被迫代替她去往敵國和親阀圾。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,592評論 2 353

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