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>