专栏名称: 蚂蚁金服ProtoTeam
数据前端团队
目录
相关文章推荐
51好读  ›  专栏  ›  蚂蚁金服ProtoTeam

大型Android项目的工程化之路:编译与构建

蚂蚁金服ProtoTeam  · 掘金  · 前端  · 2017-12-07 08:33

正文

请到「今天看啥」查看全文


//的方式访问 supportLibraryVersion = '26.0.0' }

2.2 module build.gradle

module build.gradle用于module的配置与编译。

这里有很多常用的配置选项,你并不需要都把它们记住,有个大致的印象就行,等到用的时候再回来查一查。

apply plugin: 'com.android.application'

android {
    compileSdkVersion 26
    buildToolsVersion '26.0.2'


    defaultConfig {
        //应用包名
        applicationId "com.guoxiaoxing.software.engineering.demo"
        //最低支持的Android SDK 版本
        minSdkVersion 15
        //基于开发的Android SDK版本
        targetSdkVersion 26
        //应用版本号
        versionCode 1
        //应用版本名称
        versionName "1.0"

        //单元测试时使用的Runner
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

    signingConfigs{

        debug{
            storeFile file("debugKey.keystore")
            storePassword '123456'
            keyAlias 'debugkeyAlias'
            keyPassword '123456'
        }

        release{
            storeFile file("releaseKey.keystore")
            storePassword '123456'
            keyAlias 'releasekeyAlias'
            keyPassword '123456'
        }
    }

    //Java编译选项
    compileOptions{

        //编码
        encoding = 'utf-8'

        //Java编译级别
        sourceCompatibility = JavaVersion.VERSION_1_6

        //生成的Java字节码版本
        targetCompatibility = JavaVersion.VERSION_1_6
    }

    //ADE配置选项
    adbOptions{

        //ADB命令执行的超时时间,超时时会返回CommandRectException异常。
        timeOutInMs = 5 * 1000//5秒

        //ADB安装选项,例如-r代表替换安装
        installOptions '-r', '-s'
    }

    //DEX配置选项
    dexOptions{

        //是否启动DEX增量模式,可以加快速度,但是目前这个特性不是很稳定
        incremental false

        //执行DX命令是为其分配的最大堆内存,主要用来解决执行DX命令是内存不足的情况
        javaMaxHeapSize '4g'

        //执行DX开启的线程数,适当的线程数量可以提高编译速度
        threadCount 2

        //是否开启jumbo模式,有时方法数超过了65525,需要开启次模式才能编译成功
        jumboMode true
    }

    lintOptions{

        //lint发现错误时是否退出Gradle构建
        abortOnError false
    }

    //构建的应用类型。用于指定生成的APK相关属性
    buildTypes {

        debug{

            //是否可调试
            debuggable true

            //是否可调试jni
            jniDebuggable true

            //是否启动自动拆分多个DEx
            multiDexEnabled true

            //是否开启APK优化,zipAlign是Android提供的一个整理优化APK文件的
            //工具,它可以提高系统和应用的运行效率,更快的读写APK里面的资源,降低
            //内存的优化
            zipAlignEnabled true

            //签名信息
            signingConfig signingConfigs.debug

            //是否自动清理未使用的资源
            shrinkResources true

            //是否启用混淆
            minifyEnabled true

            //指定多个混淆文件
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }

        release {
            //签名信息
            signingConfig signingConfigs.release

            //是否启用混淆
            minifyEnabled true

            //指定多个混淆文件
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

//依赖
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    testCompile 'junit:junit:4.12'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
}

2.3 Gradle Wrapper

Gradle Wrapper是对Gradle的一层包装,目的在于团队开发中统一Gradle版本,一般可以通过gradle wrapper命令构建,会生成以下文件:

  • gradle-wrapper.jar
  • gradle-wrapper.properties

文件用来进行Gradle Wrapper进行相关配置。如下所示:

#Fri Nov 24 17:39:29 CST 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip

我们通常关心的是distributionUrl,它用来配置Gradle的版本,它会去该路径下载相应的Gradle包。

注:如果官方的gradle地址下载比较慢,可以去 国内的镜像地址 下载。

三 Gradle混淆与优化

3.1 代码压缩

代码压缩通过 ProGuard 提供,ProGuard 会检测和移除封装应用中未使用的类、字段、方法和属性,包括自带代码库中的未使用项(这使其成为以变通方式解决 64k 引用限制的有用工具)。 ProGuard 还可优化字节码,移除未使用的代码指令,以及用短名称混淆其余的类、字段和方法。混淆过的代码可令您的 APK 难以被逆向工程,这在应用使用许可验证等安全敏感性功能时特别 有用。







请到「今天看啥」查看全文