├── README.md ├── build.gradle ├── libs.gradle └── settings.gradle /README.md: -------------------------------------------------------------------------------- 1 | gradle-eclipse-multi-channel-build 2 | ================================== 3 | 4 | 基于友盟的gradle多渠道打包工具的改进版本
5 | 6 |

专为Eclipse工程定制的多渠道多依赖项目的打包脚本

7 | 8 | ================================== 9 | 感谢友盟的多渠道打包工具: 10 | https://github.com/umeng/umeng-muti-channel-build-tool/tree/master/Gradle 11 | 12 | 我提交的版本主要修复以下问题:
13 | 1、次版本是为了适配Eclipse的多项目依赖工程的打包。
14 | 2、修复打包过程中文显示乱码问题。
15 | 3、修改apk的名字以及指定apk存放的文件夹。
16 | 4、增加签名的机制
17 | 18 | 使用方法:
19 | 1、将build.gradle和settings.gradle拷贝到目标工程下面,修改里面的路径、文件名等相关参数。
20 | 2、将lib.gradle拷贝到lib工程下面。注意:lib工程需要和root工程在同一目录,同级。如果不在同一目录清修改settings.gradle的设置
21 | 22 | 然后在目标root工程的下面运行命令:
23 | gradle -PSTOREPASS='你的keystore密码' -PKEYPASS='你的alias密码' clean --stacktrace
24 | gradle -PSTOREPASS='你的keystore密码' -PKEYPASS='你的alias密码' aR --stacktrace
25 | 26 | 27 | ================================= 28 | 29 | Copyright infsafe 2014 30 | 31 | Licensed under the Apache License, Version 2.0 (the "License"); 32 | you may not use this file except in compliance with the License. 33 | You may obtain a copy of the License at 34 | 35 | http://www.apache.org/licenses/LICENSE-2.0 36 | 37 | Unless required by applicable law or agreed to in writing, software 38 | distributed under the License is distributed on an "AS IS" BASIS, 39 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 40 | See the License for the specific language governing permissions and 41 | limitations under the License. 42 | -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | 3 | repositories { 4 | mavenCentral() 5 | } 6 | 7 | dependencies { 8 | classpath 'com.android.tools.build:gradle:1.0.+' 9 | } 10 | } 11 | 12 | apply plugin: 'android' 13 | 14 | dependencies { 15 | compile fileTree(dir: 'libs', include: ['*.jar']) 16 | compile 'com.android.support:support-v4:+' 17 | //下面的是添加Eclipse的依赖工程 18 | compile project(':HorizontalVariableListView-master') 19 | compile project(':ListView_animotion/library') 20 | compile project(':MultiprocessPreferences-master') 21 | compile project(':PinterestLikeAdapterView-master') 22 | } 23 | 24 | android { 25 | 26 | compileSdkVersion 19 27 | buildToolsVersion "19.1.0" 28 | 29 | packagingOptions { 30 | exclude 'META-INF/DEPENDENCIES' 31 | exclude 'META-INF/notice.txt' 32 | exclude 'META-INF/LICENSE.txt' 33 | exclude 'META-INF/MANIFEST.MF' 34 | exclude 'META-INF/LICENSE' 35 | exclude 'META-INF/NOTICE' 36 | } 37 | 38 | defaultConfig { 39 | minSdkVersion 10 40 | targetSdkVersion 20 41 | } 42 | 43 | sourceSets { 44 | main { 45 | manifest.srcFile 'AndroidManifest.xml' 46 | java.srcDirs = ['src'] 47 | resources.srcDirs = ['src'] 48 | aidl.srcDirs = ['src'] 49 | renderscript.srcDirs = ['src'] 50 | res.srcDirs = ['res'] 51 | assets.srcDirs = ['assets'] 52 | //下面选项是添加对native libs的编译支持 53 | jniLibs.srcDirs = ['libs'] 54 | } 55 | } 56 | 57 | lintOptions { 58 | abortOnError false 59 | checkReleaseBuilds false 60 | } 61 | 62 | signingConfigs { 63 | release { 64 | //输入自己的keyStore以及keyAlias 65 | storeFile file("release.keystore") 66 | storePassword STOREPASS 67 | keyAlias 'xxxx' 68 | keyPassword KEYPASS 69 | } 70 | } 71 | 72 | buildTypes { 73 | release { 74 | signingConfig signingConfigs.release 75 | minifyEnabled true 76 | zipAlignEnabled true 77 | //输入自己的混淆文件 78 | proguardFile 'proguard.txt' 79 | } 80 | } 81 | 82 | productFlavors { 83 | // Main android app markets 84 | Mocha{} 85 | Xiaomi{} 86 | //添加pre是因为flavor命名不支持数字开头,编译的时候会做处理 87 | pre360Channel{} 88 | Baidu{} 89 | Hiapk{} 90 | pre91Channel{} 91 | WanDouJia{} 92 | Tencent{} 93 | Anzhi{} 94 | AppChina{} 95 | } 96 | } 97 | 98 | tasks.withType(JavaCompile) { 99 | options.encoding = "UTF-8" 100 | } 101 | 102 | import java.util.regex.Pattern 103 | import java.util.regex.Matcher 104 | 105 | //替换AndroidManifest.xml的UMENG_CHANNEL_VALUE字符串为渠道名称 By Remex Huang 106 | android.applicationVariants.all{ variant -> 107 | variant.outputs.get(0).processManifest.doLast{ 108 | 109 | //之前这里用的copy{},我换成了文件操作,这样可以在v1.11版本正常运行,并保持文件夹整洁 110 | //${buildDir}是指./build文件夹 111 | //${variant.dirName}是flavor/buildtype,例如GooglePlay/release,运行时会自动生成 112 | //下面的路径是类似这样:./build/manifests/GooglePlay/release/AndroidManifest.xml 113 | 114 | def channel; 115 | def apkname = ""; 116 | if(variant.productFlavors[0].name.contains("_")){ 117 | def flavorNames = variant.productFlavors[0].name.split("_") 118 | channel = flavorNames[0] 119 | apkname = "_" + flavorNames[1] 120 | } else { 121 | channel = variant.productFlavors[0].name 122 | if(!channel.contains("Mocha")){ 123 | apkname = "_" + channel 124 | } 125 | } 126 | 127 | channel = channel.replaceAll("pre", "") 128 | apkname = apkname.replaceAll("pre", "") 129 | 130 | def manifestFile = "${buildDir}/intermediates/manifests/full/${variant.dirName}/AndroidManifest.xml" 131 | 132 | //将字符串UMENG_CHANNEL_VALUE替换成flavor的名字 133 | def updatedContent = new File(manifestFile).getText('UTF-8').replaceAll("MOCHA_CHANNEL", channel) 134 | new File(manifestFile).write(updatedContent, 'UTF-8') 135 | 136 | //获取版本号 137 | def patternVersionNumber = Pattern.compile("versionName=\"(\\d+)\\.(\\d+)\\.(\\d+)\"") 138 | def manifestText = new File(manifestFile).getText() 139 | def matcherVersionNumber = patternVersionNumber.matcher(manifestText) 140 | matcherVersionNumber.find() 141 | def majorVersion = Integer.parseInt(matcherVersionNumber.group(1)) 142 | def minorVersion = Integer.parseInt(matcherVersionNumber.group(2)) 143 | def pointVersion = Integer.parseInt(matcherVersionNumber.group(3)) 144 | def versionName = + majorVersion + "." + minorVersion + "." + pointVersion 145 | 146 | //将此次flavor的AndroidManifest.xml文件指定为我们修改过的这个文件 147 | variant.outputs.get(0).processResources.manifestFile = file("${buildDir}/intermediates/manifests/full/${variant.dirName}/AndroidManifest.xml") 148 | 149 | println "******************/\n/\n/\n/\n/\n/\n" 150 | println "buildType.name = " + variant.buildType.name 151 | println "******************/\n/\n/\n/\n/\n/\n" 152 | def apkName = "Mocha"; 153 | if (variant.buildType.name == "release") { 154 | apkName += apkname + "_V" + versionName + ".apk"; 155 | //variant.outputFile = file("${buildDir}/outputs/mochapk/" + apkName) 156 | // !! 这里需要自定义自己的输出文件夹 157 | variant.outputs.get(0).outputFile = file("/Users/tengfei/Documents/yunyao/code/mocha/apk/" + versionName + "/" + apkName) 158 | } else { 159 | apkName += apkname + "-SNAPSHOT.apk"; 160 | variant.outputs.get(0).outputFile = file("${buildDir}/outputs/apk/" + apkName) 161 | } 162 | } 163 | } 164 | 165 | -------------------------------------------------------------------------------- /libs.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | 3 | repositories { 4 | mavenCentral() 5 | } 6 | 7 | dependencies { 8 | classpath 'com.android.tools.build:gradle:1.0.0' 9 | } 10 | } 11 | 12 | apply plugin: 'android-library' 13 | 14 | dependencies{ 15 | compile fileTree(dir: 'libs', include: '*.jar') 16 | } 17 | 18 | android { 19 | 20 | compileSdkVersion 18 21 | buildToolsVersion "20" 22 | 23 | defaultConfig { 24 | minSdkVersion 8 25 | targetSdkVersion 18 26 | } 27 | sourceSets { 28 | main { 29 | manifest.srcFile 'AndroidManifest.xml' 30 | java.srcDirs = ['src'] 31 | resources.srcDirs = ['src'] 32 | aidl.srcDirs = ['src'] 33 | renderscript.srcDirs = ['src'] 34 | res.srcDirs = ['res'] 35 | assets.srcDirs = ['assets'] 36 | } 37 | } 38 | lintOptions { 39 | abortOnError false 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':Mocha', ':HorizontalVariableListView-master', ':ListView_animotion/library', ':MultiprocessPreferences-master', ':PinterestLikeAdapterView-master' 2 | 3 | project(':HorizontalVariableListView-master').projectDir = new File('/Users/xxx/Documents/code/HorizontalVariableListView-master') 4 | 5 | project(':ListView_animotion/library').projectDir = new File('/Users/xxx/Documents/code/ListView_animotion/library') 6 | 7 | project(':MultiprocessPreferences-master').projectDir = new File('/Users/xxx/Documents/code/MultiprocessPreferences-master') 8 | 9 | project(':PinterestLikeAdapterView-master').projectDir = new File('/Users/xxx/Documents/code/PinterestLikeAdapterView-master') 10 | --------------------------------------------------------------------------------