版权声明:本文为博主原创文章,未经博主允许不得转载。

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,这个先放着,以后有时间重新研究;
gradle脱离AS编译打包生成apk调研二
通过上面资料查看各个类中的代码,在JavaBasePlugin类中发现:
gradle脱离AS编译打包生成apk调研二
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
gradle脱离AS编译打包生成apk调研二

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


相关文章:

  • 2022-01-21
  • 2021-09-25
  • 2021-09-24
  • 2021-10-07
  • 2021-07-19
  • 2021-04-29
  • 2022-01-27
  • 2022-01-14
猜你喜欢
  • 2021-12-19
  • 2021-11-18
  • 2022-12-23
  • 2021-09-28
  • 2021-08-30
  • 2021-06-07
  • 2021-04-14
相关资源
相似解决方案