AndroidStudio⽬录结构APP构建流程Jenkins持续集成构建Gradle介绍。。。Android Studio⽬录结构
通常我们是将⼯程设置成project模式,这个模式下我们的⼯程有很多⽬录:
.gradle:包含⼀些Gradle编译脚本,gradle是Google推荐的编译⼯具
.idea:包含AndroidStudio开发⼯具需要的⽂件,⾥⾯有⼀些版权声明,库⽂件,配置⽂件等
.app:如果我们不修改module,那默认就算app,这是我们的项⽬⽂件,包含我们编写的代码,资源⽂件等
build:这个是我们的module编译后⽣成的⽂件
gradle:⽬录下的gradle-wrapper.jar是Gradle Wrapper的主体功能包,Gradle Wrapper是Google对gradle的⼀层封装,使得项⽬的开发⼈员不需要操⼼于 Gradle 的安装上,会⾃动为我们下载Gradle版本;还有有个gradle-wrapper.properties⽂件,描述⼯程所依赖的gradle的版本信息,distributionUrl表⽰如果我们的⼯程中没有gradle,软件会根据这个url去下载gradle
.gitignore:这个跟git⼯具的使⽤有关系,通常在这⾥配置⼀些不⽤上传的⽂件
其中的classpath地址是Android Plugin for Gradle的下载地址,也是从中央仓库扒下来的,gradle插件的版本号和gradle版本号是对应的,较新的插件版本需要要求较新版的gradle,Android Plugin for Gradle是⼀堆适合Android开发的Gradle插件的集合,主要由Google的Android团队开发,Gradle不是Android的专属构建系统,但是有了Android Plugin for Gradle的话,你会发现使⽤Gradle构建Android项⽬尤其的简单。
"jcenter()"的意思是所有通过gradle导⼊的jar包都是从bintray/bintray/jcenter这个中央仓库上扒下来的。
如果你需要的jar包在这个⽹站上没有,那就⽆法通过gradle的⽅式来导⼊哦。
gardle.properties:这个⽂件是全局的.gradle配置⽂件,从它的名字可以看出,这个⽂件中定义了⼀系列“属性”。实际上,这个⽂件中定义了⼀系列供adle使⽤的常量,⽐如keystore的存储路径,keyalias,gradle运⾏所⽤内存等等
gradlew和gradlew.bat:这两个⽂件是⽤来在命令⾏界⾯中执⾏gradle命令的,其中gradlew是在linux或者Mac系统中使⽤的shell脚本,gradlew.bat是在windows系统中使⽤的;gradlew是gradle wrapper的缩写,也就是说它对gradle的命令进⾏了包装,⽐如我们进⼊到指定Module⽬录并执⾏“gradlew.bat assemble”即可完成对当前Module的构建(Windows系统下)
local.properties:这个⽂件⽤于指定本机中的Android SDK路径,通常内容都是⾃动⽣成的,我们不需要去修改,除⾮本机的SDK路径发⽣了变化,那么就要将这个⽂件中的路径修改成新的位置路径即可
xxx.iml:iml⽂件是所有IntelliJ IDEA都会⾃动⽣成的⼀个⽂件,(Android Studio是基于IntelliJ IDEA开发的),⽤于标识是⼀个IntelliJ IDEA项⽬,我们不需要修改这个⽂件中的任何内容
module内的⽬录
中文数字编码转换build:这⾥包含⼀些我们的module编译后的⽂件
lib:存放⼀些第三⽅jar⽂件和aar包
src:包含我们编写的代码和资源⽂件
Stucture。
这⾥⾯有⼀些参数:
buildToolsVersion: android构建⼯具的版本,其中包括了打包⼯具aapt、dx等等,这个⼯具的⽬录位于…your_sdk_path/build-
tools/XX.XX.XX,通过SDK Manager 更新;在SDK Manager中安装选择版本,buildToolsVersion的版本需要
>=CompileSdkVersion; ⾼版本的build-tools 可以构建低版本编译的android程序。
minSdkVersion:指定项⽬最低兼容的版本,这⾥指定为15,表⽰最低兼容到Android 4.0系统
targetSdkVersion:指定的值表⽰在该⽬标版本上已经做过充分测试,系统会为该应⽤启动⼀些对应该⽬标系统的最新功能特
性,Android系统平台的⾏为变更,只有targetSdkVersion的属性值被设置为⼤于或等于该系统平台的API版本时,才会⽣效。例如,若指定targetSdkVersion值为22,则表⽰该程序最⾼只在Android5.1版本上做过充分测试,在Android6.0系统上(对应targetSdkVersion 为23)拥有的新特性如系统运⾏时权限等功能就不会被启⽤。
buildTypes:⼀般包含两个选项,⼀个是debug,⽤于指定⽣成测试版安装⽂件的配置,可以忽略不写;另⼀个是release,⽤于指定⽣成正式版安装⽂件的配置。其中minifyEnabled表明是否对代码进⾏混淆,true表⽰对代码进⾏混淆。proguardFiles指定混淆的规则⽂件,这⾥指定了⽂件和proguard-rules.pro⽂件两个⽂件,⽂件为默认的混淆⽂件,⾥⾯定义了⼀些通⽤的混淆规则。proguard-rules.pro⽂件位于当前项⽬的根⽬录下,可以在该⽂件中定义⼀些项⽬特有的混淆规则。
**dependencies**:该闭包定义了项⽬的依赖关系,⼀般项⽬都有三种依赖⽅式:本地依赖、库依赖和远程依赖。本地依赖可以对本地的jar包或⽬录添加依赖关系,库依赖可以对项⽬中的库模块添加依赖关系,远程依赖可以对jcener库上的开源项⽬添加依赖关系。
:这个是项⽬混淆配置⽂件
Android构建流程
当我们在Androd Studio⾥将写好的代码通过点击run app就可以在build/outputs/apk⽬录下⽣成⼀个APK⽂件,那⼀系列android代码是怎么变成这个⽂件的呢?先看⼀张官⽅提供的构建图
可以总结如下:
properties是什么文件1. 通过AAPT(Android Asset Packaging Tool)打包res资源⽂件,⽐如l、xml布局⽂件等,并将这些xml⽂件编
译为⼆进制,当然assets⽂件夹中的⽂件不会被编译,图⽚及raw⽂件夹中的资源也会保持原来的形态,需要注意的是raw⽂件夹中的资源也会⽣成资源id;AAPT编译完成之后会⽣成R.java⽂件。这⾥提到的AAPT是Android中的资源打包⼯具
2. AIDL⼯具会将所有的aidl接⼝转化为对应的Java接⼝table manners 是可数吗
3. 将所有的java代码,上述步骤产⽣的R.java⽂件和aidl⽂件通过Java编译器编译成.class⽂件
4. Dex⼯具会将上述过程产⽣的.class⽂件,第三⽅库和其它.class⽂件编译成.dex⽂件,.dex⽂件是Dalvik虚拟机可以执⾏的⽂
件,.dex⽂件最终会被打包进APK⽂件
5. 上⼀步编译⽣成的.dex⽂件、编译过的资源、⽆需编译的资源(如图⽚等)会被ApkBuilder⼯具打包成APK⽂件。
6. ⽣成APK⽂件后,需要对其签名才可安装到设备,这⾥使⽤JarSigner⼯具进⾏签名,平时测试时会使⽤debug keystore,当正式发
布应⽤时必须使⽤release版的keystore对应⽤进⾏签名。
7. 如果是对APK正式签名,还需要使⽤zipalign⼯具对APK进⾏对齐操作,这样应⽤运⾏时会减少内存的开销,最终就能⽣成⼀个正式
APK⽂件
这⾥提到了⼀个zipalign⼯具:
Zipalign是⼀个android平台上整理APK⽂件的⼯具,它⾸次被引⼊是在Android 1.6版本的SDK软件开发⼯具包中。它能够对打包的Android应⽤程序进⾏优化, 以使Android操作系统与应⽤程序之间的交互作⽤更有效率,这能够让应⽤程序和整个系统运⾏得更快。⽤Zipalign处理过的应⽤程序执⾏时间达到最低限度,当设备运⾏APK应⽤程序时占更少的RAM(Random Access Memory)随机访问内存,我们强烈推荐在新的和已经发布的程序上使⽤zipalign⼯具来得到优化后的版本。
原因
Zipalign对apk⽂件中未压缩的数据在4个字节边界上对齐,当资源⽂件通过内存映射对齐到4字节边界时,访问资源⽂件的代码才是有效率的。4字节对齐后,android系统就可以通过调⽤mmap函数读取⽂件,进程可以像读写内存⼀样对普通⽂件的操作,系统共享内存IPC,以在读取资源上获得较⾼的性能。 如果资源本⾝没有进⾏对齐处理,它就必须显式地读取它们——这个过程将会⽐较缓慢且会花费额外的内存
使⽤
1. 可以在adle⽂件中操作
release {
//对齐优化
zipAlignEnabled true
}
debug {
//对齐优化
zipAlignEnabled false
}
2. 使⽤命令⾏
zipalign⼯具⼀般在android-sdk-2.2\build-tools\其中⼀个版本⽬录下
然后在dos窗⼝中定位到当前⽬录,使⽤zipalign -v 4 优化前的名字.apk 优化后的名字.apk
其中-v 表⽰输出优化后的详细信息,4代表对齐为4个字节
3. 验证⼀个apk有没有使⽤对齐优化
使⽤如下命令:zipalign -c -v 4 source.apk ;如果最终出现了Verification succesful提⽰,就表明是优化过的apk
zipalign优化的最根本⽬的是帮助操作系统更⾼效率的根据请求索引资源,将resource-handling code统⼀将Data structure
alignment(数据结构对齐标准:DSA)限定为4-byte boundaries;如果不采取对齐的标准,处理器⽆
法准确和快速的在内存地址中定位相关资源。
Jenkins持续集成构建
平时开发中APP的打包和提交测试的⼯作基本上是由开发⼈员来完成的,随着需求越来越多,项⽬复杂度越来越⼤,迭代需求很快,这样打包时间就很长,并且从严格的研发流程来讲,开发⼈员应该只负责提交代码,这些⼯作应该由测试和运维⼈员来做,但是可能岗位有限等原因,没办法只能另外想办法了,所以如果有⼀个⾃动化构建的⼯具在后台不断的去更新代码,然后进⾏项⽬编译,APP打包,最后提交到测试平台,那这样就很完美了
没错,Jenkins就是这样⼀个持续集成⼯具,且开源;它不光可以进⾏Android平台的打包,也可以⽤来进⾏iOS打包、NodeJs打包、Jave 服务打包等
Gradle
gradle是什么:
Gradle是⼀个基于Apache Ant和Apache Maven概念的项⽬⾃动化建构⼯具。它使⽤⼀种基于Groovy的特定领域语⾔(DSL)来声明项⽬设置,抛弃了基于XML的各种繁琐配置。简单理解就是Gradle是⼀个构建⼯具,它是⽤来帮助我们构建app的,构建包括编译、打包等过程。我们可以为Gradle指定构建规
则,然后它就会根据我们的“命令”⾃动为我们构建APP,我们所使⽤的Android Studio就是使⽤Gradle来构建项⽬的
Android为什么使⽤Gradle来作为项⽬构建⼯具
数字推盘怎么操作在Gradle出现之前,有⼏个基于Java的构建⼯具:Ant、Maven,它们被应⽤于Java或者Android开发中,我们来看看它们
Ant
全称Another Neat Tool,它是由 James Duncan Davidson 开发的(Tomcat 最初的开发者),最初是⽤来构建 Tomcat。在2000年,Ant成为⼀个独⽴的项⽬并被发布出来。Ant 是由 Java 编写的构建⼯具,它的核⼼代码是由Java编写的,因此具有平台⽆关性,构建脚本是XML格式的(默认为l),如果你熟悉XML,那么Ant 就⽐较容易上⼿,它的构建脚本如下
<?xml version="1.0" encoding="UTF-8"?>
<project name="test" default="hello">
<echo message="l which is equivalent to build.gant"/>
<property file="build.properties"/>
<target name="init"  description="init target" >
<echo message="Executing init target"/>
</target>
<target name="hello" depends="init" description="say hello target">
<echo message="${echo.msg}"/>
</target>
</project>
Ant的构建脚本由三个基本元素组成:⼀个project(⼯程)、多个target(⽬标)和可⽤的task(任务)。
Ant有以下缺点:
Ant⽆法获取运⾏时的信息。
XML作为构建脚本的语⾔,如果构建逻辑复杂,那么构建脚本就会⼜长⼜难以维护。
Ant需要配合Ivy(⼀种管理项⽬依赖⼯具),否则Ant很难管理依赖。
Ant在如何组织项⽬结构⽅⾯没有给出任何指导,这导致Ant虽然灵活性⾼,但这样的灵活导致每个构建脚本都是唯⼀的⽽且很难被理解。
Maven
Maven于2004年发布,它的⽬标是改进开发⼈员在使⽤Ant时⾯临的⼀些问题。Maven最初是为了简化Jakarta Turbine项⽬的构建,它经历了Maven到Maven3的发展,Maven作为后来者, 继承了Ant的项⽬构建功能, 同样采⽤了XML作为构建脚本的格式。Maven具有依赖管理和项⽬管理的功能,提供了中央仓库,能帮助我们⾃动下载库⽂件。
Maven的构建脚本的样式如下所⽰
<project xmlns="/POM/4.0.0" xmlns:xsi="/2001/XMLSchema-instance"
xsi:schemaLocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId&pany.app</groupId>
<artifactId>my-app</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>Maven Quick Start Archetype</name>
<url></url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
Maven相⽐Ant的优点:
Ant是过程式的,开发者需要显⽰的指定每个⽬标,以及完成该⽬标锁需要执⾏的任务。每⼀个项⽬,开发着都需要重新编写这⼀过程,这样会产⽣⼤量的重复。Maven是声明式的,项⽬的构建过程和过程中的各个阶段都由插件实现,开发者只需要声明项⽬的基本元素就可以了,这很⼤程度消除了重复。
shell脚本循环读取txt文本Ant本⾝是没有依赖管理,需要配合Ivy来管理依赖,⽽Maven本⾝就提供了依赖管理。
Maven 使⽤约定⽽不是配置,它为⼯程提供了合理的默认⾏为,项⽬会知道去哪个⽬录寻源代码以
及构建运⾏时有那些任务去执⾏,如果你的项⽬遵从默认值,那么只需要写⼏⾏XML配置脚本就可以了。⽽Ant是使⽤配置且没有默认⾏为的。
Maven的缺点:
Maven的提供了默认的结构和⽣命周期,这些可能不适合你的项⽬需求。
为Maven写定制的扩展过于累赘。
Maven的中央仓库⽐较混乱,当⽆法从中央仓库中得到需要的类库时,我们可以⼿⼯下载复制到本地仓库中,也可以建⽴组织内部的仓库服务器。
国内连接Maven的中央仓库⽐较慢,需要连接国内的Maven镜像仓库。
Maven缺乏⽂档,不便于使⽤和理解。
最后看看Gradle的构建脚本
apply plugin:'java'
group='pany.app'
archivesBaseName='my-app'
version='1.0-SNAPSHOT'
repositories{
python安装jieba库mavenCentral()
}
dependencies{
testCompile 'junit:4.11'
}
Gradle优点:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。