上兩篇的地址
安裝配置
http://www.cnblogs.com/uncle2000/p/4276833.html
簡單實戰
http://www.cnblogs.com/uncle2000/p/4277476.html
我之所以以前用ant現在用gradle是因為 ant打包給 加入第三方依賴工程非常非常非常麻煩,而網上關於兩者的對比就數不勝數了,大家可以去查,充分的說明了 gradle的優勢
而且還有一點就是gradle的中文資料是要多於ant的,想當初ant中加入for-each 和 switch-case 可是讓我操碎了心,關於我的ant代碼我也會在后面的android打包中給出源碼。
而關於gradle來打包我學一天就已經掌握了,而ant 用個循環還要裝支持的插件我擦!並且我很討厭標簽化的語言
好了廢話少說 開門見山 此篇的內容要少於上篇,如果gradle此篇的這些功能,eclipse可不能簡單批量的完成喲
一 簽名
//簽名的配置 我后面配上完整代碼 這里關於域就不細寫了 signingConfigs { myConfig{ //簽名文件,放到工程根目錄喲 storeFile file("xxxx.keystore") //簽名文件的密碼 storePassword "xxxxx" //工程的Alias名 keyAlias "xxxx" //簽名的密碼 keyPassword "xxxx" } } //構建的時候要做的事情都在這里,比如簽名或者混淆 buildTypes{ release { //注意網上有些是錯的,這個是對應新的2.2.1的gradle中的方法 //這個的意思是 執行簽名 執行的方法是signingConfigs下的myConfig內的配置 就是上面那個域 signingConfig signingConfigs.myConfig } }
二混淆
關於混淆文件(proguard-properties.txt)內容我就不給出了哈
剛剛說了混淆也是在那個執行方法里
buildTypes{ release { //執行混淆 混淆配置在根目錄下的proguard-properties.txt文件內 proguardFile getDefaultProguardFile('proguard-properties.txt')//指定混淆文件 } }
三批量打包的兩種方法
第一種:
批量打包的部分代碼我上一篇都有提過
defaultConfig { manifestPlaceholders = [ activityLabel:"defaultName"] } productFlavors { //渠道一的配置 channelname1{ //把manifest中的“CHANNEL”變量名(key)的變量值(value)替換成xxx1 //這里也可以把“"xxx1"” 換成name=> [CHANNEL:name] 這個的意思就是把value換成 channelname1 //由於網上的亂七八糟的粘貼復制 所有網上的那些根本沒說清楚,這里的CHANNEL必須要再manifest中有且對應 具體我寫在下面代碼塊 manifestPlaceholders = [CHANNEL:"xxx1"] } //渠道二的配置 channelname2{ manifestPlaceholders = [CHANNEL:"xxx2" ] }
....渠道n...... }
注意manifest中加入這么一段 屬於那個域都可以,但是你要會取,我寫在了<application>
//這里的$對於android編譯器來說就是個char 但是對於gradle來說就是變量的意思,可以替換,用什么替換?當然是我上個代碼塊中的productFlavors域中的值了。切忌這個CHANNEL要和上個代碼塊中的CHANNEL對應 如果改變其中一個記得改變另一個 <meta-data android:name="UMENG_CHANNEL" android:value="${CHANNEL}" />
這樣就可以了,這種配置適合在每一個里面都單獨配置,比如不同渠道不同的版本號,不同的各種各樣的配置,但是如果不需要那么多花哨,就可以用第二種方法
第二種:
defaultConfig { manifestPlaceholders = [ activityLabel:"defaultName"] } productFlavors { channelname1{ } channelname2{ } //執行all方法,循環把 channelname*賦值給manifest中的變量 all { flavor -> flavor.manifestPlaceholders = [CHANNEL:name ] } }
四依賴工程/依賴第三方工程/依賴外部工程
什么是依賴工程?
其實很簡單的只要在原來代碼上加入幾行代碼幾個文件就可以實現,所以不要想那么難
我舉個例子就是我的xxx工程依賴appcompat_v7_6這個工程的情況
如上圖 兩個工程 兩個文件 這是最上級目錄
目錄結構是這樣
/appcompat_v7_6/1~n個子文件
/xxx/1~n個子文件
/local.properties
/settings.gradle
除此以外
兩個工程中各有一個 build.gradle
一個一個說。
1 local.properties文件內的內容是你sdk的根目錄 很簡單吧
2settings.gradle文件內的內容是所有有聯系的工程名
結構是 include ':x1',':x2',':x3',.........注意不要用中文
":"相當於文件夾系統的“\xx\”中的“\”
3 然后看我appcompat_v7_6中的build.gradle的內容 標配哈
buildscript{ repositories{ mavenCentral(); } dependencies{ //你可能需要改動的地方 classpath 'com.android.tools.build:gradle:1.0.0' } tasks.withType(JavaCompile) { options.encoding = "UTF-8" } } apply plugin:'android-library' dependencies{ compile fileTree(dir:'libs',include:"*.jar") } android{ //你可能需要改動的地方 compileSdkVersion 19 //你可能需要改動的地方 buildToolsVersion "19.1.0" enforceUniquePackageName=false lintOptions{ abortOnError false } sourceSets{ main{ manifest.srcFile 'AndroidManifest.xml' java.srcDirs = ['src'] resources.srcDirs = ['src'] aidl.srcDirs = ['src'] renderscript.srcDirs = ['src'] res.srcDirs = ['res'] assets.srcDirs = ['assets'] } } lintOptions{ abortOnError false } }
以上出了注釋可能需要改動的地方 其他地方一律不變,除非你用的gradle是很老的版本 有些方法不能用
4最后看我xxx中的文件內容
import java.util.regex.Pattern//用到的一些java的包 import com.android.builder.core.DefaultManifestParser buildscript { repositories { mavenCentral() } dependencies { //你可能需要改動的地方 classpath 'com.android.tools.build:gradle:1.0.0' } } tasks.withType(JavaCompile) { options.encoding = "UTF-8" } apply plugin: 'android' dependencies { compile fileTree(dir: 'libs', include: '*.jar') //你可能需要改動的地方 //這里 project就是編譯一個工程的意思 注意名字要和settings中的對其 這個方法會自動去工程外找settings文件 compile project(':appcompat_v7_6') } android { //你可能需要改動的地方 compileSdkVersion 19 //你可能需要改動的地方 buildToolsVersion "19.1.0" enforceUniquePackageName=false defaultConfig { //你可能需要改動的地方 targetSdkVersion 19 } lintOptions{ abortOnError false } dexOptions { preDexLibraries = false } //簡化編譯過程 packagingOptions { exclude 'META-INF/DEPENDENCIES.txt' exclude 'META-INF/LICENSE.txt' exclude 'META-INF/NOTICE.txt' exclude 'META-INF/NOTICE' exclude 'META-INF/LICENSE' exclude 'META-INF/DEPENDENCIES' exclude 'META-INF/notice.txt' exclude 'META-INF/license.txt' exclude 'META-INF/dependencies.txt' exclude 'META-INF/LGPL2.1' exclude 'META-INF/ASL2.0' } signingConfigs { myConfig{ storeFile file("android.keystore") storePassword "xxx" keyAlias "xxx" keyPassword "xxx" } } buildTypes{ release { signingConfig signingConfigs.myConfig proguardFile getDefaultProguardFile('proguard-properties.txt') } } defaultConfig { manifestPlaceholders = [ activityLabel:"defaultName"] } sourceSets { main { manifest.srcFile 'AndroidManifest.xml' java.srcDirs = ['src'] resources.srcDirs = ['src'] aidl.srcDirs = ['src'] renderscript.srcDirs = ['src'] res.srcDirs = ['res'] assets.srcDirs = ['assets'] } //把工程都搞過來一起編譯包括所有的.so文件 task copyNativeLibs(type: Copy) { //你可能需要改動的地方 from(new File(project(':appcompat_v7_6').getProjectDir(), 'libs')) { include '**/*.so' } into new File(buildDir, 'native-libs') } tasks.withType(JavaCompile){ compileTask -> compileTask.dependsOn copyNativeLibs } clean.dependsOn 'cleanCopyNativeLibs' tasks.withType( com.android.build.gradle.tasks.PackageApplication){ pkgTask -> pkgTask.jniFolders = new HashSet<File>() pkgTask.jniFolders.add(new File(buildDir,'native-libs')) } productFlavors { xxx1{ } xxx2{ } all { flavor -> flavor.manifestPlaceholders = [CHANNEL:name ] } } } }