gradle教程 [原創](eclipse/ADT下 非外掛程式 非Android Studio/AS)純手打 第三篇:gradle完整的實戰

來源:互聯網
上載者:User

標籤:

上兩篇的地址

安裝配置

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.DefaultManifestParserbuildscript {    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 ]            }        }    }}    

 

gradle教程 [原創](eclipse/ADT下 非外掛程式 非Android Studio/AS)純手打 第三篇:gradle完整的實戰

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.