https://blog.csdn.net/ZhangQiang_0/article/details/79786874
继上周五研究学习gradle脱离Android Studio命令行打包成apk的问题:
"然后在SRC文件夹下创建main main\java文件夹,把res资源文件和Androidmanifest.xml文件放置main文件夹下,把src路径下的com整个文件夹放置在main\java路径下:
(经测试发现,只有这样按照AS创建出来的android项目结构放置,才能正常打包,不然在执行gradle任务时,会报错,应该是生成task时,gradle配置好了读取固定格式的路径)"
继续调研发现:
AS编译打包生成apk的过程,其实就是调用gradle中的application插件中的代码,然后按照代码逻辑执行下去。
网上查找资料发现:
“
Gradle插件和Androd插件
在提供了基本的流程控制之后,接下来是具体的要做什么,构建什么。Gradle提供了针对语言的插件如java,groovy等负责编译,集成插件如application,war等生成java可执行程序,web程序的WAR文件。Android根据APK生成的过程,编写了自己的插件,其中也使用了java插件。
(1)自定义插件的插件名称在resources/META-INF/gradle-plugins
在resources/META-INF/gradle-plugins目录下有后缀为properties文件,该文件的命名就是你在build.gradle中使用插件的名字,里面声明了该插件的实现类。在Android插件的源码中可以看到android.properties和com.android.application.properties中两个插件名称,因此在build.gradle中,应用工程使用Android插件需要apply plugin: 'android'(已是deprecated)或者apply plugin: 'com.android.application'
(2)Android插件中application的实现类是AppPlugin,继承自com.android.build.gradle.BasePlugin ,调用apply方法,相应的configureProject(),解析local.properties,获得sdk位置,创建AndroidBuilder,应用JavaBasePlugin,而后createExtension() 关联BuildType,ProductFlavor,SigningConfig,最后createTasks(),完成各个Task的创建
”
在gradle的android插件中,application的实现类是AppPlugin,继承自com.android.build.gradlePlugin,调用apply方法,相应的configureProject(),解析local.properties,获得SDK位置,创建AndroidBuilder,应用JavaBasePlugin,而后createExtension(),关联BuildType,ProductFlavor,SigningConfig,最后createTasks(),完成各个Task的创建。
下面是我在gradle-2.14.1中查找的,有可能会有问题,但是起码能解决上周的问题:
通过查找资料:
编写自定义的gradle插件
“
在目录plugin/src/main/groovy/com/micky/gradle/下新建插件类MyCustomPlugin.groovy
|
1
2
3
4
5
6
7
8
9
10
11
|
package com.micky.gradle;
import org.gradle.api.*;
class MyCustomPlugin implements Plugin<Project> {
void apply(Project project) {
project.task('myTask') << {
println "Hi this is micky's plugin"
}
}
}
|
看看Plugin的源码,其实就是一接口
|
1
2
3
4
5
6
7
8
|
public interface Plugin<T> {
/**
* Apply this plugin to the given target object.
*
* @param target The target object
*/
void apply(T target);
}
|
2、在目录plugin/src/main/resources/META-INF/gradle-plugins/下创建文件com.micky.mycustom.properties用来指定插件实现类
1 |
implementation-class=com.micky.gradle.MyCustomPlugin |
”
插件中application的实现类有可能是ApplicationPlugin,这个先放着,以后有时间重新研究;
通过上面资料查看各个类中的代码,在JavaBasePlugin类中发现:
android插件中,编译apk的过程中,默认配置的java代码路径和资源文件res路径,都在src根目录下面,如果sourceSet.getName()为main,那么编译apk的过程中,为什么要把java代码和资源文件,以及清单文件放入main路径下面就解释的通了。然后通过build.gradle中配置
就可以解决上述问题,经测试发现确实如此。这样就可以更方便的脱离AS进行编写命令行打包脚本了。因为不需要安装上次的调研,先要移动java代码和res文件夹还有清单文件的位置,然后再执行gradle build命令。
总结:
目的是为了学习脱离AS进行编译打包apk,然后发现主要是通过gradle中的android插件和build.gradle中的个人配置,来创建并执行各个task实现的。
后期需要好好学习下gradle脚本以及编译android项目中的各个配置,现在只是知道了怎么样解决原来的问题,并且简单实现了脱离AS,通过Gradle进行命令行打包的过程。如下:
首先:准备工具需要gradle、jdk、android sdk.
1 命令行创建创建android项目
android create project -n Demo -t android-23 -p F:\gradlewTest\NewTest -k com.zq.demo -a Demo
2 进行初始化,命令行执行gradle init
3 找个现成项目中的build.gradle文件替换build.gradle文件(当然也可以根据格式手动编写build.gradle),然后修改applicationId为当前包名。
这里测试项目中只有一个Moudle,因此build.gradle文件可以写成如下形式:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.14.+'
//classpath 'com.android.tools.build:gradle:2.1.3'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.1"
lintOptions {
checkReleaseBuilds false
// Or, if you prefer, you can continue to check for errors in release builds,
// but continue the build even when errors are found:
abortOnError false
}
defaultConfig {
applicationId "com.zq.demo"
minSdkVersion 17
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
//testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.0.1'
}
4 然后命令行执行gradle build,按住outputs下的apk,发现运行正常。
调研到此结束,当前也可以写成shell脚本,感觉没啥意思,主要是学习下原理,加深理解。
参考:Gradle编译打包apk详细介绍 http://www.jb51.net/article/99623.htm
为AS编写自定义Gradle教程 http://www.jb51.net/article/79966.htm
为AS编写自定义Gradle教程 http://www.jb51.net/article/79966.htm