Androidstudio 多渠道打包apk

由于国内的android市场渠道很多,为了统计每个渠道的下载和它的数据统计,我们开发人员就需要针对每个渠道打包,如果一个个打包这显然不是开发人员愚蠢的行为,Androidstudio上有了Gradle,这就很简单了,当然用eclipse的也有它多渠道打包的方法,这些说的是AS的打包方法。


这里以友盟统计作为实例:

1.在AndroidManifest.xml里面添加一句:

<span style="font-size:18px;"><meta-data android:value="${UMENG_CHANNEL_VALUE}" android:name="UMENG_CHANNEL"/></span>

2.在build.gradle设置productFlavors

android {  
    productFlavors {
        xiaomi {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
        }
        baidu {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"]
        }
        wandoujia {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
        }
    }  
}
或者一次性修改

android {  
    productFlavors {
        xiaomi {}
        baidu {}
        wandoujia {}
    }  

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

3.我们来写一坨代码验证一下

public class MainActivity extends AppCompatActivity {

    private TextView mChannel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mChannel = (TextView) findViewById(tv_channel);
        mChannel.setText(getApplicationMetaValue("UMENG_CHANNEL"));
    }

    private String  getApplicationMetaValue(String name) {
        String value= "";
        try {
            ApplicationInfo appInfo =getPackageManager()
                    .getApplicationInfo(getPackageName(),
                            PackageManager.GET_META_DATA);
            value = appInfo.metaData.getString(name);
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return value;
    }
}
添加完这坨代码,我们来点击右边的Gradle看一下,就可以看到我们刚才添加的渠道了


4.我们双击一下installBaiduDebug,它就会运行安装到手机上了


就可以获取到相对应的渠道了,点击其他的渠道包安装也会获取到相应的渠道包

5.我们要打包正式版本就要生成jks签名文件,并且打包渠道包




然后点击Next,去到下面那个页面,可就可以选取相应的渠道了,也可以一次性选择全部的渠道


然后点击finish,喝杯茶等待完成就可以了


安装之后就可以验证了

6.以上是手动打包操作的,下面来一点自动化的操作

在build.gradle,哪里添加

signingConfigs {
        debug {
            // No debug config
        }

        release {
            storeFile file("../yourapp.keystore")
            storePassword "your password"
            keyAlias "your alias"
            keyPassword "your password"
        }
    }
可能这样直接暴露出来密码什么的不安全,现在采用下面的方法改成:

relealse {
            storeFile file(RELEASE_STORE_FILE)
            storePassword RELEASE_STORE_PASSWORD
            keyAlias RELEASE_KEY_ALIAS
            keyPassword RELEASE_KEY_PASSWORD
        }
然后在gradle.properties文件上加上

RELEASE_KEY_PASSWORD= "your password"
RELEASE_KEY_ALIAS= "your alias"
RELEASE_STORE_PASSWORD= "your password"
RELEASE_STORE_FILE= "../yourapp.keystore"
7.然后就可以用Androidstudio下的Terminal进行assemble命令来操作了

./gradlew assembleDebug    // debug的
./gradlew assembleRelease  // Release的

然后就可以喝咖啡等待打包成功了

在Terminal下面会出现BUILD SUCCESSFUL就是成功了,然后在这里就可以看到打包成功的apk了


除此之外 assemble 还能和 Product Flavor 结合创建新的任务,其实 assemble 是和 Build Variants 一起结合使用的,而 Build Variants = Build Type + Product Flavor , 举个例子大家就明白了:

如果我们想打包wandoujia渠道的release版本,执行如下命令就好了:

  • ./gradlew assembleWandoujiaRelease

如果我们只打wandoujia渠道版本,则:

  • ./gradlew assembleWandoujia

此命令会生成wandoujia渠道的Release和Debug版本

同理我想打全部Release版本:

  • ./gradlew assembleRelease

这条命令会把Product Flavor下的所有渠道的Release版本都打出来。

总之,assemble 命令创建task有如下用法:

  • **assemble**: 允许直接构建一个Variant版本,例如assembleFlavor1Debug。

  • **assemble**: 允许构建指定Build Type的所有APK,例如assembleDebug将会构建Flavor1Debug和Flavor2Debug两个Variant版本。

  • **assemble**: 允许构建指定flavor的所有APK,例如assembleFlavor1将会构建Flavor1Debug和Flavor1Release两个Variant版本。

给整个gradle文件看看

apply plugin: 'com.android.application'
def releaseTime() {
    return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
}
android {
    compileSdkVersion 24
    buildToolsVersion "24.0.3"
    defaultConfig {
        applicationId "com.multi_channel_study.demo"
        minSdkVersion 15
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }

        applicationVariants.all { variant ->
            variant.outputs.each { output ->
                def outputFile = output.outputFile
                if (outputFile != null && outputFile.name.endsWith('.apk')) {
                    // 输出apk名称为Multi-Channel_v1.0_2016-11-04_wandoujia.apk
                    def fileName = "Multi-Channel_v${defaultConfig.versionName}_${releaseTime()}_${variant.productFlavors[0].name}.apk"
                    output.outputFile = new File(outputFile.parent, fileName)
                }
            }
        }
    }

    signingConfigs {
        debug {
            // No debug config
        }

        relealse {
            storeFile file(RELEASE_STORE_FILE)
            storePassword RELEASE_STORE_PASSWORD
            keyAlias RELEASE_KEY_ALIAS
            keyPassword RELEASE_KEY_PASSWORD
        }
    }

    productFlavors {
        xiaomi {}
        baidu {}
        wandoujia {}
    }


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

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:24.2.1'
    testCompile 'junit:junit:4.12'
}

然后就可以用这样的方法来做多渠道打包了




  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值