Android编译流程和Gradle使用

流程
关键词:编译-->DEX-->打包-->签名和对齐

Android工程的编译打包是个复杂的过程,期间既涉及到工程自身的源代码、资源文件、AIDL文件,又涉及到工程所依赖的库文件(Library, JAR, AAR)等,需要由多个工具分多个步骤完成。本文将对编译打包的流程进行描述,并对控制这个流程用到的gradle文件体系进行介绍。

打包过程

下图是谷歌官网给出的一个典型的apk构建的过程,比较概括。主要包括两个过程,首先是编译过程,编译的内容包括本工程的文件以及依赖的各种库文件,编译的输出包括dex文件和编译后的资源文件。然后是打包过程。配合Keystore对第一步的输出进行签名对齐,生成最终的apk文件。

典型的APK构建过程

下面这张图对上面的步骤以及每步用到的工具进行了细分,概括如下:

  1. Java编译器对工程本身的java代码进行编译,这些java代码有三个来源:app的源代码,由资源文件生成的R文件(aapt工具),以及有aidl文件生成的java接口文件(aidl工具)。产出为.class文件。
  2. .class文件和依赖的三方库文件通过dex工具生成Delvik虚拟机可执行的.dex文件,可能有一个或多个,包含了所有的class信息,包括项目自身的class和依赖的class。产出为.dex文件。
  3. apkbuilder工具将.dex文件和编译后的资源文件生成未经签名对齐的apk文件。这里编译后的资源文件包括两部分,一是由aapt编译产生的编译后的资源文件,二是依赖的三方库里的资源文件。产出为未经签名的.apk文件。
  4. 分别由Jarsigner和zipalign对apk文件进行签名和对齐,生成最终的apk文件。

总结为:编译-->DEX-->打包-->签名和对齐

Android Apk编译流程

Gradle文件体系

Android工程通过gradle文件管理各项配置,gradle文件利用DSL(Domain Specific Language)语言描述配置,并使用Groovy语言处理编译逻辑。一个典型的Android工程结构如下:

典型的Android Project结构

在这里gradle文件分布在几个不同的层级,Project层级以及Module层级。

  1. Project层级的settings.gradle描述的是该Project包含哪些Module
include ':presentation', ':qamodel', ':chatcommonmodule', ':qa', ':unlimit'

Project层级的build.gradle描述的是作用于所有Module的配置,包括gradle版本等。

  1. Module层级的build.gradle。每个Module下都有一个作用于该Module的build.gradle文件,描述了该Module相关的配置。这些配置主要包括:BuildTypes,ProductFlavors,Dependency,SigningSettings等。

下面将简要介绍Module层级的build.gradle配置文件。

Configure Build Types

Module层级的gradle文件,buildTypes段。Android会自动在buildTypes段创建release和debug两类配置,debug是默认存在的,并且设置了debuggable true,默认情况下不会展示出来,除非你要修改debug的配置。如下:

android {
    buildTypes {        
        release {            
            minifyEnabled false            
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'        
        }    
    }
}
Configure Product Flavors

Module层级的gradle文件,productFlavors段。productFlavors的设置会自动使用defaultConfig配置。如果设置了几个不同的productFlavors,它们会共用defaultConfig配置,以及自己各自的配置,如applicationId。注意,不同的productFlavors都是通过manifest文件里的package属性定义的名字来引用R文件,而不是使用各自的applicationId,所以applicationId其实是可以随意取名的。

android {    
    ...    
    defaultConfig {
        applicationId "com.magic.wdl.simpledaggerdemo"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }    
    buildTypes {...}    
    productFlavors {        
        demo {            
            applicationId "com.magic.wdl.simpledaggerdemo.demo"            
            versionName "1.0-demo"        
        }        

        full {            
            applicationId "com.magic.wdl.simpledaggerdemo.full"            
            versionName "1.0-full"        
        }    
    }
}

不同的build type和product Flavors可以互相组合,生成m*n种apk文件(不同的Build Variant[版本]),比如:
demoDebug
demoRelease
fullDebug
fullRelease

通过 Build > Select Build Variant可以选择要生成的apk类型。

select build variant
Configure dependency

dependencies段配置依赖的Module或是本地以及远端的binary。

dependencies {    
    // Module依赖
    compile project(":mylibrary")    
    // 远端Binary依赖    
    compile 'com.android.support:appcompat-v7:23.4.0'    
    // 本地Binary依赖,指定路径app/libs/
    compile fileTree(dir: 'libs', include: ['*.jar'])
}
Configure signing settings

signingConfigs段配置签名信息,生成签名的方法参照这里

signingConfigs {        
    release {            
        storeFile file("myreleasekey.keystore")            
        storePassword "password"            
        keyAlias "MyReleaseKey"            
        keyPassword "password"        
    }    
}    

buildTypes {        
    release {            
        ...            
        signingConfig signingConfigs.release        
    }
}

参考:
https://developer.android.com/studio/build/index.html
http://www.alittlemadness.com/2010/06/07/understanding-the-android-build-process/
//www.greatytc.com/p/02dfa291d078
http://czak.pl/2016/05/31/handbuilt-android-project.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,802评论 25 709
  • 1.介绍 如果你正在查阅build.gradle文件的所有可选项,请点击这里进行查阅:DSL参考 1.1新构建系统...
    Chuckiefan阅读 12,196评论 8 72
  • 这一章主要针对项目中可以用到的一些实用功能来介绍Android Gradle,比如如何隐藏我们的证书文件,降低风险...
    acc8226阅读 7,724评论 3 25
  • 你知道吗 今年的四月 三十天里有十一天的假期 今天是愚人节 不逗你玩~~~~ 【 来看看日历吧】 如图 咱们的四月...
    游大大旅游阅读 238评论 0 0
  • 欢迎使用 Cmd Markdown 编辑阅读器 我们理解您需要更便捷更高效的工具记录思想,整理笔记、知识,并将其中...
    GS的BLOG阅读 3,925评论 0 2