第一就是配置:在项目的build.gradle里面配置 先上图,再上代码。
第二步,就是打包。(网上有介绍用命令打包,可是我这人太懒,发现了个小窍门,直接在android studio 里面进行。)上图(另外,后面我还是补上了gradle命令打包的介绍。大家可以看看)
如果没有keystore,先创建一个,默认为.jks文件,一样的。
大家这里创建完后,可以再回头看看前面配置的build.gradle里面signingConfigs的内容。是不是就懂了(其实我这里有一个疑问,感觉如果用我这种方式去打包,签名文件都没有去读取配置文件里面的了)
大家可以注意这里的Flavors,先回头看看前面配置的buld.gradle文件里面的productFlavors,嘿嘿,渠道都在这了,按住ctrl,选择你要打包的渠道,然后Finish.静静等待。需要要时间
打包成功!点击直接会进入到项目
打包好的apk,就在这了。
----当然,打包的过程中,好多盆友可能会遇到一个错误.导致打包失败。
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]))
是因为混淆打包的时候,有重复的v4包,所以你只需要删掉一个,在Demo4这个项目里面,我是直接注释掉
再打包,等待,成功。
打包成功,我们可以验证 Android 多渠道打包渠道验证 .
最后直接贴上配置代码
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
// 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是我们自己配的混淆文件
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)
}
}
}
}
Android studio 使用心得(四)---android studio 多渠道打包 这篇文章讲了一种打包方式。是直接在android studio 里面可视化操作,结合配置文件。我个人觉得严格上来讲是不完全正确的操作,因为配置文件里面的签名文件根本没有用到。但是,打出来的包绝对没问题的。这篇主要是介绍直接在dos命令里面使用gradle命令打包。
gradlew -v 来查看下项目所用的Gradle版本
如果你是第一次执行会去下载Gradle,这个过程如果不翻墙非常慢,一起打......
两行命令,简单gradlew clean ,gradlew build。
1,配置文件还是和之前的一样,我才贴一次代码
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
// 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 {
//这样写就得把demo.jk文件放在项目目录
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
//加载默认混淆配置文件
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)
}
}
}
}
2.我们直接在dos命令定位到Demo4的项目目录(如果你用的是win7,可以直接先进入到项目目录,然后在空白处,先按住shift,再点右键选择"在此处打开命令窗口")
a,输入命令 :gradlew clean
b,输入命令:gradlew build 然后等待。时间会比较长
直到build successfule.细心的朋友应该会发现项目目录多了一个build文件夹。
我们打包好的apk就在里面。
大家会发现里面 debug版本,release版本都有,所以速度慢。我们一般只需要正式签名版本,所以我们在gradle clean后可以这样
输入命令:gradlew assembleRelease
然后会发现时间比前面要快,而且apk文件里面只有release版本的了。
另外我们如果只想要debug版本,输入命令gradlew assembleDebug //这是编译并打Debug包
打包成功,我们可以验证 Android 多渠道打包渠道验证 .
最后:个人参照这两篇文章谢了一个bat进行处理,bat内容如下:
打包输出APK的文件夹 看你编辑的是哪个“.gradle”文件,如果的是项目下的“.gradle”文件,输出的APK将在项目目录下的“build”文件夹下,如果是某个Module目录下的,输出的APK将在Module目录下的build文件夹下。
E:
cd E:\androidstudio_workpace\你的工程文件夹
call gradlew clean
call gradlew build
pause