多渠道打包进阶知识

2,862 阅读1分钟

多渠道打包进阶知识

文章开始前,先看一下下面这种情况:

android {  
  productFlavors {  
      //100 个多渠道配置  
  }
//多渠道签名的配置
  signingConfigs {
     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这里设置不起作用,可能是编译器的问题?
//         productFlavors.xiaomi.signingConfig signingConfigs.test
//         productFlavors.huawei.signingConfig signingConfigs.test
       }
       release {
           productFlavors.xiaomi.signingConfig signingConfigs.xiaomi
           productFlavors.huawei.signingConfig signingConfigs.huawei
           //....100 个签名配置
       }
  }
//不同渠道不同资源文件配置
  sourceSets{
      xiaomi.res.srcDirs 'src/main/res-xiaomi'
      huawei.res.srcDirs 'src/main/res-huawei'
      xxx.res.srcDirs 'src/main/res-xxx'
      xxx.res.srcDirs 'src/main/res-xxx'
      xxx.res.srcDirs 'src/main/res-xxx'
      //....100 个资源文件配置
  }
//不同渠道不同的依赖文件
  dependencies {
      xiaomiApi('xxxxxxx')
      huaweiImplementation('xxxxxxxx')
      xxxApi('xxxxxxx')
      xxxApi('xxxxxxx')
      xxxApi('xxxxxxx')
      //....100 个渠道不同依赖配置
  }    
}

不难发现,当渠道比较多的时候,不同渠道不同的配置就会很繁琐,有没有更方便的方法呢?答案是肯定的。

资源文件配置

sourceSets{
    def sets = getSourceSets()//获取资源设置集合
    productFlavors.all{//遍历多渠道
        if('huawei'.equals(name))//针对特殊的渠道做特殊处理
          sets.getByName(name).res.srcDir 'src/main/res-xxx'
        else
          sets.getByName(name).res.srcDir 'src/main/res-'+name
        //相当于 xiaomi.res.srcDir 'src/main/res-xiaomi'
        //      huawei.res.srcDir 'src/main/res-huawei'
        //      .....
    }
}

依赖配置

def dependenMap =[xiaomi: 'xiaomi依赖',
                  huawei: 'huawei依赖',
                  ...
                  xxx: 'xxx 依赖']
dependencies{
    productFlavors.all{
        if('huawei'.equals(name))//针对特殊的渠道做特殊处理
           dependencies.add(name+"Implementation",project(dependenMap[name]))
        else
           dependencies.add(name+"Api",project(dependenMap[name]))
        
        //xiaomiApi('xiaomi依赖')
        //huaweiImplementation('xiaomi依赖')
        //xxxxApi('xxx依赖')
    }
}

签名配置

signingConfigs {
    xiaomi{
        storeFile file("../xiaomi.keystore")
        storePassword 'xiaomi'
        keyAlias 'xiaomi'
        keyPassword 'xiaomi'
        v1SigningEnabled true
        v2SigningEnabled true
    }
    huawei{
        storeFile file("../xiaomi.keystore")
        storePassword 'xiaomi'
        keyAlias 'xiaomi'
        keyPassword 'xiaomi'
        v1SigningEnabled true
        v2SigningEnabled true
    }
    ....更多签名配置
}
buildTypes {
    debug {
        
    }
    release {
         productFlavors.all {
             if('huawei'.equals(name))//针对特殊的渠道做特殊处理
               productFlavors[name].signingConfig signingConfigs.xxx       
             else
               productFlavors[name].signingConfig signingConfigs[name]       
         }
    }
}