Android应用配置构建详解

raul892 8年前
   <h2><strong>Android应用配置构建详解</strong></h2>    <h2><strong>构建过程</strong></h2>    <p><img src="https://simg.open-open.com/show/883c90d8079a625ea238eeb567fa5346.png"></p>    <p>Paste_Image.png</p>    <p><img src="https://simg.open-open.com/show/2f3bc49f6273b7653f198d2033d83bd4.png"></p>    <p>Paste_Image.png</p>    <ul>     <li> <p>1.编译器将源码编译为DEX文件(Dalvik虚拟机可执行文件)</p> </li>     <li> <p>2.APK打包工具将DEX文件和编译过的资源文件打包到一个APK文件中</p> </li>     <li> <p>3.APK打包工具使用debug或release密钥给APK文件签名(AS默认使用debug密钥配置新项目)</p> </li>     <li> <p>打包工具在生成最终的APK文件之前,使用 zipalign 工具优化应用文件占用的内存</p> </li>    </ul>    <h2><strong>自定义构建配置</strong></h2>    <h3><strong>Build Types</strong></h3>    <p>Build types define certain properties that Gradle uses when building and packaging your app, and are typically configured for different stages of your development lifecycle.</p>    <p>构建类型(Build Types)定义了Gradle在构建和打包app时使用的确切属性。AS默认设置了debug和release两种build type。</p>    <table>     <thead>      <tr>       <th>build type</th>       <th>特点</th>      </tr>     </thead>     <tbody>      <tr>       <td>debug</td>       <td>开启debug选项,使用debug keystore签名</td>      </tr>      <tr>       <td>release</td>       <td>压缩,混淆,使用release keystore签名</td>      </tr>     </tbody>    </table>    <p>Q:如何添加自定义类型的构建类型?</p>    <p>A:在模块级别的 build.gradle 文件, android 代码块中有一个 buildTypes 代码块。在其中添加自定义类型的即可。具体属性设置可参考 <a href="/misc/goto?guid=4959650644723764814" rel="nofollow,noindex">BuildType文档</a></p>    <pre>  <code class="language-groovy">//模块级别的build.gradle文件  android {      ...      defaultConfig {...}      buildTypes {          release {              minifyEnabled true              proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'          }            debug {              applicationIdSuffix ".debug"          }          //自定义的构建类型:jnidebug          jnidebug {              initWith debug              applicationIdSuffix ".jnidebug"              jniDebuggable true          }      }  }</code></pre>    <h3><strong>Product Flavors</strong></h3>    <pre>  <code class="language-groovy">Product flavors represent different versions of your app that you may release to users</code></pre>    <p>Product flavors表示发布给用户的不同版本的app。例如免费版和收费版。Product flavors是可选项,必须我们手动去创建。</p>    <pre>  <code class="language-groovy">Q:如何添加Product Flavors?    A:和添加build types类似,在 productFlavors 代码块中添加即可。</code></pre>    <p><a href="/misc/goto?guid=4959714747376063975" rel="nofollow,noindex">defaultConfig</a> 实际上属于 ProductFlavor 类,因此可在 defaultConfig 代码块中配置所有flavor共同的属性。每个flavor都能覆盖之前的默认值。如 applicationId 。</p>    <pre>  <code class="language-groovy">android {      ...      defaultConfig {...}      buildTypes {...}      productFlavors {          demo {              applicationId "com.example.myapp.demo"              versionName "1.0-demo"          }          full {              applicationId "com.example.myapp.full"              versionName "1.0-full"          }      }  }</code></pre>    <h3><strong>Build Variants</strong></h3>    <pre>  <code class="language-groovy">A build variant is a cross product of a build type and product flavor, and is the configuration Gradle uses to build your app.</code></pre>    <p>build variant是build type和product flavor共同作用的产物,是Gradle构建app的配置。</p>    <pre>  <code class="language-groovy">//模块级别的build.gradle    android{  ...  buildTypes{    //默认有debug和release两种build types    ...  }  productFlavors{     //不同开发环境设置不同的productFlavor     //开发     dev{       ...     }     //生产     prd{       ...     }     //测试     tst{       ...     }     //定制     cus{       ...     }  }  }</code></pre>    <p>如上所示,我们配置了四种不同的product flavors和两种build types,在Android Studio中能看到如下所示的选择界面。供我们切换不同的Build Variants。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/f6e5e9272b29131e41d1de3fac7a64e5.png"></p>    <p style="text-align:center">Paste_Image.png</p>    <h3><strong>Manifest Entries</strong></h3>    <p>我们可在build variant的配置中指定Manifest文件属性的值(将覆盖Manifest文件已存在的值)。这有助于我们的项目生成多个APK文件,且每个APK文件有不同的应用名,最小SDK版本,编译SDK版本。</p>    <p>合并多个Manifest文件,可能会有冲突。如何解决冲突请参考 <a href="/misc/goto?guid=4959714747479570594" rel="nofollow,noindex">Merge Multiple Manifest Files</a> 。</p>    <h3><strong>Dependencies</strong></h3>    <p>构建系统管理项目依赖,包括来自本地文件系统的和来自远端仓库的依赖。</p>    <pre>  <code class="language-groovy">android {...}  ...  dependencies {      //依赖本项目的"mylibrary"模块       compile project(":mylibrary")        //依赖远端库文件      compile 'com.android.support:appcompat-v7:23.4.0'        //依赖本地库文件      compile fileTree(dir: 'libs', include: ['*.jar'])  }</code></pre>    <p>声明几种依赖的方式:</p>    <ul>     <li> <p>依赖本项目的某模块</p> </li>    </ul>    <pre>  <code class="language-groovy">compile project(":模块名")</code></pre>    <ul>     <li> <p>依赖远端库文件</p> </li>    </ul>    <pre>  <code class="language-groovy">compile '库名:版本'</code></pre>    <ul>     <li> <p>依赖本地库文件</p> </li>    </ul>    <pre>  <code class="language-groovy">compile fileTree(dir: 'libs', include: ['*.jar'])</code></pre>    <h3><strong>Signing</strong></h3>    <p>我们能在构建配置中设置签名的属性值,构建系统会在构建的过程中自动给我们的应用签名。具体细节请参考 <a href="/misc/goto?guid=4959676349873937538" rel="nofollow,noindex">Sign Your App</a></p>    <p>生成jks密钥文件:</p>    <pre>  <code class="language-groovy">在Android Studio中依次打开     Build->Generate Signed APK->Next     ->Create new->New Key Store(分别填写每一项,如下图所示)</code></pre>    <p><img src="https://simg.open-open.com/show/c5099cc99d2924ddceb7c2b8701d1240.png"></p>    <p style="text-align:center">Paste_Image.png</p>    <pre>  <code class="language-groovy">Q:为什么我之前看到的是.keystore文件,而现在却是.jks文件?    A:Eclipse用到的签名文件是以.keystore结尾,而Android Studio中则是.jks文件。</code></pre>    <p>维护密钥的安全性:</p>    <ul>     <li> <p>1.如果我们直接在build.gradle文件中设置签名相关的配置,容易导致密钥的密码等信息通过版本控制工具(如SVN,Git等)被泄漏。</p> </li>    </ul>    <pre>  <code class="language-groovy">//模块级别的build.gradle   android {      signingConfigs {          config {              keyAlias 'YourKeyAlias'              keyPassword 'YourKeyPassword'              storeFile file('Your StoreFile location')              storePassword 'Your store Password'          }      }      ...     }</code></pre>    <ul>     <li> <p>2.我们可以将签名相关的配置的值写在gradle.properties属性文件中。如下所示,能有效避免将签名相关信息提交到版本控制工具中。</p> </li>    </ul>    <pre>  <code class="language-groovy">//gradle.properties属性文件  RELEASE_KEY_ALIAS=test  RELEASE_KEY_PASSWORD=123456  RELEASE_STORE_PASSWORD=123456  RELEASE_STORE_FILE=../XX.jks    //模块级别的build.gradle   android {      signingConfigs {          config {              keyAlias RELEASE_KEY_ALIAS              keyPassword RELEASE_KEY_PASSWORD              storeFile file(RELEASE_STORE_FILE)              storePassword RELEASE_STORE_PASSWORD          }      }      ...     }</code></pre>    <p> </p>    <p> </p>    <p>来自:http://www.jianshu.com/p/b0b9a3383afa</p>    <p> </p>