build.gradleだけで複数apkを作る試行メモ

はじめに

あんまり需要がない話だと思うけど、調べるのにちょっと時間がかかったので

二度目に困らないようにメモっておく

動作環境

  • macOS Sierra
  • 16G
  • HDDタイプのiMac
  • gradle plugin 2.3.3
  • gradle plugin 3.0-Beta1
  • gradle runtime-4.1-bin

試行状況

やりたい事

  • パッケージ名をかえる
  • タイトルを変える
  • アイコンを変える

buildTypeを動的に複数作る

  • app/AndroidManifest.xml
  <application
        tools:replace="android:label"
        android:label="${base_app_name}"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
  • app/build.gradle
  defaultConfig {
        //★ ココのデフォルト時の設定しないと通常のbuildType時にエラーになる
        manifestPlaceholders = [base_app_name: "@string/app_name"] 
 }

 buildTypes {
        ("A".."J").each{num->
            ant.echo "debug${num}"
            "debug${num}"{
                initWith(buildTypes.debug)
                //TODO: applicationIdSuffix application pluginにしか存在しない(features pluginには無し)
                applicationIdSuffix ".debug.${num.toLowerCase()}" //パッケージ名は小文字にする
                manifestPlaceholders = [base_app_name: "HogeTest$num"]
            }
        }
    }
}

アイコンを動的に変更する

ribbonizer plugin を利用

  • app/build.gradle
apply plugin: 'com.android.application'
apply plugin: 'com.github.gfx.ribbonizer' //need application plugin

// TODO: src/main/res がないとこのDSL自体動かない
ribbonizer {
    //iconNames "@drawable/ic_notification", "@drawable/widget_preview"
    iconNames "@mipmap/ic_launcher"

    builder { variant, iconFile ->
        ant.echo "variant="+variant.buildType.name
//        if (variant.flavorName == "local") {
//            return grayRibbonFilter(variant, iconFile)
//        }
//        if (variant.buildType.name  == "debugB") {
//            return yellowRibbonFilter(variant, iconFile)
//        }
//        else {
//            return greenRibbonFilter(variant, iconFile)
//        }
//        // or customColorRibbonFilter(variant, iconFile, "#0000FF")
//
//       //Although `canary` build-type is marked as `non-debuggable`
//       //we can still force specific variants to be ribbonized:
//       forcedVariantsNames "localCanary"

        if (variant.buildType.name.indexOf("debug")!=-1) {
            String endStr = variant.buildType.name.substring( variant.buildType.name.length() -1);
            if(endStr.equals("g")){
                return greenRibbonFilter(variant, iconFile)
            }
            byte end = endStr.getBytes()[0]
            //ant.echo end
            int num = end - (byte)'A'
            Long colorCode = 0x0000FF + num * 16 << 2
            String hexString = "0x" + Long.toHexString(colorCode)
            ant.echo hexString
            return customColorRibbonFilter(variant, iconFile, hexString)
        }
    }
}

AS3.0で利用した場合の注意点

feature plugin だと ribbonizer pluginが対応していない

一応G様的には、library project扱いらしいんだけどな・・

  • features/build.gradle
//apply plugin: 'com.android.application'
apply plugin: 'com.android.feature'

android {
    baseFeature true

    // TODO:3.0 depricated
    //publishNonDefault true
    defaultPublishConfig "debug"





    buildTypes {
        //TODO:標準でないbuiidType等は手動で追加する必要があり
        ("A".."J").each { num ->
            //ant.echo "debug${num}"
            "debug${num}" {
                initWith(buildTypes.debug)
                //manifestPlaceholders = [base_app_name: "HogeTest$num"]
            }
        }
    }

buildTypes を手動でapp側と同じものを追加しないと駄目な所がネックかも