• 用Gradle构建Android项目的配置细节

    代码混淆/依赖配置
    服务器君一共花费 277.249 ms 进行了 2 次数据库查询,努力地为您提供了这个页面。
    广告很萌的

    新建一个 Android 项目默认情况下项目目录是这样的:

    有两个组件source sets,一个main,一个test,对应下面两个文件夹。

    • src/main/
    • src/androidTest/

    然后对于每个组件目录都有两个目录,分别存储java代码和资源文件。

    • java/
    • resources/

    对于android项目中呢,对应的目录和文件是:

    • AndroidManifest.xml //该文件src/androidTest/目录下不需要,程序执行时会自动构建
    • res/
    • assets/
    • aidl/
    • rs/
    • jni/

    如果需要上面这些文件,但不是在上面所说的目录,则需要设置。

    sourceSets {
        main {
            java {
                srcDir 'src/java'
            }
            resources {
                srcDir 'src/resources'
            }
        }
    }
    

    可以给main或者test设置根目录,如:

    sourceSets {
       androidTest.setRoot('tests')
    }
    

    可以指定每种文件的存储路径:

    sourceSets {
    	main {
    		manifest.srcFile 'AndroidManifest.xml'
    		java.srcDirs = ['src']
    		resources.srcDirs = ['src']
    		aidl.srcDirs = ['src']
    		renderscript.srcDirs = ['src']
    		res.srcDirs = ['res']
    		assets.srcDirs = ['assets']
    	}
    }
    

    特别是我们的ndk生成的.so文件,通常我们不是放到jni目录中的,我们需要设置一下:

    sourceSets {
    	main {
    		jniLibs.srcDirs = ['libs']
    	}
    }
    

    签名配置

    可以给不同类型进行不同的配置,先看示例:

    android {
        signingConfigs {
            debug {
                storeFile file("debug.keystore")
            }
            myConfig {
                storeFile file("other.keystore")
                storePassword "android"
                keyAlias "androiddebugkey"
                keyPassword "android"
            }
        }
        buildTypes {
            foo {
                debuggable true
                jniDebugBuild true
                signingConfig signingConfigs.myConfig
            }
        }
    }
    

    上面的配置文件配置两个类型,一个时debug类型,一个时自己的自定义类型。两个分别使用了不同的签名,同时对于生成密钥,要填写设置的密码。

    代码混淆设置

    直接看代码:

    android {
        buildTypes {
            release {
                runProguard true
                proguardFile getDefaultProguardFile('proguard-android.txt')
            }
        }
    }
    

    以上是使用默认的proguard文件去进行混淆,也可以使用自己编写的规则进行混淆,proguardFile 'some-other-rules.txt'

    依赖配置

    程序中会依赖别的包,或者程序,需要引入别的类库。前面也说到了,支持maven。

    对于本地的类库,可以这样引入:

    dependencies {
        compile files('libs/foo.jar')   //单个文件
        compile fileTree(dir: 'libs', include: ['*.jar'])  //多个文件
    }
    android {
        ...
    }
    

    对于maven仓库文件:

    repositories {
        mavenCentral()
    }
    dependencies {
        compile 'com.google.guava:guava:11.0.2'
    }
    android {
        ...
    }
    

    输出不同配置的应用

    android {
        ...
        defaultConfig {
            minSdkVersion 8
            versionCode 10
        }
        productFlavors {
            flavor1 {
                packageName "com.example.flavor1"
                versionCode 20
            }
            flavor2 {
                packageName "com.example.flavor2"
                minSdkVersion 14
            }
        }
    }
    

    通过以上设置,我们可以输出不同的保命不同的版本号,以及最小sdk的程序包。当然我们可以根据自己的需求去做其他的不同。

    生成多个渠道包

    一个完整配置文件:

    buildscript {
        repositories {
            mavenCentral()
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:0.9.+'
        }
    }
    apply plugin: 'android'
    repositories {
            mavenCentral()
    }
    android {
        compileSdkVersion 19
        buildToolsVersion "19.0.3"
        defaultConfig {
            minSdkVersion 8
            targetSdkVersion 19
            versionCode 1
            versionName "1.0"
        }
        sourceSets {
            main {
                jniLibs.srcDirs = ['libs']
            }
        }
        lintOptions {
            abortOnError false
        }
    //签名
        signingConfigs {
            //你自己的keystore信息
            release {
                storeFile file("×.keystore")
                storePassword "×××"
                keyAlias "××××"
                keyPassword "×××"
            }
        }
        buildTypes {
            debug {
                signingConfig signingConfigs.release
            }
            release {
                signingConfig signingConfigs.release
                runProguard false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
            }
        }
        //渠道Flavors,我这里写了一些常用的,你们自己改
        productFlavors {
            //GooglePlay{}
            //Store360{}
            //QQ{}
            //Taobao{}
            //WanDouJia{}
            //AnZhuo{}
            //AnZhi{}
            //BaiDu{}
            //Store163{}
            //GFeng{}
            //AppChina{}
            //EoeMarket{}
            //Store91{}
            //NDuo{}
            xiaomi{}
            umeng{}
        }
    }
    //替换AndroidManifest.xml的UMENG_CHANNEL_VALUE字符串为渠道名称
    android.applicationVariants.all{ variant ->
        variant.processManifest.doLast{
            //之前这里用的copy{},我换成了文件操作,这样可以在v1.11版本正常运行,并保持文件夹整洁
            //${buildDir}是指./build文件夹
            //${variant.dirName}是flavor/buildtype,例如GooglePlay/release,运行时会自动生成
            //下面的路径是类似这样:./build/manifests/GooglePlay/release/AndroidManifest.xml
            def manifestFile = "${buildDir}/manifests/${variant.dirName}/AndroidManifest.xml"
            //将字符串UMENG_CHANNEL_VALUE替换成flavor的名字
            def updatedContent = new File(manifestFile).getText('UTF-8').replaceAll("UMENG_CHANNEL_VALUE", "${variant.productFlavors[0].name}")
            new File(manifestFile).write(updatedContent, 'UTF-8')
            //将此次flavor的AndroidManifest.xml文件指定为我们修改过的这个文件
            variant.processResources.manifestFile = file("${buildDir}/manifests/${variant.dirName}/AndroidManifest.xml")
        }
    }
    

    以上的功能就是替换Manifest中渠道标示,同时去生成不同的apk包。

    最后说明

    程序在buid的时候,会执行lint检查,有任何的错误或者警告提示,都会终止构建,我们可以将其关掉。

    lintOptions {
    	abortOnError false
    }
    
更多 推荐条目

Welcome to NowaMagic Academy!

现代魔法 推荐于 2013-02-27 10:23   

本章最新发布
随机专题
  1. [Python程序设计] Tornado源码解析 23 个条目
  2. [移动开发] Android SQLite增删查改实例(数据:魔弹之王) 2 个条目
  3. [移动开发] Layout_weight属性解析 5 个条目
  4. [JavaScript程序设计] 关于HTTP Keep-Alive 6 个条目
  5. [软件工程与项目管理] 浏览器的HTML解析器 8 个条目
  6. [数据结构] 散列表(哈希表) 13 个条目
  7. [软件工程与项目管理] 浏览器初步介绍 8 个条目
  8. [智力开发与知识管理] 超越整体性学习 5 个条目
  9. [软件工程与项目管理] 浏览器的CSS解析 7 个条目
  10. [数据库技术] MySQL常用自带函数 3 个条目
  11. [移动开发] Android Studio里的Gradle 3 个条目
  12. [Python程序设计] Django 入门知识浅介 10 个条目
窗口 -- [博客]