美文网首页Gradle相关Android技术知识赏味不足
gradle 集成修改 Android Manifest.xml

gradle 集成修改 Android Manifest.xml

作者: 赏味不足 | 来源:发表于2016-11-07 11:38 被阅读3246次

    其实这次我想好好把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配置文件来的更灵活,可配置性更强。关于更多的配置见之后的文章吧

    相关文章

      网友评论

        本文标题:gradle 集成修改 Android Manifest.xml

        本文链接:https://www.haomeiwen.com/subject/vzqouttx.html