程序员人生 网站导航

Gradle for Android系列之五 多渠道打包

栏目:综合技术时间:2017-03-04 08:14:17

  我们知道,很多的app需要发布在不同的利用商店中,但是各利用商店对上架的要求有时候又不相同,也就意味着我们需要针对不同的渠道,构建不同的渠道包,如果手动做这些事情,会比较繁琐,那末使用Gradle会方便很多!本篇在前文的基础上介绍1下使用gradle多渠道打包。
  今天的内容基本上都是在app目录对应的build.gradle的android方法中设置的。主要是用到了gradle的Android插件里的productFlavors功能。
  首先,我们需要设置buildTypes

buildTypes {
        release {
            //是不是启用混淆
            minifyEnabled true
            //混淆文件配置
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            //混淆后的zip优化,默许为true,可以不用设置
            zipAlignEnabled true
            // 移除无用的resource文件
            shrinkResources true
            //是不是保存调试信息
            debuggable false
        }
        debug {
            //是不是启用混淆
            minifyEnabled false
            //混淆文件配置
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            //混淆后的zip优化,默许为true,可以不用设置
            zipAlignEnabled true
            // 移除无用的resource文件
            shrinkResources true
            //是不是保存调试信息
            debuggable true
        }
    }

  我们在正常情况下,我们发布生产包,需要签名信息的,这时候我们可以配置1下apk的签名信息signingConfigs,
  

 signingConfigs {
        debug {
            //也能够是xxx.keystore具体要看你使用甚么签名了
            storeFile file("GradleDemo.jks")
            storePassword "android"
            keyAlias "android"
            keyPassword "android"
        }

        release {
            storeFile file("GradleDemo.jks")
            storePassword "android"
            keyAlias "android"
            keyPassword "android"
        }
    }

  这些签名信息,放在build.gradle文件中可能不安全,所以我们可以将其放在gradle.proprerties中,这样可以所有的module的build.gradle都可以援用,现在gradle.proprerties中配置(其他的属性如compileSdkVersion,buildToolsVersion这些也能够,写在该文件中,可以到达复用的目的 ):

STORE_PASSWORD="android"
KEYALIAS="android"
KEYPASSWORD="android"
STORE_PATH="GradleDemo.jks"

  接着我们在build.gradle文件中我们可以像以下1样援用:

signingConfigs {
        release {
            storeFile file(STORE_PATH)
            storePassword STORE_PASSWORD
            keyAlias KEYALIAS
            keyPassword KEYPASSWORD
        }
        release {
            storeFile file(STORE_PATH)
            storePassword STORE_PASSWORD
            keyAlias KEYALIAS
            keyPassword KEYPASSWORD
        }
    }

  配置完签名信息后,我们可以在buildTypes中添加签名属性signingConfig signingConfigs.release:
  

buildTypes {
        release {
            //是不是启用混淆
            minifyEnabled true
            //混淆文件配置
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            //混淆后的zip优化,默许为true,可以不用设置
            zipAlignEnabled true
            // 移除无用的resource文件
            shrinkResources true
            //是不是保存调试信息
            debuggable false
            signingConfig signingConfigs.release
        }
        debug {
            //是不是启用混淆
            minifyEnabled false
            //混淆文件配置
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            //混淆后的zip优化,默许为true,可以不用设置
            zipAlignEnabled true
            // 移除无用的resource文件
            shrinkResources true
            //是不是保存调试信息
            debuggable true
            signingConfig signingConfigs.debug
        }
    }

  配置好这些基本的信息后,就需要设置本篇的重点productFlavors,这里用豌豆荚和利用宝做演示:
  

productFlavors {
        wandoujia {}
        yingyongbao {}
    }

  就这样设置好每一个渠道对应的name,固然可以随着不同渠道的要求,设置相应的属性,例如设置不同的applicationId,不同的启动页面等。接着在AndroidManifest.xml文件的application的标签下设置meta-data:
  

<meta-data android:name="CHANNEL" android:value="${CHANNEL_VALUE}"/>

  通过Gradle Android插件里的另外一个功能manifestPlaceholders来自动的替换CHANNEL_VALUE,我们还需要在build.gradle文件中添加:
  

productFlavors.all {
        flavor -> flavor.manifestPlaceholders = [CHANNEL_VALUE: name]
    }

  到这里我们已配置好了各渠道的信息。但是我们通常还需要根据不同的渠道和版本信息来命名apk的名称,以方便我们进行发版:
  

//app-v1.0-wandoujia-debug.apk
    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            def outputFile = output.outputFile
            if (outputFile != null && outputFile.name.endsWith('.apk')) {
                // 输出apk名称为wooyun_v1.0_wandoujia.apk
                def fileName = "app-v${variant.versionName}-${variant.productFlavors[0].name}-${variant.buildType.name}.apk".toLowerCase()
                output.outputFile = new File(outputFile.parent, fileName)
            }
        }

    }

  在app的build目录下生成类似于app-v1.0-wandoujia-debug.apk这类命名方式的apk。到此基本上就可以满足1般的需求了。
  如果我们在利用启动时候,需要用到渠道的信息,可以这样获得:
  

public static String getChannelName(Context ctx) {  
        if (ctx == null) {  
            return null;  
        }  
        String channelName = null;  
        try {  
            PackageManager packageManager = ctx.getPackageManager();  
            if (packageManager != null) {  
                //注意此处为ApplicationInfo 而不是 ActivityInfo,由于我们设置的meta-data是在application标签中,而不是某activity标签中,所以用ApplicationInfo  
                ApplicationInfo applicationInfo = packageManager.getApplicationInfo(ctx.getPackageName(), PackageManager.GET_META_DATA);  
                if (applicationInfo != null) {  
                    if (applicationInfo.metaData != null) {  
                        channelName = applicationInfo.metaData.getString("");  
                    }  
                }  

            }  
        } catch (PackageManager.NameNotFoundException e) {  
            e.printStackTrace();  
        }  
        return channelName;  
    }

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐