Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
门心叼龙
VirtualAPK
提交
4249ed4e
V
VirtualAPK
项目概览
门心叼龙
/
VirtualAPK
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
V
VirtualAPK
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
4249ed4e
编写于
3月 01, 2018
作者:
S
superq_sky
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Supported calling task by variant name.
上级
4065898f
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
102 addition
and
21 deletion
+102
-21
virtualapk-gradle-plugin/src/main/groovy/com.didi.virtualapk/BasePlugin.groovy
...gin/src/main/groovy/com.didi.virtualapk/BasePlugin.groovy
+87
-15
virtualapk-gradle-plugin/src/main/groovy/com.didi.virtualapk/VAPlugin.groovy
...lugin/src/main/groovy/com.didi.virtualapk/VAPlugin.groovy
+15
-6
未找到文件。
virtualapk-gradle-plugin/src/main/groovy/com.didi.virtualapk/BasePlugin.groovy
浏览文件 @
4249ed4e
package
com.didi.virtualapk
import
com.android.build.gradle.
api.ApkVariant
import
com.android.build.gradle.
AppPlugin
import
com.android.build.gradle.internal.TaskContainerAdaptor
import
com.android.build.gradle.internal.TaskFactory
import
com.android.build.gradle.internal.api.ApplicationVariantImpl
import
com.android.build.gradle.internal.variant.VariantFactory
import
com.android.builder.core.VariantConfiguration
import
com.android.builder.core.VariantType
import
com.didi.virtualapk.tasks.AssemblePlugin
import
org.gradle.api.Action
;
import
org.gradle.api.Plugin
;
import
com.didi.virtualapk.utils.Reflect
import
org.gradle.api.Action
import
org.gradle.api.Plugin
import
org.gradle.api.Project
import
org.gradle.api.Task
import
org.gradle.internal.reflect.Instantiator
import
org.gradle.tooling.provider.model.ToolingModelBuilderRegistry
import
org.gradle.util.NameMatcher
import
javax.inject.Inject
;
import
javax.inject.Inject
import
java.lang.reflect.InvocationHandler
import
java.lang.reflect.Method
import
java.lang.reflect.Proxy
/**
* Base class of VirtualApk plugin, we create assemblePlugin task here
* @author zhengtao
*/
public
class
BasePlugin
implements
Plugin
<
Project
>
{
public
abstract
class
BasePlugin
implements
Plugin
<
Project
>
{
protected
Project
project
protected
Instantiator
instantiator
protected
TaskFactory
taskFactory
protected
boolean
isBuildingPlugin
=
false
boolean
checkVariantFactoryInvoked
@Inject
public
BasePlugin
(
Instantiator
instantiator
,
ToolingModelBuilderRegistry
registry
)
{
...
...
@@ -35,23 +43,41 @@ public class BasePlugin implements Plugin<Project> {
public
void
apply
(
Project
project
)
{
this
.
project
=
project
def
startParameter
=
project
.
gradle
.
startParameter
def
targetTasks
=
startParameter
.
taskNames
AppPlugin
appPlugin
=
project
.
plugins
.
findPlugin
(
AppPlugin
)
targetTasks
.
each
{
if
(
it
.
contains
(
"assemblePlugin"
)
||
it
.
contains
(
"aP"
))
{
isBuildingPlugin
=
true
}
}
Reflect
reflect
=
Reflect
.
on
(
appPlugin
.
variantManager
)
VariantFactory
variantFactory
=
Proxy
.
newProxyInstance
(
this
.
class
.
classLoader
,
[
VariantFactory
.
class
]
as
Class
[],
new
InvocationHandler
()
{
Object
delegate
=
reflect
.
get
(
'variantFactory'
)
@Override
Object
invoke
(
Object
proxy
,
Method
method
,
Object
[]
args
)
throws
Throwable
{
if
(
'preVariantWork'
==
method
.
name
)
{
checkVariantFactoryInvoked
=
true
println
"Evaluating VirtualApk's configurations..."
boolean
isBuildingPlugin
=
evaluateBuildingPlugin
(
appPlugin
,
project
)
beforeCreateAndroidTasks
(
isBuildingPlugin
)
}
return
method
.
invoke
(
delegate
,
args
)
}
})
reflect
.
set
(
'variantFactory'
,
variantFactory
)
project
.
extensions
.
create
(
'virtualApk'
,
VAExtention
)
taskFactory
=
new
TaskContainerAdaptor
(
project
.
tasks
)
project
.
afterEvaluate
{
if
(!
checkVariantFactoryInvoked
)
{
throw
new
RuntimeException
(
'Evaluating VirtualApk\'s configurations has failed!'
)
}
project
.
android
.
applicationVariants
.
each
{
ApplicationVariantImpl
variant
->
if
(
variant
.
buildType
.
name
.
equalsIgnoreCase
(
"release"
))
{
final
def
variantPluginTaskName
=
variant
.
variantData
.
scope
.
getTaskName
(
'assemble'
,
'Plugin'
)
if
(
'release'
==
variant
.
buildType
.
name
)
{
String
variantAssembleTaskName
=
variant
.
variantData
.
scope
.
getTaskName
(
'assemble'
,
'Plugin'
)
def
final
variantPluginTaskName
=
createPluginTaskName
(
variantAssembleTaskName
)
final
def
configAction
=
new
AssemblePlugin
.
ConfigAction
(
project
,
variant
)
taskFactory
.
create
(
variantPluginTaskName
,
AssemblePlugin
,
configAction
)
...
...
@@ -69,6 +95,52 @@ public class BasePlugin implements Plugin<Project> {
project
.
task
(
'assemblePlugin'
,
dependsOn:
"assembleRelease"
,
group:
'build'
,
description:
'Build plugin apk'
)
}
String
createPluginTaskName
(
String
name
)
{
return
name
.
replace
(
'Release'
,
''
)
}
private
boolean
evaluateBuildingPlugin
(
AppPlugin
appPlugin
,
Project
project
)
{
def
startParameter
=
project
.
gradle
.
startParameter
def
targetTasks
=
startParameter
.
taskNames
def
pluginTasks
=
[
'assemblePlugin'
]
as
List
<
String
>
appPlugin
.
variantManager
.
buildTypes
.
each
{
def
buildType
=
it
.
value
.
buildType
if
(
'release'
!=
buildType
.
name
)
{
return
}
if
(
appPlugin
.
variantManager
.
productFlavors
.
isEmpty
())
{
return
}
appPlugin
.
variantManager
.
productFlavors
.
each
{
String
variantName
=
VariantConfiguration
.
computeFullName
(
it
.
key
,
buildType
,
VariantType
.
DEFAULT
,
null
)
def
variantPluginTaskName
=
createPluginTaskName
(
"assemble${variantName.capitalize()}Plugin"
.
toString
())
pluginTasks
.
add
(
variantPluginTaskName
)
}
}
// pluginTasks.each {
// println "pluginTask: ${it}"
// }
boolean
isBuildingPlugin
=
false
NameMatcher
nameMatcher
=
new
NameMatcher
()
targetTasks
.
every
{
String
taskName
=
nameMatcher
.
find
(
it
,
pluginTasks
)
if
(
taskName
!=
null
)
{
// println "Found task name '${taskName}' by given name '${it}'"
isBuildingPlugin
=
true
return
false
}
return
true
}
return
isBuildingPlugin
}
protected
abstract
void
beforeCreateAndroidTasks
(
boolean
isBuildingPlugin
)
protected
final
VAExtention
getVirtualApk
()
{
return
this
.
project
.
virtualApk
...
...
virtualapk-gradle-plugin/src/main/groovy/com.didi.virtualapk/VAPlugin.groovy
浏览文件 @
4249ed4e
...
...
@@ -27,6 +27,8 @@ class VAPlugin extends BasePlugin {
*/
private
def
hostDir
protected
boolean
isBuildingPlugin
=
false
/**
* TaskHooker manager, registers hookers when apply invoked
*/
...
...
@@ -38,22 +40,29 @@ class VAPlugin extends BasePlugin {
}
@Override
void
apply
(
final
Project
project
)
{
super
.
apply
(
project
)
protected
void
beforeCreateAndroidTasks
(
boolean
isBuildingPlugin
)
{
this
.
isBuildingPlugin
=
isBuildingPlugin
if
(!
isBuildingPlugin
)
{
println
"Skipped all
virtuala
pk's configurations!"
println
"Skipped all
VirtualA
pk's configurations!"
return
}
project
.
android
.
registerTransform
(
new
StripClassAndResTransform
(
project
))
}
@Override
void
apply
(
final
Project
project
)
{
super
.
apply
(
project
)
hostDir
=
new
File
(
project
.
rootDir
,
"host"
)
if
(!
hostDir
.
exists
())
{
hostDir
.
mkdirs
()
}
project
.
android
.
registerTransform
(
new
StripClassAndResTransform
(
project
))
project
.
afterEvaluate
{
if
(!
isBuildingPlugin
)
{
return
}
taskHookerManager
=
new
TaskHookerManager
(
project
,
instantiator
)
taskHookerManager
.
registerTaskHookers
()
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录