[老实李] Android利用Gradle productFlavors创建不同版本的App

一、productFlavors是什么?有什么用?

最近运营人员需要创建一个"壳版"应用进行渠道推广,即将当前的App更换名称、包名、图标、第三方服务等,成为一个新的应用。遇到这种需求的时候就需要使用到productFlavors。或者是要将项目代码分为开发版本(urltestDebug)、主机版本(hostDebug)、上线版本(onlineDebug)时也可以使用productFlavors。

[老实李] Android利用Gradle productFlavors创建不同版本的App_第1张图片
ScreenClip.png

二、如何使用?
使用步骤:
1、修改主app的build.gradle

android {
    compileSdkVersion 26
    buildToolsVersion "26.0.2"
    defaultConfig {
        applicationId "com.example.takeout"
        minSdkVersion 15
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        flavorDimensions "versionCode"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    productFlavors {
        demo1 {
            applicationId "com.demo1.android"
            resValue "string", "app_name", "Demo1"
        }
        demo2 {
            applicationId "com.demo2.android"
            resValue "string", "app_name", "Demo2"
        }
    }

    sourceSets {
        main { java.srcDirs = ['src/main/java', 'src/demo1/java'] }
        demo2 { java.srcDirs = ['src/demo2/java', 'src/demo2/java/'] }
        demo1 { res.srcDirs = ['src/demo1/res', 'src/demo1/res'] }
    }
}

2、删除main/res/values/strings/app_name
否则会出现BUG:

Error:Execution failed for task ':app:mergeDemo2DebugResources'.
> C:\Users\ry\AndroidStudioProjects\TakeOut\app\src\main\res\values\strings.xml: Error: In DataSet 'main', no data file for changedFile. This is an internal error in the incremental builds code; to work around it, try doing a full clean build.

3、创建不同版本APP的文件目录

[老实李] Android利用Gradle productFlavors创建不同版本的App_第2张图片
ScreenClip [1].png

比如我要实现安装两个APP,Demo1和Demo2的时候应用名称不一样,那么我有两种方式实现。第一种:在demo1和demo2的strings文件下创建app_name ;第二种:在build.gradle下的productFlavors节点下添加resValue字段。
第一种的方式的原理:src/main存放的是公共文件,src/demo1,src/demo2中存放各自独有的文件,gradle打包apk的时候就会将相应的文件,资源进行合并。
比如我在打包运行demo1的时候,就是将src/main和src/demo1进行合并打包。

合并规则:
java文件直接合并,存在相同路径的同名文件会造成冲突,例如src/main/java/com/demo1/android/MainActivity.java 就会和src/demo1/java/com/demo1/android/MainActivity.java 冲突
资源的内容进行合并,同名文件的资源内容进行合并,同属性名会造成冲突
例如scr/main/res/values/strings.xml 和src/demo/res/valuse/strings.xml的内容进行合并成一个strings.xml文件,如果2个文件中都包含同一属性,例如
android 就会造成冲突

三、其他第三方服务
因为第三方服务例如友盟统计,推送,分享,支付都需要申请Appkey,而Appkey是与ApplicationId绑定的,所以需要重新申请一份。Appkey是直接写在AndroidManifest.xml文件中,所以需要创建相应的AndroidManifest.xml文件。具体可以参考:http://www.jianshu.com/p/782a42e7b2b1
但是也可以通过公共的包,main来做第三方服务的集成然后其他的app(比如demo1,demo2)就不用管第三方服务的事了,也不用申请好几个appkey.我们公司的项目是这么做的。在不同的app上所不同的其实也只是一个Constant文件不同,Url不同罢了。

[老实李] Android利用Gradle productFlavors创建不同版本的App_第3张图片
ScreenClip [2].png

你可能感兴趣的:([老实李] Android利用Gradle productFlavors创建不同版本的App)