美文网首页
Android Gradle 使用技巧

Android Gradle 使用技巧

作者: JustCode | 来源:发表于2017-07-19 17:37 被阅读164次

    总结一下gradle在项目中的一些使用技巧

    1. 全局的配置信息
      在project目录下创建一个config.gradle文件,将每个module相同的配置信息都可以在此文件中设置全局变量,例如:

      ext{ // gradle的全局属性必须放在ext闭包中
           android = [
               compileSdkVersion: 25,
               buildToolsVersion: "26.0.0",
               minSdkVersion    : 15,
               targetSdkVersion : 25,
               versionCode      : 1,
               versionName      : "1.0"
           ]
      
           dependencies = [
                 appcompatV7      : 'com.android.support:appcompat-v7:25.+',
                 constraintLayout : 'com.android.support.constraint:constraint-layout:1.0.2',
                 junit            : 'junit:junit:4.12'
           ]
      }
      

    然后需要在project目录下的build.gradle中通过apply from: 'config.gradle'引入全局属性文件config.gradle
    在module中的build.gradle调用如下:

       dependencies { 
                    compile rootProject.ext.dependencies.appcompatV7      
                    compile rootProject.ext.dependencies.constraintLayout
                    testCompile rootProject.ext.dependencies.junit
       }
    
    • 调用gradle.properties文件中变量
      类似签名信息不应该直接暴露在build.gradle文件中,将它保存在gradle.properties文件中是一种不错的做法。在gradle.properties中添加:

         STORE_FILE = /xx/app_key.jks   // 这边不能打引号
         STORE_PWD = xxx
         KEY_ALIAS = xxx
         KEY_PWD = xxx
      

    在module中的build.gradle调用如下:

        signingConfigs {
            release {
                   storeFile file(STORE_FILE)
                   storePassword STORE_PWD
                   keyAlias KEY_ALIAS
                   keyPassword KEY_PWD
           }
      }
    

    还可以将gradle.properties文件设置的变量供java文件以及`xml``文件调用,比如:

      buildTypes {
            release {
                  minifyEnabled true
                  shrinkResources true
                  signingConfig signingConfigs.release
                  proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
                  buildConfigField("String", "STORE_PWD", "\"${STORE_PWD}\"") // 往release版本中BuildConfig里面设置值
                  resValue("string", "KEY_PWD", "${KEY_PWD}") // 往release版本资源文件中设置值
            }
            debug {
                    buildConfigField("String", "STORE_PWD", "\"${STORE_PWD}\"") // 往debug版本BuildConfig里面设置值
                    resValue("string", "KEY_PWD", "${KEY_PWD}") // 往debug版本资源文件中设置值
            }
       }
       //  然后就可以在java代码中,通过BuildConfig.XXX进行调用;在layout_xml中直接可以通过android:text="@string/KEY_PWD"进行调用
       // 其中,buildConfigField定义的方式是
       // buildConfigField 类型,变量名,值
       // resValue定义的方式是
       // resValue XML中的类型,变量名,值
       // 对于类型的设置,buildConfigField必须跟java代码中是相同的,比如String 就不能写成string,因为是String 类型,值需要打上双引号;同样resValue也需要对应
    

    实际开发中,debug版本和release版本的接口地址是不同,通过这种方式去设置,就不需要在每次打不同版本包的时候去注释代码了。

    • 调用local.properties文件中变量
      local.properties文件中一般存储着本地的sdk、ndk的路径信息,当然在此文件中同样可以配置变量,比如签名信息,只不过这是本地的,一般不用push到远程仓库中。
      local.properties文件中添加变量跟gradle.properties没区别,区别在于读取:

       Properties properties = new Properties();
       properties.load(new FileInputStream(file("../local.properties")))  // 需要显示指明文件路径
       // 并且当前路径是在app目录下,所以获取project目录下的`local.properties`,应该是../local.properties
       buildTypes {
        debug {
            buildConfigField("String", "URL", "\"${properties['URL']}\"")
            resValue("string", "url", "${properties['URL']}")
        }
      }
      

      其实也可以自定义properties文件,访问形式跟访问local.properties相同,只需要更改文件路径就好。

    • 替换AndroidManifest中的占位符
      可以在AndroidManifest文件中设置一个占位符,类似${app_label}

        <application
            android:name=".AppApplication"
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="${app_label}"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name=".MainActivity">
              <intent-filter>
                  <action android:name="android.intent.action.MAIN" />
                  <category android:name="android.intent.category.LAUNCHER" />
              </intent-filter>
          </activity>
      </application>
      

    然后在module下的build.gradle文件中进行设置,可以设置在defaultConfig闭包中,也可以设置在buildTypes下不同版本的闭包中,设置在不同版本的闭包中,那么就可以实现为不同版本的app设置不同的名称了,app log 同样可以通过此种方式来进行配置:

    // defaultConfig中设置           
    defaultConfig { 
         // ... 省略其他配置
         manifestPlaceholders = [app_label:"@string/app_name"]
    }
    
    // buildTypes中设置
     buildTypes {
          release {
               // ... 省略其他配置
            manifestPlaceholders = [app_label:"@string/app_name_release"]
        }
        debug {
             // ... 省略其他配置
            manifestPlaceholders = [app_label:"@string/app_name_debug"]
        }
    }
    

    除了可以给不同版本app设置不同名称已经图片之外,还有一种重要的用法就是打渠道包。

     android {
       productFlavors {
        dev{
            manifestPlaceholders = [channel:"dev"]
         }
        official{
            manifestPlaceholders = [channel:"official"]
        }
        // ... ...
        wandoujia{
            manifestPlaceholders = [channel:"wandoujia"]
        }
        xiaomi{
            manifestPlaceholders = [channel:"xiaomi"]
        }
        "360"{  // flavor名如果是数字开头,必须用引号引起来。
            manifestPlaceholders = [channel:"360"]
        }
    }
    
    • 自定义导出apk名称

       android {
           applicationVariants.all { variant ->
                  variant.outputs.each { output ->
                     output.outputFile = new File(
                         output.outputFile.parent + "/${variant.buildType.name}",
                    "xx-${variant.buildType.name}-${variant.versionName}-${variant.productFlavors[0].name}.apk".toLowerCase())
                  }
          }
      }

    相关文章

      网友评论

          本文标题:Android Gradle 使用技巧

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