Android Gradle使用总结(2)

栏目: IOS · Android · 发布时间: 5年前

内容简介:指定生成的app包名,对应值是App最低支持的Android操作系统版本,对应值是配置当前是基于哪个sdk版本进行开发,可选值与 minSdkVersion一样

指定生成的app包名,对应值是 String ,如: applicationId "com.android.xx"

(2)minSdkVersion

App最低支持的Android操作系统版本,对应值是 int 型(即对于sdk 的ApiLevel)如, minSdkVersion 25

(3)targetSdkVersion

配置当前是基于哪个sdk版本进行开发,可选值与 minSdkVersion一样

(4)versionCode

内部版本号,对应值是 int 型,用于配置Android App内部版本号,通常用于版本的升级

(5)versionName

用于配置app的版本名称,对应值是 String ,如"v1.0.0",让用户知道当前app版本。versionCode是内部使用,versionName是外部使用,一起配合完成app的版本升级控制。

(6)testApplicationId

配置测试app的包名,默认是 applicationId + ".test" ,一般情况下,用默认的即可。

(7)testInstrumentationRunner

用于配置单元测试时使用的Runner,默认使用android.test.InstrumentationTestRunner。

(8)signingConfig

配置默认的签名信息,对生成的app进行签名。对应值是 SigningConfig 对象。 具体使用,查看 配置签名信息 部分

(9)proguardFile 和 proguardFiles

两者都是配置混淆规则文件,区别是proguardFile接受一个文件对象,而proguardFiles可以同时接受多个。

(10)multiDexEnabled

是否启动自动拆分多个Dex的功能,用于突破方法超过65535的设置, 后面再具体介绍

multiDexEnabled true

2、配置签名信息

Android Gradle 提供了 signingConfigs{} 配置块,用于生成多个签名配置信息,其类型是 NamedDomainObjectContainer ,因此,我们在 signingConfigs{} 中定义的都是一个 SigningConfig 的对象实例。

一个SigningConfig,即签名配置,可配置的元素有: storeFile : 签名文件位置; storeType :签名证书类型(可不填); storePassword :签名证书密码; keyAlias :签名证书密钥别名; keyPassword :签名证书中的密钥的密码。如:

signingConfigs{
        release{ //生成了release的签名配置
            storeFile file('../John.jks')
            storePassword '12345678'
            keyAlias 'key0'
            keyPassword '12345678'
        }
    }
复制代码

注:debug签名文件一般位于$HOME/.android/debug.keystore

对于生成的签名配置,可以应用到 defaultConfig 中的 signingConfig 进行默认签名配置或应用到 buildTypes 中针对构建类型进行签名配置。如:

buildTypes {
        release {
            signingConfig signingConfigs.release //配置release类型签名
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    
    defaultConfig {
        applicationId "com.example.john.tapeview"
        minSdkVersion 24
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        signingConfig signingConfigs.release  //配置默认签名
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
复制代码

3、构建类型(buildTypes)

buildTypes{}signingConfigs{} 一样,都是Android 的一个方法,接收到也是域对象 NamedDomainObjectContainer ,添加的每一个都是 BuildType 类型。

每一个BuildType都会生成一个SourceSet,默认位置是src//,因此,可以单独为其指定 Java 源代码和res资源等。且,新增的BuildType不能命名为 main 或 androidTest(因android默认已经生成),且相互之间不能同名。

(1)applicationIdSuffix

用于配置基于applicationId的后缀,如applicationId为 com.John.gradle.sample , 在debug的buildType中指定 applicationIdSuffix ".debug" ,则生成的debug的包名为com.John.gradle.sample.debug

(2)signingConfig

配置签名信息,使用同前面提到的 defaultConfig一样。

(3)启动zipAlign优化

zipalign是android提供的整理优化apk的工具,能提高系统和应用的运行效率,更快读写apk资源,降低内存,所以,对于发布的apk,一般开启 zipAlignEnabled true //true为开启

(4)资源清理shrinkResources

用于配置是否自动清理未使用的资源,true为开启,false为关闭。需 结合混淆 使用。

(5)使用混淆 minifyEnabled

启用混淆可以优化代码,同时结合 shrinkResources 清理资源,可以缩小apk包,还可以混淆代码。一般发布的都是要混淆的。

开启混淆: minifyEnabled true //true为开启 ;使用 proguardFileproguardFiles 设置混淆规则文件,两者区别如前面defaultConfig中说明。

**注:**对于多渠道打包,每个productFlavor都可以单独配置混淆规则文件(通过各自的 proguardFileproguardFiles )。

(6)multiDexEnabled

是否启动自动拆分多个Dex的功能,用于突破方法超过65535的设置, 后面再具体介绍

multiDexEnabled true

(7)debuggable 和 jniDebuggable

debuggable:是否生成一个可供调试的apk,对应值为boolean类型;

jniDebuggable:是否生成一个可供调试Jni(C/C++)代码的apk,对应值为boolean类型;

二、Android gradle高级自定义

1、批量修改生成的apk文件名

Android Gradle提供了3个属性,applicationVariants(仅仅适用于Android 应用Gradle插件),和libraryVariants(仅仅适用于Android库gradle插件),testVariants(以上两种都适用)

applicationVariants是一个集合,每一个元素都是一个生成的产物,即 xxxRelease 和 xxxDebug 等(即生成apk) ,它有一个outputs作为输出集合。遍历,若名字以.apk结尾,那么就是要修改的apk输出。

//动态改变生成的apk的名字:  项目名_渠道名_v版本名_构建日期.apk
    applicationVariants.all { variant ->
        variant.outputs.all { output ->
            if (output.outputFile != null && output.outputFile.name.endsWith('.apk')
                    &&'release'==(variant.buildType.name)) {
                def flavorName = variant.flavorName.startsWith("_") ? variant.flavorName.substring(1) : variant.flavorName
                def apkFileName = "Example92_${flavorName}_v${variant.versionName}_${buildTime()}.apk"
                outputFileName = apkFileName
            }
        }
    }
复制代码

2、多方式配置 VersionCode 和 VersionName

(1)通过应用脚本插件(apply from)

  1. 新建一个 version.gradle (当前存放在项目路径下的gradle文件夹中),并设置自定义属性
Android Gradle使用总结(2)
ext{
    appVersionCode = 1
    appVersionName = '1.0.2'
}
复制代码
  1. 在rootProject中应用该脚本文件
apply from : 'gradle/version.gradle'
复制代码
  1. 可在任意子工程中引用该设置:
Android Gradle使用总结(2)

(2)直接在属性文件(xxx.properties)中定义使用

  1. 在工程目录下的gradle.properties中定义
    Android Gradle使用总结(2)
    3.可在任意子工程中引用该设置:
Android Gradle使用总结(2)

(3)从 git 的 tag 上获取 VersionName 和 versionCode

/**
 * 以git tag的数量作为其版本号
 * @return tag的数量
 */
def static getAppVersionCode(){
    def stdout = new ByteArrayOutputStream()
    exec {
        commandLine 'git','tag','--list'
        standardOutput = stdout
    }
    return stdout.toString().split("\n").size()
}

/**
 * 从git tag中获取应用的版本名称
 * @return git tag的名称
 */
def static getAppVersionName(){
    def stdout = new ByteArrayOutputStream()
    exec {
        commandLine 'git','describe','--abbrev=0','--tags'
        standardOutput = stdout
    }
    return stdout.toString().replaceAll("\n","")
}
复制代码

3、动态配置AndroidManifest文件

在构建过程,动态修改 AndroidManifest 文件中的内容

android gradle 提供了非常便捷的方法替换AndroidManifest文件中的内容,即manifestPlaceholder、Manifest占位符。

manifestPlaceholdersProductFlavor的一个属性,Map类型 ,所以可以同时配置多个占位符。

  1. 定义占位符:
...

productFlavors{
    google{
        manifestPlaceholders.put("UMENG_CHANNEL","google")
    }
    baidu{
        manifestPlaceholders.put("UMENG_CHANNEL","baidu")
    }
}

...
复制代码
  1. 在AndroidManifes中使用这个占位符 "UMENG_CHANNEL"
...
<application>
    ...
    <meta-data android:value="${UMENG_CHANNEL}" android:name = "UMENG_CHANNEL"/>
    ...
</application>
...
复制代码
  1. 亦可以迭代修改占位符
...
productFlavors{
        google{
        }
        baidu{
        }
    }
productFlavors.all{flavor->
    manifestPlaceholders.put("UMENG_CHANNEL",flavor.name)
}
...
复制代码

4、自定义BuildConfig

Android gradle提供了 buildConfigField(Srting type,String name ,String value) 来实现添加常量到 BuildConfig 中。 一般在 productFlavorsbuildTypes 中使用 :

注:对于value是String类型的,双引号一定得加上,这里写了什么,buildConfig会原封不动放上去

...
productFlavors{
        google{
            //对于value是String类型的,双引号一定得加上,这里写了什么,buildConfig会原封不动放上去
            buildConfigField 'String','name','"google"'
        }
        baidu{
            buildConfigField 'String','name','"baidu"'
        }
}
...
复制代码
Android Gradle使用总结(2)

5、动态添加自定义的资源

Android gradle提供了 resValue(String type,String name,String value) 来 添加资源。 只能在 productFlavorsbuildTypes 中使用

注:这里写了什么,编译出来后也会原封不动放上去

Android Gradle使用总结(2)

6、Dex选项配置

android {
    ...
    
    dexOptions {
        incremental true //android studio3.x以上已废弃,是否开启dx增量模式
        javaMaxHeapSize '4g' //提高java执行dx命令时的最大分配内存
        jumboMode true //强制开启jumboMode模式,让方法超过65535也构建成功
        pre
    }
    
    ...
}

复制代码

7、编译选项和adb操作选项

android {
    ...
    
    compileOptions {
        encoding = 'utf-8'
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    adbOptions{
      timeOutInMs = 5000 //设置超时时间,单位 ms
      installOptions '-r','-s'//安装选项,一般不使用
    }
    
    ...
}

复制代码

8、突破方法超过65535的限制

  1. defaultConfigbuildTypesproductFlavors 中,开启 multiDexEnabledmultiDexEnabled true

  2. 增加依赖: implementation 'com.android.support:multidex:1.0.3'

  3. 在自定义的 Application 中设置(5.0以上天然支持):

使自定义的Application继承 MultiDexApplication

Android Gradle使用总结(2)

或直接在java代码中修改:

...
@Override
protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);
    MultiDex.install(this);
}
...
复制代码

多渠道构建

一个构建产物(apk),即Build Variant = BuildType + ProductFlavor,其中ProductFlavor又进一步划分dimensions,即 Build Variant = BuildType + ProductFlavor's dimensions

1、多渠道构建ProductFlavor属性

...
productFlavors{
        google{
            applicationId "com.john.xxx"
        }
}
...
复制代码

(1)applicationId,跟前面所述一样。

(2)manifestPlaceholders,跟前面所述一样。

(3)multiDexEnabled,跟前面所述一样。

(4)proguardFiles,跟前面所述一样。

(5)signingConfig,跟前面所述一样。

(6)testApplicationId,跟前面所述一样。

(7)versionCode 和 versionName,跟前面所述一样。

(8)dimension

作为 ProductFlavor 的维度,可理解为 ProductFlavor 的分组

如,free 和 paid 属于version分组,而x86 和 arm属于架构分组:

android{
    ...
    
    flavorDimensions "version","abi" //定义分组
    productFlavors{
        free{
            dimension 'version'
        }
        paid{
            dimension 'version'
        }
        x86{
            dimension 'abi'
        }
        arm{
            dimension 'abi'
        }
    }
    ...
}
复制代码

对于以上的设置, Build Variant = BuildType + ProductFlavor's dimensions ,则生成的assemble任务, 即variant:

  • ArmFreeDebug
  • ArmFreeRelaese
  • ArmPaidDebug
  • ArmPaidRelease
  • X86FreeDebug
  • X86FreeRelaese
  • X86PaidDebug
  • X86PaidRelease

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

统计思维:程序员数学之概率统计

统计思维:程序员数学之概率统计

Allen B.Downey / 张建锋、陈钢 / 人民邮电出版社 / 2013-5 / 29.00元

代码跑出来的概率统计问题; 程序员的概率统计开心辞典; 开放数据集,全代码攻略。 现实工作中,人们常被要求用数据说话。可是,数据自己是不能说话的,只有对它进行可靠分析和深入挖掘才能找到有价值的信息。概率统计是数据分析的通用语言,是大数据时代预测未来的根基。 站在时代浪尖上的程序员只有具备统计思维才能掌握数据分析的必杀技。本书正是一本概率统计方面的入门图书,但视角极为独特,折......一起来看看 《统计思维:程序员数学之概率统计》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

html转js在线工具
html转js在线工具

html转js在线工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具