当前位置:首页 » 安卓系统 » gradle构建android

gradle构建android

发布时间: 2022-11-04 12:11:05

① gradle是什么呢

Gradle是一个构建工具。它是用来帮助我们构建app的,构建包括编译、打包等过程。我们可以为Gradle指定构建规则,然后它就会根据我们的命令自动为我们构建app。AndroidStudio中默认就使用Gradle来完成应用的构建。有些同学可能会有疑问:”我用AS不记得给Gradle指定过什么构建规则呀,最后不还是能搞出来个apk。

gradle构建工具多项目管理

实际使用中,往往需要管理的都不是单单一个项目,maven使用依赖,继承,组成的概念,在父模块指定自己的子模块,并且准备一些各个子模块公用的资源,配置信息等等。将打包的模块与实现具体功能的模块分开的做法来管理多个项目。Gradle在这一方面做得更加清楚。

② 如何使用Gradle构建不同版本的app

对于多种类型的apk包构建,通常有以下需求:
各版本有不同的代码、资源
上述代码中各版本有不同的依赖
各版本有不同的Manifest中元素需求
各版本有不同的proGuard
Android
Studio中使用Gradle编译多种apk包需要靠proctFlavors或者buildTypes实现,如果有两种proct
flavor和两种build
type,则他们可以生成2*2=4种不同类型的apk包。下文主要使用proctFlavors自定义apk内容,而buildTypes使用默认
配置用于处理debug版本和release版本。
以下依次来看这4点怎样实现

一、不同的代码和资源
要实现build时使用不同的代码和资源:
在build文件中定义proctFlavors
为每个Flavor创建对应的文件夹
将每个Flavor特有的文件放入文件夹
1.在build文件中定义proctFlavors...
android {
...
defaultConfig { ... }
signingConfigs { ... }
buildTypes { ... }
proctFlavors {
demo {
applicationId "com.buildsystemexample.app.demo"
versionName "1.0-demo"
}
full {
applicationId "com.buildsystemexample.app.full"
versionName "1.0-full"
}
}
}
...

其中defaultConfig{}中为默认值,proctFlavors{}会复写所有可以复写的值。

2.为每个Flavor创建对应的文件夹
在上面两个Flavor的基础上,假设你想在每个Flavor使用不同的SecondActivity文件,按照下面的步骤:
展开app目录
右击src目录,选择New>Directory
输入Flavor的名字,也就是demo,新建
在demo中创建以下文件夹 app/src/demo/java app/src/demo/res app/src/demo/res/layout app/src/demo/res/values 如下图:
PS:上述过程就是将默认的main下的目录结构复制过来,想添加其他资源也是同样的操作

3. 将每个Flavor特有的文件放入文件夹
向上一步新建的目录中,先在java目录下建立对应的package,向其中放入SecondActivity.java和其layout文件,并在res目录下添加本Flavor的AndroidManifest.xml文件。Manifest的merge规则见下文。
另外一种方法是右击app目录,选择添加Activity,在引导界面中最后一项Target Source Set选择你想添加到的Flavor,Android Studio就会自动为你生成对应的AndroidManifest,不过需要稍加修改。
在添加demo所需文件后,为了添加full所需文件和包,需要在Android Studio中将build variants切换为fullDebug,否则Android Studio不会将full下的java目录识别为源文件目录,导致不能添加package。
对于demo和full中对应的相同的文件,注意要保证包名的相同,否则main中代码对于不同部分的引用,会因为有不同包名而失败。

二、不同的依赖
在build.gradle中,使用Flavor名+Compile来规定特定Flavor所需依赖:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.2.0'
demoCompile 'com.android.support:design:22.2.0'
fullCompile 'com.jakewharton:butterknife:6.1.0'
}

三、不同的Manifest需求
Manifest可以通过Merge的方式合并多个Manifest源。通常来说,有三种类型manifest文件需要被merge到最终的结果apk,下面是按照优先权排序:
proctFlavors和buildTypes中所指定的manifest文件
应用主manifest文件
库manifest文件
简单来说,manifest的merge会将每个元素及其子元素的节点和属性进行合并。
例如:
<activity
android:name=”com.foo.bar.ActivityOne”
android:theme=”@theme1”/>


<activity
android:name=”com.foo.bar.ActivityOne”
android:screenOrientation=”landscape/>

合并会成为
<activity
android:name=”com.foo.bar.ActivityOne”
android:theme=”@theme1”
android:screenOrientation=”landscape/>

不过
<activity
android:name=”com.foo.bar.ActivityOne”
android:theme=”@theme1”/>


<activity
android:name=”com.foo.bar.ActivityOne”
android:theme=”@theme2”
android:screenOrientation=”landscape/>

合并会产生一个冲突,因为都有theme,而theme的属性不同。
要了解manifest合并的更高级应用,查看Manifest Merger

四、不同ProGuard需求android {
buildTypes {
release {
minifyEnabled true
proguardFile getDefaultProguardFile('proguard-android.txt')
}
}

proctFlavors {
flavor1 {
}
flavor2 {
proguardFile 'some-other-rules.txt'
}
}
}

Android Studio将使用所有的定义在相应buildTypes和相应proctFlavors中的规则文件。
有两个默认的规则文件:
proguard-android.txt
proguard-android-optimize.txt 存放在SDK中。可以使用getDefaultProguardFile()来获得文件的完整路径,他们除了优化的开启是否不同之外都相同。

③ 如何使用Gradle构建不同版本的app

对于多种类型的apk包构建,通常有以下需求:
各版本有不同的代码、资源
上述代码中各版本有不同的依赖
各版本有不同的Manifest中元素需求
各版本有不同的proGuard
Android
Studio中使用Gradle编译多种apk包需要靠proctFlavors或者buildTypes实现,如果有两种proct
flavor和两种build
type,则他们可以生成2*2=4种不同类型的apk包。下文主要使用proctFlavors自定义apk内容,而buildTypes使用默认
配置用于处理debug版本和release版本。
以下依次来看这4点怎样实现

一、不同的代码和资源
要实现build时使用不同的代码和资源:
在build文件中定义proctFlavors
为每个Flavor创建对应的文件夹
将每个Flavor特有的文件放入文件夹
1.在build文件中定义proctFlavors...
android {
...
defaultConfig { ... }
signingConfigs { ... }
buildTypes { ... }
proctFlavors {
demo {
applicationId "com.buildsystemexample.app.demo"
versionName "1.0-demo"
}
full {
applicationId "com.buildsystemexample.app.full"
versionName "1.0-full"
}
}
}
...

其中defaultConfig{}中为默认值,proctFlavors{}会复写所有可以复写的值。

2.为每个Flavor创建对应的文件夹
在上面两个Flavor的基础上,假设你想在每个Flavor使用不同的SecondActivity文件,按照下面的步骤:
展开app目录
右击src目录,选择New>Directory
输入Flavor的名字,也就是demo,新建
在demo中创建以下文件夹 app/src/demo/java app/src/demo/res app/src/demo/res/layout app/src/demo/res/values 如下图:
PS:上述过程就是将默认的main下的目录结构复制过来,想添加其他资源也是同样的操作

3. 将每个Flavor特有的文件放入文件夹
向上一步新建的目录中,先在java目录下建立对应的package,向其中放入SecondActivity.java和其layout文件,并在res目录下添加本Flavor的AndroidManifest.xml文件。Manifest的merge规则见下文。
另外一种方法是右击app目录,选择添加Activity,在引导界面中最后一项Target Source Set选择你想添加到的Flavor,Android Studio就会自动为你生成对应的AndroidManifest,不过需要稍加修改。
在添加demo所需文件后,为了添加full所需文件和包,需要在Android Studio中将build variants切换为fullDebug,否则Android Studio不会将full下的java目录识别为源文件目录,导致不能添加package。
对于demo和full中对应的相同的文件,注意要保证包名的相同,否则main中代码对于不同部分的引用,会因为有不同包名而失败。

二、不同的依赖
在build.gradle中,使用Flavor名+Compile来规定特定Flavor所需依赖:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.2.0'
demoCompile 'com.android.support:design:22.2.0'
fullCompile 'com.jakewharton:butterknife:6.1.0'
}

三、不同的Manifest需求
Manifest可以通过Merge的方式合并多个Manifest源。通常来说,有三种类型manifest文件需要被merge到最终的结果apk,下面是按照优先权排序:
proctFlavors和buildTypes中所指定的manifest文件
应用主manifest文件
库manifest文件
简单来说,manifest的merge会将每个元素及其子元素的节点和属性进行合并。
例如:
<activity
android:name=”com.foo.bar.ActivityOne”
android:theme=”@theme1”/>


<activity
android:name=”com.foo.bar.ActivityOne”
android:screenOrientation=”landscape/>

合并会成为
<activity
android:name=”com.foo.bar.ActivityOne”
android:theme=”@theme1”
android:screenOrientation=”landscape/>

不过
<activity
android:name=”com.foo.bar.ActivityOne”
android:theme=”@theme1”/>


<activity
android:name=”com.foo.bar.ActivityOne”
android:theme=”@theme2”
android:screenOrientation=”landscape/>

合并会产生一个冲突,因为都有theme,而theme的属性不同。
要了解manifest合并的更高级应用,查看Manifest Merger

四、不同ProGuard需求android {
buildTypes {
release {
minifyEnabled true
proguardFile getDefaultProguardFile('proguard-android.txt')
}
}

proctFlavors {
flavor1 {
}
flavor2 {
proguardFile 'some-other-rules.txt'
}
}
}

Android Studio将使用所有的定义在相应buildTypes和相应proctFlavors中的规则文件。
有两个默认的规则文件:
proguard-android.txt
proguard-android-optimize.txt 存放在SDK中。可以使用getDefaultProguardFile()来获得文件的完整路径,他们除了优化的开启是否不同之外都相同。

④ 如何为Android NDK的gradle构建文件中指定NDK

我一直在尝试过解决这个问题。但在通过编写自定义任务,使Android工作室在Eclipse中使用Application.mk和Android.mk就像结束了。
我的build.gradle看起来像这样
应用插件:'com.android.application“安卓{ buildTypes {
发布 {
runProguard假
proguardFiles getDefaultProguardFile('proguard的-android.txt'),'proguard-rules.pro“
}
} compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
} compileSdkVersion 20
buildToolsVersion“20.0.0” defaultConfig {
15的minSdkVersion
targetSdkVersion 20
版本code 1
} packagingOptions {
排除“META-INF /相关内容”
排除“META-INF / LICENSE”
排除“META-INF /注意事项”
} sourceSets.main {
jniLibs.srcDir'的src / main /库“
jni.srcDirs = [] //禁用自动NDK的构建通话
}
}任务buildNative(类型:执行){
高清ndkBuild = NULL;
高清ndkBuildingDir =新的文件(“钢骨混凝土/主/ JNI”);
高清hasNdk = FALSE;
如果(System.getenv(“NDK_BUILD_CMD”)!= NULL){
hasNdk = TRUE;
ndkBuild =新的文件(System.getenv(“NDK_BUILD_CMD”))
} 命令行ndkBuild,“--directory”,ndkBuildingDir doFirst {
如果(!hasNdk){
logger.error('##################')
logger.error(“NDK构建失败!”)
logger.error('原因:NDK_BUILD_CMD未设置。')
logger.error('##################')
}
断言hasNdk:“NDK_BUILD_CMD未设置。”
}
}
tasks.withType(JavaCompile){compileTask - &GT; compileTask.dependsOn buildNative}任务cleanNative(类型:执行){
高清ndkBuild = NULL;
高清ndkBuildingDir =新的文件(“钢骨混凝土/主/ JNI”);
高清hasNdk = FALSE; 如果(System.getenv(“NDK_BUILD_CMD”)!= NULL){
hasNdk = TRUE;
ndkBuild =新的文件(System.getenv(“NDK_BUILD_CMD”))
} 命令行ndkBuild,“--directory”,ndkBuildingDir,“干净” doFirst {
如果(!hasNdk){
logger.error('##################')
logger.error(“NDK构建失败!”)
logger.error('原因:NDK_BUILD_CMD未设置。')
logger.error('##################')
}
断言hasNdk:“NDK_BUILD_CMD未设置。”
}
}
clean.dependsOn“cleanNative”

对于这个工作,你需要设置一个环境变量NDK_BUILD_CMD要设置的确切NDK建造可执行文件。
在Windows上,你可以设置环境变量NDK_BUILD_CMD点到你的NDK-build.exe
在Mac上,你在你的.bash_profile设置路径变量不在GUI应用程序访问(因此Android的Studio将无法读取它们)。
所以,编辑你的.bash_profile是像
GRADLE_HOME = {} path_to_gradle
ANDROID_SDK_ROOT = {} path_to_sdk_dir
ANDROID_HOME = $ ANDROID_SDK_ROOT /平台的工具
ANDROID_NDK_HOME = {} path_to_ndk
NDK_BUILD_CMD = $ ANDROID_NDK_HOME / NDK的构建出口PATH=$GRADLE_HOME/bin:$ANDROID_HOME:$ANDROID_SDK_ROOT/tools:$ANDROID_NDK_HOME:/opt/local/bin:/opt/local/sbin:$PATHlaunchctl SETENV GRADLE_HOME $ GRADLE_HOME
launchctl SETENV ANDROID_HOME $ ANDROID_HOME
launchctl SETENV ANDROID_NDK_HOME $ ANDROID_NDK_HOME
launchctl SETENV NDK_BUILD_CMD $ NDK_BUILD_CMD

该launchctl线将使您的环境变量的Android Studio中可见。
PS:本.bash_profile中运行每次打开终端的时间。因此,对于这个正确与Android工作室工作,你需要启动一次终端,然后运行Android的工作室。否则,构建就会失败说NDK_BUILD_CMD未设置。我还没有发现任何方式的Mac启动时设置的值。如果有人能找到一个办法,请随时提出。

⑤ 如何为Android NDK的gradle构建文件中指定NDK

一个新的项目中就包含这些文件,build 是两个,一个项目一个是 APP Model 的。另外在 APP 中可以看见有一个 manifest 文件夹,这意味着着可以有多 AndroidManifest 文件。
另外值得一说的是 gradle.properties 文件也是含有两个,但是却是一个是全局,一个是项目的;这与上面的 Build 文件有何区别?区别在于全局文件存在于 C:Users用户名.gradle文件夹中,该文件有可能没有,需要自己创建,创建后所有项目都将具有访问权限,在该文件中一般保存的是项目的一些变量等,如果是无关紧要的变量可以保存在项目文件中,如果是用户名密码等变量则需要保存在全局文件中。

至于项目的配置文件一般是空的。
local.properties

?

1
2
3
4
5
6
7
8
9
10

## This file is automatically generated by Android Studio.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file should *NOT* be checked into Version Control Systems,
# as it contains information specific to your local configuration.
#
# Location of the SDK. This is only used by Gradle.
# For customization when using a Version Control System, please read the
# header note.
sdk.dir=D:ToolKitsAndroidsdk

其中包含了你的 sdk 配置,当然你还可以配置 ndk 路径;格式与 sdk 一样。

settings.gradle

?

1

include ':app'

该文件中就仅仅只包含了一句话,在你的项目中如果有多个 Model 存在的时候,就可以选择包含哪些进行编译。

⑥ 如何建立与 Android studio和 gradle android 库

Project Root
+-- src
| +-- main (your project)
| | +-- java (where your java code goes)
| | +-- res (where your res go)
| | +-- assets (where your assets go)
| | \-- AndroidManifest.xml
| \-- instrumentTest (test project)
| \-- java (where your java code goes)
+-- build.gradle
\-- settings.gradle
如果你仅有的一个项目,不是需要的 settings.gradle 文件。但是你想要添加更多的项目,所以需要它。
现在让看一看那个 build.gradle 文件。你会需要这个在它 (要添加的 android 工具)
build.gradle
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.3'
}
}
现在需要告诉 Gradle 一些 android 系统部件。它是相当简单的。一个基本的那个 (在大多数情况下的工作方式) 如下所示。我在此块中有一个注释,它将允许指定的版本名称和代码生成 APK 时。
build.gradle
apply plugin: "android"
android {
compileSdkVersion 17
/*
defaultConfig {
versionCode = 1
versionName = "0.0.0"
}
*/
}
东西要想要添加,然而,就没见过的 Gradle 光的人帮助他们使用该项目,而不安装它的方式。
build.gradle
task wrapper(type: org.gradle.api.tasks.wrapper.Wrapper) {
gradleVersion = '1.4'
}
所以现在有一个要生成的项目。现在要添加其他人。把它们放在一个目录中,或许称之为指标或子项目。这是无关紧要的但你需要知道你把它放哪。要告诉 Gradle 项目在哪里你都需要将它们添加到 settings.gradle。
目录结构:
Project Root
+-- src (see above)
+-- subProjects (where projects are held)
| +-- reallyCoolProject1 (your first included project)
| \-- See project structure for a normal app
| \-- reallyCoolProject2 (your second included project)
| \-- See project structure for a normal app
+-- build.gradle
\-- settings.gradle
settings.gradle:
include ':subProjects:reallyCoolProject1'
include ':subProjects:reallyCoolProject2'
您应该确保的最后一件事是subProjects/reallyCoolProject1/build.gradle apply plugin: "android-library" 而不是 apply plugin: "android" 。
像每个 Gradle 项目 (和 Maven) 现在需要告诉关于它的依赖性的根项目。这还可以包含任何你想要的正常 Java 依赖。
build.gradle
dependencies{
compile 'com.fasterxml.jackson.core:jackson-core:2.1.4'
compile 'com.fasterxml.jackson.core:jackson-databind:2.1.4'
compile project(":subProjects:reallyCoolProject1")
compile project(':subProjects:reallyCoolProject2')
}
这看起来像很多步骤,但他们是很容易的一旦你这样做一次或两次。这种方式也将允许您可以假设你有没有安装了 Android SDK 的 CI 服务器上生成。
NDK 侧注: 如果您要使用 NDK 你需要的东西喜欢下面。可以在这里找到 build.gradle 文件的示例:https://gist.github.com/khernyo/4226923
build.gradle
task NativeLibs(type: Copy) {
from fileTree(dir: 'libs', include: '**/*.so' ) into 'build/native-libs'
}
tasks.withType(Compile) { compileTask -> compileTask.dependsOn NativeLibs }
clean.dependsOn 'cleanCopyNativeLibs'
tasks.withType(com.android.build.gradle.tasks.PackageApplication) { pkgTask ->
pkgTask.jniDir new File('build/native-libs')
}

⑦ 如何为Android NDK的gradle构建文件中指定NDK

applyplugin:'com.android.model.application'model{android{compileSdkVersion=22buildToolsVersion="23.0.1"defaultConfig.with{applicationId="com.kltz88.car.jnidemo"minSdkVersion.apiLevel=14targetSdkVersion.apiLevel=22versionCode=1versionName="1.0"}tasks.withType(JavaCompile){//指定编译JDK版本sourceCompatibility=JavaVersion.VERSION_1_7targetCompatibility=JavaVersion.VERSION_1_7}}android.ndk{moleName="test"ldLibs+="log"abiFilters+="armeabi"abiFilters+="armeabi-v7a"abiFilters+="x86"}android.buildTypes{release{minifyEnabled=falseproguardFiles+=file('proguard-rules.pro')}}}dependencies{compilefileTree(dir:'libs',include:['*.jar'])compile'com.android.support:appcompat-v7:22.2.1'}

⑧ 如何配置android eclipse gradle环境

方法/步骤

1
首先当然是到官网gradle.org下载最新的gradle版本了,这里我下的是1.1版本,最新是2.0,不过没影响我们使用

2
下载完成后,放到任意的位置,我的是在D:/gradle-1.1,然后需要放到换进配置,步骤是右键“计算机”-“属性”,进入“高级配置”,选择“环境变量”,点击”新建“,配置”GRADLE_HOME“

3
继续在此处选择“path”,进行修改,加入“;%GRADLE_HOME%\bin”,注意此处没有引号,记得前面要加分号,这样就配置好gradle的环境变量了

4
在命令窗口输入”gradle -version“,进行验证,出现以下提示则表示成功

5
接下来是构建一个java项目,可以随便建一个文件夹,如:D:\javapro1,按照gradle的规约新建相应的文件目录,类似于maven的一样,如下

6
最主要的是在该目录下新建一个gradle文件,build.gradle,文件内容只要一句话即可:
apply plugin:'java'

7
在命令窗口中,进入项目对应文件夹,输入gradle build,即可完成构建,然后可以在项目文件夹中发现多了一些构建完的文件,这时就完成了一个最简单的项目构建

8
后面的一些基本命令就是clean、check、assemble等待,具体也可以直接查看官网文档
http://jingyan..com/article/9225544684a97c851648f486.html

⑨ 如何为Android NDK的gradle构建文件中指定NDK

apply plugin: 'com.android.model.application'
model{
android {
compileSdkVersion = 22
buildToolsVersion = "23.0.1"
defaultConfig.with {
applicationId = "com.kltz88.car.jnidemo"
minSdkVersion.apiLevel = 14
targetSdkVersion.apiLevel = 22
versionCode = 1
versionName = "1.0"
}
tasks.withType(JavaCompile) {
//指定编译JDK版本
sourceCompatibility = JavaVersion.VERSION_1_7
targetCompatibility = JavaVersion.VERSION_1_7
}
}
android.ndk {
moleName = "test"
ldLibs +="log"
abiFilters +="armeabi"
abiFilters +="armeabi-v7a"
abiFilters +="x86"
}
android.buildTypes {
release {
minifyEnabled = false
proguardFiles += file( 'proguard-rules.pro')
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.2.1'
}

热点内容
在配置更新的时候没电关机怎么办 发布:2024-05-18 20:36:10 浏览:927
win7访问win2000 发布:2024-05-18 20:27:41 浏览:387
青岛人社局密码多少 发布:2024-05-18 20:19:10 浏览:733
无法存储呼叫转移 发布:2024-05-18 20:18:30 浏览:126
数据库的调优 发布:2024-05-18 20:18:29 浏览:346
sqlserver注册表清理 发布:2024-05-18 20:13:14 浏览:991
linux删除连接 发布:2024-05-18 20:06:56 浏览:821
linux搭建云服务器平台 发布:2024-05-18 19:52:21 浏览:402
安卓怎么关闭美易订阅 发布:2024-05-18 19:29:16 浏览:643
苹果手机配置代理服务器怎么开 发布:2024-05-18 19:29:07 浏览:231