gradle 集成修改 Android Manifest.xml 打多個包實踐

cagesd 8年前發布 | 19K 次閱讀 Gradle 安卓開發 Android開發 移動開發

其實這次我想好好把gradle 構建android工程生成的文件好好看看的,但是實在太多了,而且網絡上資料有限,故而就放在下次吧。

這次做了一些新的嘗試,然后也看了下一些之前沒有關心的文件是啥用。

gradle-wrapper.jar

首先其實之前就看到有這個jar包,但是還沒有去關心過到底是啥用。

Gradle Wrapper 是一種更加方便的使用gradle的方法,他包括了為支持windows的批處理腳本和支持類unix的shell腳本。這些腳本是你,在不安裝gradle時候,也可以用gradle。安裝wrapper只需要在你的build.gradle文件中添加如果下代碼。

我們來看下結構

└── initial
    └── gradlew
    └──gradlew.bat
    └── gradle
       └── wrapper
           └── gradle-wrapper.jar
           └── gradle-wrapper.properties

現在已經可以用Wrapper構建你的工程了。你將和之前一樣,運行gradle build命令構建工程。

./gradlew build

第一行執行Gradle的版,他講下載和緩存執行版本gradle的二進制文件。 Gradle Wrapper 文件將和代碼一樣提交給版本控制器,這樣任何人,獲取代碼后,不用安裝gradle,就可以構建工程。

這個的確會非常方便,總體感覺以后再也不用編寫什么打包腳本了。直接checkout,運行指定gradle命令即可。

多個項目

在gradle項目根目錄下面我們也可以看到有一個settings.gradle的文件,默認是有

include ':app'

假設我們有三個項目,分別是

MyProject/

| settings.gradle

app/
| build.gradle

app2/
| build.gradle

app3/
| build.gradle

那么我們需要修改settings.gradle,變成include ‘:app’, ‘:app2′, ‘:app3′

1.0 rc的坑(轉)

monkey:不過1.0坑真的很多,大家自己去嘗試就知道了。主要是stackoverflow上面的東西太舊。

修改app和root project中兩個build.gradle

我們創建好Android application之后,可以在app目錄和根目錄下都看到build.gradle文件,這兩個文件分別會從app層面和多個project層面進行build的管控。

我們先來看下根目錄的gradle.build文件。

//其實這里已經有了標識,告訴大家這個是可以管控多個模塊的
// Top-level build file where you can add configuration options common to all sub-projects/modules.

//編譯腳本
buildscript {
    repositories {
//這里可以是maven,jcenter等
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.0.0'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }

}
// 1.0 rc之后這個需要修改
apply plugin: 'com.android.application'


android {
    compileSdkVersion 21
    buildToolsVersion "20.0.0"

//這里需要設置資源文件,否則會報錯,文件找不到
    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src/main/res']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res/main/res']
            assets.srcDirs = ['assets']
        }
        instrumentTest.setRoot('tests')
    }


    defaultConfig {
        applicationId "com.example.monkey.myapplication"
        minSdkVersion 10
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }
//增加混淆
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }


    //這個是解決lint報錯的代碼
    lintOptions {
        abortOnError false
    }
  // 增加簽名
    signingConfigs {
        myConfigs {
            storeFile file("/Users/monkey/.android/debug.keystore")
            keyAlias "..."
            keyPassword "..."
            storePassword "..."
        }
    }


}


allprojects {
    repositories {
        jcenter()
    }
}


//替換AndroidManifest.xml的REPLACE_KEY字符串為渠道名稱
android.applicationVariants.all { variant ->
    variant.outputs.each { output ->
        output.processManifest.doLast {
            //v1.11之前這里用的copy{},我換成了文件操作,這樣可以在v1.11版本正常運行,并保持文件夾整潔
            //${buildDir}是指build文件夾
            //${variant.dirName}是flavor/buildtype,例如GooglePlay/release,運行時會自動生成
            //下面的路徑是類似這樣:build/intermediates/manifests/GooglePlay/release/AndroidManifest.xml
            def manifestFile = "${buildDir}/intermediates/manifests/full/${variant.dirName}/AndroidManifest.xml"

            //將字符串REPLACE_KEY替換成flavor的名字
            def updatedContent = new File(manifestFile).getText('UTF-8').replaceAll("REPLACE_KEY", "${variant.productFlavors[0].name}")
            new File(manifestFile).write(updatedContent, 'UTF-8')

            //將此次flavor的AndroidManifest.xml文件指定為我們修改過的這個文件
            variant.processResources.manifestFile = file("${buildDir}/intermediates/manifests/full/${variant.dirName}/AndroidManifest.xml")
        }
    }
}

接著看下app下面的build.gradle

//增加application的apply
apply plugin: 'com.android.application'

android {
//配置sdk版本
    compileSdkVersion 21
    buildToolsVersion "20.0.0"



    defaultConfig {
        applicationId "com.example.monkey.myapplication"
        minSdkVersion 10
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    //這個是解決lint報錯的代碼
    lintOptions {
        abortOnError false
    }
    signingConfigs {
        myConfigs {
            storeFile file("/Users/monkey/.android/debug.keystore")
            keyAlias "..."
            keyPassword "..."
            storePassword "..."
        }
    }
//增加多個打包渠道配置
    productFlavors {
        qqqq {
            applicationId = 'com.monkey.qqq'
        }
        hhhhh {
            applicationId='com.monkey.hhh'
        }
    }

}



dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:21.0.3'
}

我們使用gradlew進行編譯之后,我們可以在如下目錄下中找到分別為了打不同包所用的Android Manifest.xml文件。

同時我們也可以在outputs中的apk看到我們編譯出的多個apk,但這里只是package name不同,渠道的meta data并沒有修改,但是方法是一樣的。

最后的給個編譯report。

ec2-54-67-1-101:monkeyApplication monkey$ ./gradlew app:assembleDebug
:app:preBuild
:app:compileHhhhhDebugNdk UP-TO-DATE
:app:preHhhhhDebugBuild
:app:checkHhhhhDebugManifest
:app:preHhhhhReleaseBuild
:app:preQqqqDebugBuild
:app:preQqqqReleaseBuild
:app:prepareComAndroidSupportAppcompatV72103Library UP-TO-DATE
:app:prepareComAndroidSupportSupportV42103Library UP-TO-DATE
:app:prepareHhhhhDebugDependencies
:app:compileHhhhhDebugAidl UP-TO-DATE
:app:compileHhhhhDebugRenderscript UP-TO-DATE
:app:generateHhhhhDebugBuildConfig UP-TO-DATE
:app:generateHhhhhDebugAssets UP-TO-DATE
:app:mergeHhhhhDebugAssets UP-TO-DATE
:app:generateHhhhhDebugResValues UP-TO-DATE
:app:generateHhhhhDebugResources UP-TO-DATE
:app:mergeHhhhhDebugResources UP-TO-DATE
:app:processHhhhhDebugManifest UP-TO-DATE
:app:processHhhhhDebugResources UP-TO-DATE
:app:generateHhhhhDebugSources UP-TO-DATE
:app:compileHhhhhDebugJava UP-TO-DATE
:app:preDexHhhhhDebug UP-TO-DATE
:app:dexHhhhhDebug UP-TO-DATE
:app:processHhhhhDebugJavaRes UP-TO-DATE
:app:validateDebugSigning
:app:packageHhhhhDebug UP-TO-DATE
:app:zipalignHhhhhDebug UP-TO-DATE
:app:assembleHhhhhDebug UP-TO-DATE
:app:compileQqqqDebugNdk UP-TO-DATE
:app:checkQqqqDebugManifest
:app:prepareQqqqDebugDependencies
:app:compileQqqqDebugAidl UP-TO-DATE
:app:compileQqqqDebugRenderscript UP-TO-DATE
:app:generateQqqqDebugBuildConfig UP-TO-DATE
:app:generateQqqqDebugAssets UP-TO-DATE
:app:mergeQqqqDebugAssets UP-TO-DATE
:app:generateQqqqDebugResValues UP-TO-DATE
:app:generateQqqqDebugResources UP-TO-DATE
:app:mergeQqqqDebugResources UP-TO-DATE
:app:processQqqqDebugManifest UP-TO-DATE
:app:processQqqqDebugResources UP-TO-DATE
:app:generateQqqqDebugSources UP-TO-DATE
:app:compileQqqqDebugJava UP-TO-DATE
:app:preDexQqqqDebug UP-TO-DATE
:app:dexQqqqDebug UP-TO-DATE
:app:processQqqqDebugJavaRes UP-TO-DATE
:app:packageQqqqDebug UP-TO-DATE
:app:zipalignQqqqDebug UP-TO-DATE
:app:assembleQqqqDebug UP-TO-DATE
:app:assembleDebug UP-TO-DATE

BUILD SUCCESSFUL

Total time: 8.73 secs

總體來講,gradle的編譯會比以往的mvn的pom配置文件來的更靈活,可配置性更強。關于更多的配置見之后的文章吧

 

來自:http://www.jianshu.com/p/c94053fd4469

 

 本文由用戶 cagesd 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!