第一就是配置:在项目的build.gradle里面配置 先上图,再上代码。java
第二步,就是打包。(网上有介绍用命令打包,但是我这人太懒,发现了个小窍门,直接在android studio 里面进行。)上图(另外,后面我仍是补上了gradle命令打包的介绍。你们能够看看http://my.oschina.net/aibenben/blog/370985)android
若是没有keystore,先建立一个,默认为.jks文件,同样的。app
你们这里建立完后,能够再回头看看前面配置的build.gradle里面signingConfigs的内容。是否是就懂了(其实我这里有一个疑问,感受若是用我这种方式去打包,签名文件都没有去读取配置文件里面的了)maven
你们能够注意这里的Flavors,先回头看看前面配置的buld.gradle文件里面的productFlavors,嘿嘿,渠道都在这了,按住ctrl,选择你要打包的渠道,而后Finish.静静等待。须要要时间gradle
打包成功!点击直接会进入到项目优化
打包好的apk,就在这了。ui
----固然,打包的过程当中,好多盆友可能会遇到一个错误.致使打包失败。spa
Execution failed for task ':proguardGooglePlayRelease'.java.io.IOException: Can't write [D:\androidstudiocode\Demo4\build\intermediates\classes-proguard\GooglePlay\release\classes.jar] (Can't read [D:\androidstudiocode\Demo4\build\intermediates\exploded-aar\Demo4\appcompat_v7_8\unspecified\libs\android-support-v4.jar(;;;;;;!META-INF/MANIFEST.MF)] (Duplicate zip entry [android/support/v4/b/d.class == android-support-v4.jar:android/support/v4/os/ParcelableCompatCreatorHoneycombMR2.class])).net
是由于混淆打包的时候,有重复的v4包,因此你只须要删掉一个,在Demo4这个项目里面,我是直接注释掉debug
再打包,等待,成功。
打包成功,咱们能够验证 Android 多渠道打包渠道验证 .
最后直接贴上配置代码
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
|
apply plugin:
'com.android.application'
dependencies {
// compile fileTree(dir: 'libs', include: '*.jar')
compile project(
':appcompat_v7_8'
)
}
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath
'com.android.tools.build:gradle:1.0.0'
}
}
android {
compileSdkVersion
19
buildToolsVersion
"21.0.2"
sourceSets {
main {
manifest.srcFile
'AndroidManifest.xml'
java.srcDirs = [
'src'
]
resources.srcDirs = [
'src'
]
aidl.srcDirs = [
'src'
]
renderscript.srcDirs = [
'src'
]
res.srcDirs = [
'res'
]
assets.srcDirs = [
'assets'
]
}
// Move the tests to tests/java, tests/res, etc...
instrumentTest.setRoot(
'tests'
)
// Move the build types to build-types/<type>
// For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
// This moves them out of them default location under src/<type>/... which would
// conflict with src/ being used by the main source set.
// Adding new build types or product flavors should be accompanied
// by a similar customization.
debug.setRoot(
'build-types/debug'
)
release.setRoot(
'build-types/release'
)
}
defaultConfig {
applicationId
"com.example.demo4"
minSdkVersion
8
targetSdkVersion
19
versionCode
1
versionName
"1.0"
// dex突破65535的限制
multiDexEnabled true
|
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
|
// AndroidManifest.xml 里面UMENG_CHANNEL的value为 ${UMENG_CHANNEL_VALUE} manifestPlaceholders = [UMENG_CHANNEL_VALUE: "channel_name"]
}
//执行lint检查,有任何的错误或者警告提示,都会终止构建,咱们能够将其关掉。
lintOptions {
abortOnError false
}
//签名
signingConfigs {
debug {
storeFile file(
"C:/Users/xxx/.android/debug.keystore"
)
}
relealse {
storeFile file(
"demo.jks"
)
storePassword
"demo123456"
keyAlias
"demo_4"
keyPassword
"demo123456"
}
}
buildTypes {
debug {
// 显示Log
buildConfigField
"boolean"
,
"LOG_DEBUG"
,
"true"
versionNameSuffix
"-debug"
minifyEnabled false
zipAlignEnabled false
shrinkResources false
signingConfig signingConfigs.debug
}
release {
// 不显示Log
buildConfigField
"boolean"
,
"LOG_DEBUG"
,
"false"
//混淆
minifyEnabled true
//Zipalign优化
zipAlignEnabled true
// 移除无用的resource文件
shrinkResources true
//加载默认混淆配置文件 progudard-android.txt在sdk目录里面,不用管,proguard.cfg是咱们本身配<span></span>的混淆文件
proguardFiles getDefaultProguardFile(
'proguard-android.txt'
),
'proguard.cfg'
//签名
signingConfig signingConfigs.relealse
}
}
//渠道Flavors,我这里写了一些经常使用的
productFlavors {
GooglePlay {}
xiaomi {}
umeng {}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
applicationVariants.all { variant ->
variant.outputs.
each
{ output ->
def
outputFile = output.outputFile
if
(outputFile !=
null
&& outputFile.name.endsWith(
'.apk'
)) {
def
fileName = outputFile.name.replace(
".apk"
,
"-${defaultConfig.versionName}.apk"
)
output.outputFile =
new
File(outputFile.parent, fileName)
}
}
}
}
|