使用Gradle管理你的Android Studio工程

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

      }

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

  }

 </div>

 <div class="line" style="height:1.3em; font-size:13px"></div>

 <div class="line" style="height:1.3em; font-size:13px">

  dependencies {

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

      compile fileTree(dir: 

  <span class="string" style="color:rgb(24,54,145)">'libs'</span>, include: [

  <span class="string" style="color:rgb(24,54,145)">'*.jar'</span>])

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

      compile 

  <span class="string" style="color:rgb(24,54,145)">'com.android.support:appcompat-v7:22.0.0'</span>

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

  }

 </div></pre></td></tr></tbody></table>

开头第一行apply plugin: ‘com.android.application’,这表示该module是一个app module,应用了com.android.application插件,如果是一个android library,那么这里的是apply plugin: ‘com.android.library’。

其次是基于哪个SDK编译,这里是API LEVEL,是21,buildToolsVersion是基于哪个构建工具版本进行构建的。defaultConfig是默认配置,如果没有其他的配置覆盖,就会使用这里的。看其属性的名字就可以知道其作用,比如applicationId是配置包名的,versionCode是版本号,versionName是版本名称等。

buildTypes是构建类型,常用的有release和debug两种,可以在这里面启用混淆,启用zipAlign以及配置签名信息等。

dependencies就不属于Android专有的配置了,它定义了该module需要依赖的jar,aar,jcenter库信息。

配置应用的签名信息

=========================================================================================================================================================================================

在android.signingConfigs{}下定义一个或者多个签名信息,然后在buildTypes{}配置使用即可。比如这里

     
     
     
  1

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  2

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  3

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  4

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  5

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  6

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  7

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  8

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  9

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  10

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  11

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  12

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  13

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  14

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  15

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  16

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  17

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  18

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  19

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  20

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  21

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  22

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  23

 </div></pre></td><td class="code" style="padding:0.3em 15px 0.3em 1em; font-family:Menlo,Consolas,monospace; border:none; margin:0px; vertical-align:top; width:647.5px; background-color:inherit"><pre style="margin-top:0px; margin-bottom:0px; font-family:Menlo,Consolas,monospace; font-size:1em; overflow-x:auto; overflow-y:hidden; border:none; padding:0px; max-width:700px; width:647.5px; background-color:inherit">     <div class="line" style="height:1.3em; font-size:13px">

  android {

 </div>

 <div class="line" style="height:1.3em; font-size:13px"></div>

 <div class="line" style="height:1.3em; font-size:13px">

      signingConfigs {

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

          release {

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

              storeFile file(

  <span class="string" style="color:rgb(24,54,145)">"release.keystore"</span>)

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

              keyAlias 

  <span class="string" style="color:rgb(24,54,145)">"release"</span>

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

              keyPassword 

  <span class="string" style="color:rgb(24,54,145)">"123456"</span>

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

              storePassword 

  <span class="string" style="color:rgb(24,54,145)">"123456"</span>

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

          }

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

          debug {

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

              ...

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

          }

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

      }

 </div>

 <div class="line" style="height:1.3em; font-size:13px"></div>

 <div class="line" style="height:1.3em; font-size:13px">    

 </div><pre style="font-family:Consolas; font-size:9pt; background-color:rgb(255,255,255)"><span style="color:#808080"><em>//</em></span><span style="color:#808080; font-family:'宋体'"><em>构建配置

buildTypes {

debug {

    signingConfig signingConfigs.debug

    <span style="color:#808080"><em>// </em></span><span style="color:#808080; font-family:'宋体'"><em>显示</em></span><span style="color:#808080"><em>Log

buildConfigField “boolean”, “LOG_DEBUG”, “true”

versionNameSuffix “-debug”

minifyEnabled false

debuggable true

zipAlignEnabled false

shrinkResources false

proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.pro’

}

release {

    signingConfig signingConfigs.release

    <span style="color:#808080"><em>// </em></span><span style="color:#808080; font-family:'宋体'"><em>不显示</em></span><span style="color:#808080"><em>Log

buildConfigField “boolean”, “LOG_DEBUG”, “false”

//混淆

minifyEnabled true

//Zipalign优化

zipAlignEnabled true

// 移除无用的resource文件

shrinkResources true

proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.pro’

}

}

 <div class="line" style="height:1.3em; font-size:13px"></div>

 <div class="line" style="height:1.3em; font-size:13px">

    }

 </div></pre></td></tr></tbody></table>

storeFile是签名证书文件,keyAlias是别名,keyPassword是key的密码,storePassword是证书的密码。配好好相关信息即可在buildTypes配置使用。

启用proguard混淆

==========================================================================================================================================================

我们可以为不同的buildTypes选择是否启用混淆,一般release发布版本是需要启用混淆的,这样别人反编译之后就很难分析你的代码,而我们自己开发调试的时候是不需要混淆的,所以debug不启用混淆。对release启用混淆的配置如下:

     
     
     
  1

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  2

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  3

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  4

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  5

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  6

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  7

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  8

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  9

 </div></pre></td><td class="code" style="padding:0.3em 15px 0.3em 1em; font-family:Menlo,Consolas,monospace; border:none; margin:0px; vertical-align:top; width:654.5px; background-color:inherit"><pre style="margin-top:0px; margin-bottom:0px; font-family:Menlo,Consolas,monospace; font-size:1em; overflow-x:auto; overflow-y:hidden; border:none; padding:0px; max-width:700px; width:654.5px; background-color:inherit">     <div class="line" style="height:1.3em; font-size:13px">

  android {

 </div>

 <div class="line" style="height:1.3em; font-size:13px"></div>

 <div class="line" style="height:1.3em; font-size:13px">

      buildTypes {

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

          release {

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

              minifyEnabled 

  <span class="literal" style="color:rgb(0,134,179)">true</span>

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

              proguardFile 

  <span class="string" style="color:rgb(24,54,145)">'proguard.cfg'</span>

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

          }

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

     }

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

  }

 </div></pre></td></tr></tbody></table>

minifyEnabled为true表示启用混淆,proguardFile是混淆使用的配置文件,这里是module根目录下的proguard.cfg文件

启用zipAlign

====================================================================================================================================

这个也是比较简单的,同样也是在buildTypes里配置,可以为不用的buildTypes选择时候开启zipAlign

     
     
     
  1

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  2

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  3

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  4

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  5

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  6

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  7

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  8

 </div></pre></td><td class="code" style="padding:0.3em 15px 0.3em 1em; font-family:Menlo,Consolas,monospace; border:none; margin:0px; vertical-align:top; width:654.5px; background-color:inherit"><pre style="margin-top:0px; margin-bottom:0px; font-family:Menlo,Consolas,monospace; font-size:1em; overflow-x:auto; overflow-y:hidden; border:none; padding:0px; max-width:700px; width:654.5px; background-color:inherit">     <div class="line" style="height:1.3em; font-size:13px">

  android {

 </div>

 <div class="line" style="height:1.3em; font-size:13px"></div>

 <div class="line" style="height:1.3em; font-size:13px">

      buildTypes {

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

          release {

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

              zipAlignEnabled 

  <span class="literal" style="color:rgb(0,134,179)">true</span>

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

          }

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

     }

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

  }

 </div></pre></td></tr></tbody></table>

多渠道打包

=============================================================================================================================================

东西到了国内就变了,做什么都是一窝蜂,比如Android App市场就是,所以才有了多渠道打包,每次发版几十个渠道包。还好Android Gradle给我们提供了productFlavors,让我们可以对生成的APK包进行定制,所以就有了多渠道。

     
     
     
  1

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  2

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  3

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  4

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  5

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  6

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  7

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  8

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  9

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  10

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  11

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  12

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  13

 </div></pre></td><td class="code" style="padding:0.3em 15px 0.3em 1em; font-family:Menlo,Consolas,monospace; border:none; margin:0px; vertical-align:top; width:647.5px; background-color:inherit"><pre style="margin-top:0px; margin-bottom:0px; font-family:Menlo,Consolas,monospace; font-size:1em; overflow-x:auto; overflow-y:hidden; border:none; padding:0px; max-width:700px; width:647.5px; background-color:inherit">     <div class="line" style="height:1.3em; font-size:13px">

  android  {

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

      productFlavors {

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

          dev{

 </div>

 <div class="line" style="height:1.3em; font-size:13px"></div>

 <div class="line" style="height:1.3em; font-size:13px">

          }

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

          google{

 </div>

 <div class="line" style="height:1.3em; font-size:13px"></div>

 <div class="line" style="height:1.3em; font-size:13px">

          }

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

          baidu{

 </div>

 <div class="line" style="height:1.3em; font-size:13px"></div>

 <div class="line" style="height:1.3em; font-size:13px">

          }

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

      }

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

  }

 </div></pre></td></tr></tbody></table>

这样当我们运行assembleRelease的时候就会生成3个release包,分别是dev、google以及baidu的。目前看这三个包除了文件名没有什么不一样,因为我们还没有定制,使用的都是defaultConfig配置。这里的flavor和defaultConfig是一样的,可以自定义其applicationId、versionCode以及versionName等信息,比如区分不同包名:

     
     
     
  1

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  2

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  3

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  4

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  5

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  6

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  7

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  8

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  9

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  10

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  11

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  12

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  13

 </div></pre></td><td class="code" style="padding:0.3em 15px 0.3em 1em; font-family:Menlo,Consolas,monospace; border:none; margin:0px; vertical-align:top; width:647.5px; background-color:inherit"><pre style="margin-top:0px; margin-bottom:0px; font-family:Menlo,Consolas,monospace; font-size:1em; overflow-x:auto; overflow-y:hidden; border:none; padding:0px; max-width:700px; width:647.5px; background-color:inherit">     <div class="line" style="height:1.3em; font-size:13px">

  android  {

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

      productFlavors {

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

          dev{

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

              applicationId 

  <span class="string" style="color:rgb(24,54,145)">"org.flysnow.demo.dev"</span>

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

          }

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

          google{

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

              applicationId 

  <span class="string" style="color:rgb(24,54,145)">"org.flysnow.demo.google"</span>

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

          }

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

          baidu{

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

              applicationId 

  <span class="string" style="color:rgb(24,54,145)">"org.flysnow.demo.baidu"</span>

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

          }

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

      }

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

  }

 </div></pre></td></tr></tbody></table>

批量修改生成的apk文件名

=============================================================================================================================================================================================================

在我们打包发版的时候,一次性打几十个包,这时候我们就想让生成的apk文件名有区分,比如一眼就能看出这个apk是哪个版本的,哪个渠道的,是哪天打的包等等,这就需要我们在生成apk文件的时候动态修改生成的apk文件名达到这一目的。这里以我们的产品随手记为例:

     
     
     
  1

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  2

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  3

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  4

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  5

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  6

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  7

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  8

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  9

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  10

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  11

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  12

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  13

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  14

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  15

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  16

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  17

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  18

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  19

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  20

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  21

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  22

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  23

 </div></pre></td><td class="code" style="padding:0.3em 15px 0.3em 1em; font-family:Menlo,Consolas,monospace; border:none; margin:0px; vertical-align:top; width:647.5px; background-color:inherit"><pre style="margin-top:0px; margin-bottom:0px; font-family:Menlo,Consolas,monospace; font-size:1em; overflow-x:auto; overflow-y:hidden; border:none; padding:0px; max-width:700px; width:647.5px; background-color:inherit">     <div class="line" style="height:1.3em; font-size:13px">

  def 

  <span class="function"><span class="title" style="color:rgb(121,93,163)">buildTime</span></span>() {

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

      def date = new Date()

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

      def formattedDate = date.format(

  <span class="string" style="color:rgb(24,54,145)">'yyyyMMdd'</span>)

 </div>

 <div class="line" style="height:1.3em; font-size:13px">    

  <span class="built_in" style="color:rgb(0,134,179)">return</span> formattedDate

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

  }

 </div>

 <div class="line" style="height:1.3em; font-size:13px"></div>

 <div class="line" style="height:1.3em; font-size:13px">

  android {

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

      buildTypes {

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

          release {

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

              applicationVariants.all { variant -&gt;

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

                  variant.outputs.each { output -&gt;

 </div>

 <div class="line" style="height:1.3em; font-size:13px">                    

  <span class="keyword" style="color:rgb(167,29,93)">if</span> (output.outputFile != null &amp;&amp; output.outputFile.name.endsWith(

  <span class="string" style="color:rgb(24,54,145)">'.apk'</span>)

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

                          &amp;&amp;

  <span class="string" style="color:rgb(24,54,145)">'release'</span>.equals(variant.buildType.name)) {

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

                          def apkFile = new File(

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

                                  output.outputFile.getParent(),

 </div>

 <div class="line" style="height:1.3em; font-size:13px">                                

  <span class="string" style="color:rgb(24,54,145)">"Mymoney_<span class="variable" style="color:rgb(51,51,51)">${variant.flavorName}</span>_v<span class="variable" style="color:rgb(51,51,51)">${variant.versionName}</span>_<span class="variable" style="color:rgb(51,51,51)">${buildTime()}</span>.apk"</span>)

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

                          output.outputFile = apkFile

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

                      }

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

                  }

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

              }

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

          }

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

      }

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

  }

 </div></pre></td></tr></tbody></table>

以baidu渠道为例,以上的代码会生成一个名字为Mymoney_baidu_v9.5.2.6_20150330.apk安装包。下面我们分析一下,Android Gradle任务比较复杂,它的很多任务都是自动生成的,为了可以更灵活的控制,Android Gradle提供了applicationVariants、libraryVariants以及testVariants,他们分别适用于app、library、app和library都适用。

这里是循环处理每个applicationVariant,当他们的输出文件名以apk结尾并且buildType是release时,重新设置新的输出文件名,这样就达到了我们批量修改生成的文件名的目的。

AndroidManifest里的占位符

==========================================================================================================================================================================================

AndroidManifest.xml这是一个很重要的文件,我们的很多配置都在这里定义。有时候我们的一些配置信息,比如一个第三方应用的key,第三方统计分析的渠道号等也要在这里进行配置。这里以友盟统计分析平台为例,演示这一功能的使用。在友盟统计分析中,我们需要根据渠道进行统计,比如google,百度,应用宝等渠道的活跃新增等,友盟的SDK是在AndroidManifest里配置一个name为UMENG_CHANNEL的meta-data,这样这个meta-data的值就表示这个apk是哪个渠道,我们版本发布有几十个渠道,以前ant打包的时候是采用文字替换的办法,现在Gradle有更好的处理办法,那就是manifestPlaceholders,它允许我们动态替换我们在AndroidManifest文件里定义的占位符。

     
     
     
  1

 </div></pre></td><td class="code" style="padding:0.3em 15px 0.3em 1em; font-family:Menlo,Consolas,monospace; border:none; margin:0px; vertical-align:top; width:654.5px; background-color:inherit"><pre style="margin-top:0px; margin-bottom:0px; font-family:Menlo,Consolas,monospace; font-size:1em; overflow-x:auto; overflow-y:hidden; border:none; padding:0px; max-width:700px; width:654.5px; background-color:inherit">     <div class="line" style="height:1.3em; font-size:13px">

  <span class="tag" style="border:none; padding:0px; margin:0px; color:rgb(51,51,51); background-color:inherit">&lt;<span class="name" style="color:rgb(99,163,92)">meta-data</span> <span class="attr" style="color:rgb(121,93,163)">android:value</span>=<span class="string" style="color:rgb(24,54,145)">"${UMENG_CHANNEL_VALUE}"</span> <span class="attr" style="color:rgb(121,93,163)">android:name</span>=<span class="string" style="color:rgb(24,54,145)">"UMENG_CHANNEL"</span>/&gt;</span>

 </div></pre></td></tr></tbody></table>

如上${UMENG_CHANNEL_VALUE}就是一个占位符,然后我们在gradle的defaultConfig;里这样定义脚本:

     
     
     
  1

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  2

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  3

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  4

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  5

 </div></pre></td><td class="code" style="padding:0.3em 15px 0.3em 1em; font-family:Menlo,Consolas,monospace; border:none; margin:0px; vertical-align:top; width:654.5px; background-color:inherit"><pre style="margin-top:0px; margin-bottom:0px; font-family:Menlo,Consolas,monospace; font-size:1em; overflow-x:auto; overflow-y:hidden; border:none; padding:0px; max-width:700px; width:654.5px; background-color:inherit">     <div class="line" style="height:1.3em; font-size:13px">

  android {

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

      defaultConfig {

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

          manifestPlaceholders = [UMENG_CHANNEL_VALUE: 

  <span class="string" style="color:rgb(24,54,145)">'dev'</span>]

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

      }

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

  }

 </div></pre></td></tr></tbody></table>

以前的意思就是我们的默认配置里AndroidManifest的${UMENG_CHANNEL_VALUE}占位符会被dev这个字符串所替换,也就说默认运行的版本是一个开发板。以此类推,我们其他渠道的版本就可以这样定义:

     
     
     
  1

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  2

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  3

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  4

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  5

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  6

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  7

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  8

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  9

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  10

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  11

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  12

 </div></pre></td><td class="code" style="padding:0.3em 15px 0.3em 1em; font-family:Menlo,Consolas,monospace; border:none; margin:0px; vertical-align:top; width:647.5px; background-color:inherit"><pre style="margin-top:0px; margin-bottom:0px; font-family:Menlo,Consolas,monospace; font-size:1em; overflow-x:auto; overflow-y:hidden; border:none; padding:0px; max-width:700px; width:647.5px; background-color:inherit">     <div class="line" style="height:1.3em; font-size:13px">

  android  {

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

      productFlavors {

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

          google{

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

              applicationId 

  <span class="string" style="color:rgb(24,54,145)">"org.flysnow.demo.google"</span>

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

              manifestPlaceholders.put(

  <span class="string" style="color:rgb(24,54,145)">"UMENG_CHANNEL_VALUE"</span>,

  <span class="string" style="color:rgb(24,54,145)">'google'</span>)

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

          }

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

          baidu{

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

              applicationId 

  <span class="string" style="color:rgb(24,54,145)">"org.flysnow.demo.baidu"</span>

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

              manifestPlaceholders.put(

  <span class="string" style="color:rgb(24,54,145)">"UMENG_CHANNEL_VALUE"</span>,

  <span class="string" style="color:rgb(24,54,145)">'baidu'</span>)

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

          }

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

      }

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

  }

 </div></pre></td></tr></tbody></table>

这样有多少个渠道就做多少次这样的定义,即可完成分渠道统计。但是如果上百个渠道,这样一个个写的确太累,很麻烦,我们继续研究,同学们有没有发现,我们的渠道名字和我们的flavorName一样,我们用这个flavorName作为UMENG_CHANNEL_VALUE不就好了吗,可以批量的替换吗?当然可以,这又体现了我们Gradle的强大和灵活之处。

     
     
     
  1

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  2

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  3

 </div></pre></td><td class="code" style="padding:0.3em 15px 0.3em 1em; font-family:Menlo,Consolas,monospace; border:none; margin:0px; vertical-align:top; width:654.5px; background-color:inherit"><pre style="margin-top:0px; margin-bottom:0px; font-family:Menlo,Consolas,monospace; font-size:1em; overflow-x:auto; overflow-y:hidden; border:none; padding:0px; max-width:700px; width:654.5px; background-color:inherit">     <div class="line" style="height:1.3em; font-size:13px">

  productFlavors.all { flavor -&gt;

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

          manifestPlaceholders.put(

  <span class="string" style="color:rgb(24,54,145)">"UMENG_CHANNEL_VALUE"</span>,name)

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

      }

 </div></pre></td></tr></tbody></table>

循环每个flavor,并把他们的UMENG_CHANNEL_VALUE设置为他们自己的name名字,ok,搞定。

自定义你的BuildConfig

==============================================================================================================================================================================

BuildConfig.java是Android Gradle自动生成的一个java类文件,无法手动编译,但是可以通过Gradle控制,也就是说他是动态可配置的,有了这个功能就很好玩了,这里以生产环境和测试环境为例来说明该功能的使用。

我们在开发App的时候免不了要和服务器进行通信,我们的服务器一般都有生产和测试环境,当我们处理开发和测试的时候使用测试环境进行调试,正式发布的时候使用生成环境。以前的时候我们通过把不同的配置文件打包进APK中来控制,现在不一样了,我们有更简便的方法,这就是buildConfigField。

     
     
     
  1

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  2

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  3

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  4

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  5

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  6

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  7

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  8

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  9

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  10

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  11

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  12

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  13

 </div></pre></td><td class="code" style="padding:0.3em 15px 0.3em 1em; font-family:Menlo,Consolas,monospace; border:none; margin:0px; vertical-align:top; width:647.5px; background-color:inherit"><pre style="margin-top:0px; margin-bottom:0px; font-family:Menlo,Consolas,monospace; font-size:1em; overflow-x:auto; overflow-y:hidden; border:none; padding:0px; max-width:700px; width:647.5px; background-color:inherit">     <div class="line" style="height:1.3em; font-size:13px">

  android {

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

      defaultConfig {

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

          buildConfigField 

  <span class="string" style="color:rgb(24,54,145)">'String'</span>,

  <span class="string" style="color:rgb(24,54,145)">'API_SERVER_URL'</span>,

  <span class="string" style="color:rgb(24,54,145)">'"http://test.flysnow.org/"'</span>

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

      }

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

      productFlavors {

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

          google{

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

              buildConfigField 

  <span class="string" style="color:rgb(24,54,145)">'String'</span>,

  <span class="string" style="color:rgb(24,54,145)">'API_SERVER_URL'</span>,

  <span class="string" style="color:rgb(24,54,145)">'"http://www.flysnow.org/"'</span>

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

          }

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

          baidu{

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

              buildConfigField 

  <span class="string" style="color:rgb(24,54,145)">'String'</span>,

  <span class="string" style="color:rgb(24,54,145)">'API_SERVER_URL'</span>,

  <span class="string" style="color:rgb(24,54,145)">'"http://www.flysnow.org/"'</span>

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

          }

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

      }

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

  }

 </div></pre></td></tr></tbody></table>

buildConfigField 一共有3个参数,第一个是数据类型,就是你定义的常量值是一个什么类型,和Java的类型是对等的,这里是String。第二个参数是常量名,这里是API_SERVER_URL。第三个参数是常量值。如此定义之后,就会在BuildConfig.java中生成一个常量名为API_SERVER_URL的常量定义。默认配置的生成是:

     
     
     
  1

 </div></pre></td><td class="code" style="padding:0.3em 15px 0.3em 1em; font-family:Menlo,Consolas,monospace; border:none; margin:0px; vertical-align:top; width:654.5px; background-color:inherit"><pre style="margin-top:0px; margin-bottom:0px; font-family:Menlo,Consolas,monospace; font-size:1em; overflow-x:auto; overflow-y:hidden; border:none; padding:0px; max-width:700px; width:654.5px; background-color:inherit">     <div class="line" style="height:1.3em; font-size:13px">

  <span class="keyword" style="color:rgb(167,29,93)">public</span> 

  <span class="keyword" style="color:rgb(167,29,93)">final</span> 

  <span class="keyword" style="color:rgb(167,29,93)">static</span> String API_SERVER_URL = 

  <span class="string" style="color:rgb(24,54,145)">"http://test.flysnow.org/"</span>

 </div></pre></td></tr></tbody></table>

当是baidu和google渠道的时候生成的就是http://www.flysnow.org/了。这个常量可以在我们编码中引用。在我们进行打包的时候会根据Gradle配置动态替换。

我们发现一般渠道版本都是用来发布的,肯定用的是生产服务器,所以我们可以使用批处理来搞定这个事情,而不用在一个个渠道里写这些配置。

     
     
     
  1

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  2

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  3

 </div></pre></td><td class="code" style="padding:0.3em 15px 0.3em 1em; font-family:Menlo,Consolas,monospace; border:none; margin:0px; vertical-align:top; width:654.5px; background-color:inherit"><pre style="margin-top:0px; margin-bottom:0px; font-family:Menlo,Consolas,monospace; font-size:1em; overflow-x:auto; overflow-y:hidden; border:none; padding:0px; max-width:700px; width:654.5px; background-color:inherit">     <div class="line" style="height:1.3em; font-size:13px">

  productFlavors.all { flavor -&gt;

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

          buildConfigField 

  <span class="string" style="color:rgb(24,54,145)">'String'</span>,

  <span class="string" style="color:rgb(24,54,145)">'API_SERVER_URL'</span>,

  <span class="string" style="color:rgb(24,54,145)">'"http://www.flysnow.org/"'</span>

 </div>

 <div class="line" style="height:1.3em; font-size:13px">

      }

 </div></pre></td></tr></tbody></table>

此外,比如Gradle的resValue,也是和buildConfigField,只不过它控制生成的是资源,比如我们在android的values.xml定义生成的字符串。可以用它来动态生成我们想要的字符串,比如应用的名字,可能一些渠道会不一样,这样就可以很灵活的控制自动生成,关于resValue详细介绍请参考相关文档,这里不再举例说明。

插装测试覆盖率代码

=========================================================================================================================================================================================

代码覆盖率现在已经成为检验单元测试是否覆盖到的一种手段,Android Gradle提供了原生的用于单元测试的代码覆盖率,这个就是jacoco。今天我们不谈这个,我想要的是在我们生成的APK包中已经包含了检测代码覆盖率的代码,这样当我们安装APK后运行进行一些测试的时候,这些检测代码覆盖率的代码就会被执行到,这样最后我们导出一份代码测试覆盖率的文件,然后生成查看测试覆盖率报告看哪些覆盖到,哪些没有覆盖到。这种场景在检测测试工程师测试功能以及Android UI自动化测试是否完全覆盖尤为有效。这里代码覆盖率框架我选择的是emma,一来这个在Ant打包的时候一直在用,二来它具有很方便的插装功能。

emma插装的是class文件,所以我们只能在编译完java文件生成class文件后进行插装,这是我们进行覆盖率代码插装的最好时机。找到了时机,那么具体对应在Gradle脚本上是哪呢?还记不记得我们上面讲的applicationVariants,每一个applicationVariant都有一个javaCompile属性,javaCompile是一个JavaCompile类型的Task,这个就是负责编译java代码的。是Task就有doLast方法,就是在这个任务本身完成之后要做的事情,我们就是在这个方法里进行我们的代码覆盖率的安装。一般我们这个插装只是在特性情况下,那么我们新增一个特殊的flavor好了,专门做这个使用,这里我姑且叫feature。

     
     
     
  1

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  2

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  3

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  4

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  5

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  6

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  7

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  8

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

总结

首先是感觉自己的基础还是不够吧,大厂好像都喜欢问这些底层原理。

另外一部分原因在于资料也还没有看完,一面时凭借那份资料考前突击恶补个几天居然也能轻松应对(在这里还是要感谢那份资料,真的牛),于是自我感觉良好,资料就没有怎么深究下去了。

之前的准备只涉及了Java、Android、计网、数据结构与算法这些方面,面对面试官对其他基础课程的考察显得捉襟见肘。

下一步还是要查漏补缺,进行针对性复习。

最后的最后,那套资料这次一定要全部看完,是真的太全面了,各个知识点都涵盖了,几乎我面试遇到的所有问题的知识点这里面都有!希望大家不要犯和我一样的错误呀!!!一定要看完!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

gn:top">

     
 
 

  1

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  2

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  3

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  4

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  5

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  6

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  7

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

  8

 </div>

 <div class="line" style="height:1.3em; font-size:13px; color:rgb(170,170,170)">

总结

首先是感觉自己的基础还是不够吧,大厂好像都喜欢问这些底层原理。

另外一部分原因在于资料也还没有看完,一面时凭借那份资料考前突击恶补个几天居然也能轻松应对(在这里还是要感谢那份资料,真的牛),于是自我感觉良好,资料就没有怎么深究下去了。

之前的准备只涉及了Java、Android、计网、数据结构与算法这些方面,面对面试官对其他基础课程的考察显得捉襟见肘。

下一步还是要查漏补缺,进行针对性复习。

最后的最后,那套资料这次一定要全部看完,是真的太全面了,各个知识点都涵盖了,几乎我面试遇到的所有问题的知识点这里面都有!希望大家不要犯和我一样的错误呀!!!一定要看完!
[外链图片转存中…(img-I9L6ktCM-1714563892699)]

[外链图片转存中…(img-3ShpuPQ6-1714563892699)]

[外链图片转存中…(img-2JFg5C54-1714563892700)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 10
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值