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


上兩篇的地址

安裝配置

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 ]
            }
        }
    }
}    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM