《Gradle权威指南》--Android Gradle多渠道构建

No1:

Build Variant = Build Type + Product Flavor

Build Variant:构建的产物

Build Type:构建的类型

Product Flavor:构建的渠道

android{
    compileSdkVersion 23
    buildToolsVersion "23.0.1"
    productFlavors{
        google{}
        baidu{}
    }
}

No2:

Flurry多渠道和友盟多渠道构建

Flurry本身没有渠道的概念,它有Application,所以可以把一个Application当成一个渠道,每个Application都有一个Key,称为Flurry Key;友盟本身有渠道的概念,只要我们在AndroidManifest.xml配置标注即可。

android{
    compileSdkVersion 23
    buildToolsVersion "23.0.1"
    
    defaultConfig{
        applicationId "org.flysnow.app.example112"
        minSdkVersion 14
        targetSdkVersion 23
        versionCode 1
        versionName '1.0.0'
        resConfig 'zh'
    }
    buildTypes{
        release{
            minifyEnabled true
            projuardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'
            zipAlignEnabled true
        }
    }
    productFlavors{
        google{
            buildConfigField 'String','FLURRY_KEY','"BHJKOUASDASFKLZL"'
        }
        baidu{
            buildConfigField 'String','FLURRY_KEY','"HJSDKHFJDSF23478"'
        }
    }
}

这样每个渠道的BuildConfig类中都会有名字为FLURRY_KEY常量定义

友盟渠道是在AndroidManifest.xml中配置的

<meta-data android :value="Channel ID" android:name="UMENG_CHANNEL"/>

其中Channel ID就是渠道值

No3:

多渠道构建定制--其实就是对Android Gradle插件的ProductFlavor的配置,通过配置ProductFlavor达到灵活地控制每个渠道的目的

applicationId就是该渠道的包名

android{
    ...
    productFlavors{
        google{
            applicationId "org.flysnow.app.example112.google"
        }
    }
}

consumerProguardFiles--只对Android库项目有用

android{
    productFlavors{
        google{
            consumerProguardFiles 'proguard-rules.pro','proguard-android.txt'
        }
    }
}

testApplicationId--测试包名

android{
    ...
    productFlavors{
        google{
            testApplicationId "org.flysnow.app.example112.test"
        }
    }
}

testFunctionalTest--是否为功能测试,testHandleProfiling--是否启用分析功能

android{
    productFlavors{
        google{
            testFunctionalTest true
            testHandleProfiling true
        }
    }
}

testInstrumentationRunner--用来配置运行测试使用的Instrumentation Runner的类名

android{
    productFlavors{
        google{
            testInstrumentationRunner 'android.test.InstrumentationTestRunner'
        }
    }
}

testInstrumentationRunnerArguments--用来配置Instrumentation Runner使用的参数

android{
    productFlavors{
        google{
            testInstrumentationRunnerArguments.put("coverage",'true')
        }
    }
}

useJack--用于标记是否启用Jack和Jill这个全新的、高性能的编译器

android{
    productFlavors{
        google{
            useJact true
        }
    }
}

dimension --多维度,理解为对ProdcutFlavor进行分组。用flavorDimensions声明维度,才能在ProductFlavor中使用

android{
    flavorDimensions "abi","version"//优先级:abi>version>defaultConfig
    productFlavors{
        free{
            dimension 'version'
        }
        paid{
            dimension 'version'
        }
        x86{
            dimension 'abi'
        }
        arm{
            dimension 'abi'
        }
    }
}

会生成

ArmFreeDebug

ArmFreeRelease

ArmPaidDebug

ArmPaidRelease

x86FreeDebug

x86FreeRelease

x86PaidDebug

x86PaidRelease

No4:

提高多渠道构建的效率-美团方案

1)利用Android Gradle打一个基本包

2)基于该包复制一个,文件名要能区分出产品、打包时间、版本、渠道等

3)对复制出来的apk文件进行修改,在其META-INF目录下新增空文件,但是空文件的文件名要有意义,必须包含能区分渠道的名字,如:mtchannel_google

4)重复步骤2)步骤3生成我们所需的所有渠道包apk,这个可以使用Python这类脚本来做

5)生成了我们所有发布渠道的apk包

使用:

在apk启动(Application onCreate)时候,读取我们写apk中META-INF目录下的前缀mtchannel_文件,如果找到的话,把文件名取出来,然后就可以得到渠道标识(Google)了

posted @ 2018-03-24 16:36  嘉禾世兴  阅读(367)  评论(0编辑  收藏  举报