文章目录
  1. 1. 前奏
  2. 2. 使用

前奏

多渠道打包,很多是为了在各渠道上线使用的。而我主要是为了方便测试版使用的。最近做项目由于出现过内存泄漏需要分析,使用Android Studio+MAT分析工具分析比较繁琐,也很耗时,使用Leakcanary框架集成到项目中可以很方便在运行的时候在手机上看出来,效率高很多了。加之自己刚换MAC2016版需用转接口连接手机,连接经常不稳定看Log日志不方便,便想在测试的时候输出Toast而发布版不用Toast,如果代码都在一起只有一两行像原来注释反注释的方法分别打出不同的APK还比较方便,但是如果代码比较多且在不同的类里面就比较繁琐或容易忘记了。使用多渠道打包正合适。本文不讲那么简单的,介绍简单的使用方法。

使用

说了不是那么多,那么如何简单的使用呢,搜过很多教程,接下来就总结下自己觉得比较方便的方式了。
修改Modoule中的build.gradle
在android闭包中加入如下代码

1
2
3
4
 productFlavors {
production {}//正式发布版本
dev {}//开发测试版本
}

build后点击左侧面板的Build Variants,就可以看到可以选择dev或production来打包了。

那么如何能实现方便测试的那种需求呢?莫慌,接下来就来就是见证奇迹的时刻。
我们在Module的src目录下新建dev和production文件夹,并创建与main文件夹下Java文件同样的包名。新建相同的类,类里面方法名一样,方法里面的代码不一样。可以看到当选中一个渠道时对应下代码是正常的,另外一个渠道对应下代码标红,这样就可以使用同样的方法名在不同的渠道下执行不同的代码块了。
比如我的dev下的AppInit代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class AppInit {

public void init(){

if (LeakCanary.isInAnalyzerProcess(AppApplication.getAppContext())) {
// This process is dedicated to LeakCanary for heap analysis.
// You should not init your app in this process.
return;
}
LeakCanary.install(AppApplication.getInstance());

}

}

production下的AppInit代码:

1
2
3
4
5
6
7
public class AppInit {

public void init(){

}

}

在自己的Application类里面调用init方法,分别运行两种渠道可以看到开发版多了Leaks图标,正式版没有Leaks图标,这样就达到了想要的效果了。
其他还有可以更改应用名,应用包名等功能……
我的Module下的build.gradle配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
apply plugin: 'com.android.application'
apply plugin: 'me.tatarka.retrolambda'
apply plugin: 'com.jakewharton.butterknife'

def globalConfiguration = rootProject.extensions.getByName("ext")
def config = globalConfiguration.configuration
def appDependencies = globalConfiguration.appDependencies
def releaseTime = new Date().format("yyyyMMdd", TimeZone.getTimeZone("UTC"))

android {

compileSdkVersion config.compileSdkVersion
buildToolsVersion config.buildToolsVersion
defaultConfig {
applicationId config.applicationId
minSdkVersion config.minSdkVersion
targetSdkVersion config.targetSdkVersion
versionCode config.versionCode
versionName config.versionName
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}

// 使用Java1.8
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}

//多渠道打包
productFlavors {
dev { //开发测试版本
applicationId "com.carlos.bbox.dev"
manifestPlaceholders = [
APP_NAME: "@string/app_name_dev"]
}
production { //正式发布版本
applicationId "com.carlos.bbox"
manifestPlaceholders = [
APP_NAME: "@string/app_name"]
}
}

//自定义apk名字
applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
def fileName = variant.productFlavors[0].name
fileName = "BBox_${fileName}_${defaultConfig.versionName}_${releaseTime}.apk"
output.outputFile = new File(outputFile.parent, fileName)
}
}
}

}

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'
})
testCompile 'junit:junit:4.12'

//base
compile appDependencies.appcompatv7
compile appDependencies.design
compile appDependencies.recyclerview
compile appDependencies.cardview

//di
compile appDependencies.butterknife
annotationProcessor appDependencies.butterknifeCompiler
compile appDependencies.dagger
annotationProcessor appDependencies.daggerCompiler

//network
compile appDependencies.retrofit
compile appDependencies.retrofitRxjava
compile appDependencies.retrofitConverterGson
compile appDependencies.glide

//rx
compile appDependencies.rxjava
compile appDependencies.rxandroid

//other
compile appDependencies.fragmentation
compile appDependencies.fragmentationSwipeback
devCompile appDependencies.leakcanary

}

文章目录
  1. 1. 前奏
  2. 2. 使用