Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
DiDi
virtualapk
提交
dca835f0
V
virtualapk
项目概览
DiDi
/
virtualapk
9 个月 前同步成功
通知
63
Star
8886
Fork
1530
代码
文件
提交
分支
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 搜索 >>
提交
dca835f0
编写于
7月 10, 2018
作者:
S
superq_sky
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Supported com.android.tools.build:gradle:3.1.0.
上级
93d286eb
变更
14
隐藏空白更改
内联
并排
Showing
14 changed file
with
126 addition
and
32 deletion
+126
-32
AndroidStub/build.gradle
AndroidStub/build.gradle
+3
-3
PluginDemo/app/build.gradle
PluginDemo/app/build.gradle
+9
-6
PluginDemo/build.gradle
PluginDemo/build.gradle
+10
-0
PluginDemo/gradle/wrapper/gradle-wrapper.properties
PluginDemo/gradle/wrapper/gradle-wrapper.properties
+1
-1
app/build.gradle
app/build.gradle
+5
-5
build.gradle
build.gradle
+1
-1
gradle/wrapper/gradle-wrapper.properties
gradle/wrapper/gradle-wrapper.properties
+1
-1
virtualapk-gradle-plugin/src/main/groovy/com.didi.virtualapk/BasePlugin.groovy
...gin/src/main/groovy/com.didi.virtualapk/BasePlugin.groovy
+29
-6
virtualapk-gradle-plugin/src/main/groovy/com.didi.virtualapk/Constants.groovy
...ugin/src/main/groovy/com.didi.virtualapk/Constants.groovy
+5
-0
virtualapk-gradle-plugin/src/main/groovy/com.didi.virtualapk/VAHostPlugin.groovy
...n/src/main/groovy/com.didi.virtualapk/VAHostPlugin.groovy
+18
-2
virtualapk-gradle-plugin/src/main/groovy/com.didi.virtualapk/VAPlugin.groovy
...lugin/src/main/groovy/com.didi.virtualapk/VAPlugin.groovy
+12
-0
virtualapk-gradle-plugin/src/main/groovy/com.didi.virtualapk/hooker/MergeManifestsHooker.groovy
...vy/com.didi.virtualapk/hooker/MergeManifestsHooker.groovy
+10
-2
virtualapk-gradle-plugin/src/main/groovy/com.didi.virtualapk/hooker/PrepareDependenciesHooker.groovy
...m.didi.virtualapk/hooker/PrepareDependenciesHooker.groovy
+11
-2
virtualapk-gradle-plugin/src/main/groovy/com.didi.virtualapk/hooker/ProcessResourcesHooker.groovy
.../com.didi.virtualapk/hooker/ProcessResourcesHooker.groovy
+11
-3
未找到文件。
AndroidStub/build.gradle
浏览文件 @
dca835f0
...
...
@@ -62,7 +62,7 @@ uploadArchives {
}
dependencies
{
compile
'com.android.support:support-annotations:22.2.0'
compile
'com.android.databinding:library:1.3.1'
compile
'com.android.databinding:baseLibrary:3.0.0'
api
'com.android.support:support-annotations:22.2.0'
api
'com.android.databinding:library:1.3.1'
api
'com.android.databinding:baseLibrary:3.0.0'
}
\ No newline at end of file
PluginDemo/app/build.gradle
浏览文件 @
dca835f0
apply
plugin:
'com.android.application'
android
{
compileSdkVersion
23
buildToolsVersion
"25.0.2"
compileSdkVersion
VERSION_COMPILE_SDK
buildToolsVersion
VERSION_BUILD_TOOLS
defaultConfig
{
applicationId
"com.didi.virtualapk.demo"
minSdkVersion
15
targetSdkVersion
15
minSdkVersion
VERSION_MIN_SDK
targetSdkVersion
VERSION_TARGET_SDK
versionName
"1.0.0"
versionCode
1
}
compileOptions
{
sourceCompatibility
SOURCE_COMPATIBILITY
}
flavorDimensions
"demo"
productFlavors
{
...
...
@@ -50,8 +53,8 @@ android {
dependencies
{
// the following aars are also compiled in host project, so they will be filterd when build plugin apk.
// but, wo can still visit their Class and Resources.
compile
'com.android.support:appcompat-v7:23.4.0'
compile
'com.didi.virtualapk:core:0.9.6-dev
'
implementation
'com.android.support:appcompat-v7:23.4.0'
implementation
'com.didi.virtualapk:core:0.9.6
'
}
apply
plugin:
'com.didi.virtualapk.plugin'
...
...
PluginDemo/build.gradle
浏览文件 @
dca835f0
...
...
@@ -10,6 +10,16 @@ buildscript {
}
}
ext
{
VERSION_COMPILE_SDK
=
27
VERSION_BUILD_TOOLS
=
'26.0.2'
VERSION_MIN_SDK
=
15
VERSION_TARGET_SDK
=
25
SOURCE_COMPATIBILITY
=
JavaVersion
.
VERSION_1_7
}
allprojects
{
repositories
{
google
()
...
...
PluginDemo/gradle/wrapper/gradle-wrapper.properties
浏览文件 @
dca835f0
...
...
@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath
=
wrapper/dists
zipStoreBase
=
GRADLE_USER_HOME
zipStorePath
=
wrapper/dists
distributionUrl
=
https
\:
//services.gradle.org/distributions/gradle-4.
1
-all.zip
distributionUrl
=
https
\:
//services.gradle.org/distributions/gradle-4.
6
-all.zip
app/build.gradle
浏览文件 @
dca835f0
...
...
@@ -45,11 +45,11 @@ android {
}
dependencies
{
compile
fileTree
(
dir:
'libs'
,
include:
[
'*.jar'
])
test
Compile
'junit:junit:4.12'
implementation
fileTree
(
dir:
'libs'
,
include:
[
'*.jar'
])
test
Implementation
'junit:junit:4.12'
compile
'com.android.support:appcompat-v7:23.4.0'
compile
'com.didi.virtualapk:core:0.9.6-dev
'
//
compile
project (':CoreLibrary')
implementation
'com.android.support:appcompat-v7:23.4.0'
implementation
'com.didi.virtualapk:core:0.9.6
'
//
implementation
project (':CoreLibrary')
}
\ No newline at end of file
build.gradle
浏览文件 @
dca835f0
...
...
@@ -16,7 +16,7 @@ buildscript {
ext
{
VERSION_COMPILE_SDK
=
27
VERSION_BUILD_TOOLS
=
'2
5
.0.2'
VERSION_BUILD_TOOLS
=
'2
6
.0.2'
VERSION_MIN_SDK
=
15
VERSION_TARGET_SDK
=
25
...
...
gradle/wrapper/gradle-wrapper.properties
浏览文件 @
dca835f0
...
...
@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath
=
wrapper/dists
zipStoreBase
=
GRADLE_USER_HOME
zipStorePath
=
wrapper/dists
distributionUrl
=
https
\:
//services.gradle.org/distributions/gradle-4.
1
-all.zip
distributionUrl
=
https
\:
//services.gradle.org/distributions/gradle-4.
6
-all.zip
virtualapk-gradle-plugin/src/main/groovy/com.didi.virtualapk/BasePlugin.groovy
浏览文件 @
dca835f0
...
...
@@ -2,11 +2,10 @@ package com.didi.virtualapk
import
com.android.build.gradle.AppExtension
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.TaskManager
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
com.didi.virtualapk.utils.Log
...
...
@@ -44,6 +43,14 @@ public abstract class BasePlugin implements Plugin<Project> {
@Override
public
void
apply
(
Project
project
)
{
this
.
project
=
project
project
.
ext
.
set
(
Constants
.
GRADLE_3_1_0
,
false
)
try
{
Class
.
forName
(
'com.android.builder.core.VariantConfiguration'
)
}
catch
(
Throwable
e
)
{
// com.android.tools.build:gradle:3.1.0
project
.
ext
.
set
(
Constants
.
GRADLE_3_1_0
,
true
)
}
AppPlugin
appPlugin
=
project
.
plugins
.
findPlugin
(
AppPlugin
)
...
...
@@ -69,7 +76,12 @@ public abstract class BasePlugin implements Plugin<Project> {
project
.
extensions
.
create
(
'virtualApk'
,
VAExtention
)
taskFactory
=
new
TaskContainerAdaptor
(
project
.
tasks
)
if
(
project
.
extensions
.
extraProperties
.
get
(
Constants
.
GRADLE_3_1_0
))
{
TaskManager
taskManager
=
Reflect
.
on
(
appPlugin
).
field
(
'taskManager'
).
get
()
taskFactory
=
taskManager
.
getTaskFactory
()
}
else
{
taskFactory
=
Reflect
.
on
(
'com.android.build.gradle.internal.TaskContainerAdaptor'
).
create
(
project
.
tasks
).
get
()
}
project
.
afterEvaluate
{
if
(!
checkVariantFactoryInvoked
)
{
...
...
@@ -84,12 +96,18 @@ public abstract class BasePlugin implements Plugin<Project> {
taskFactory
.
create
(
variantPluginTaskName
,
AssemblePlugin
,
configAction
)
taskFactory
.
named
(
"assemblePlugin"
,
new
Action
<
Task
>()
{
Action
action
=
new
Action
<
Task
>()
{
@Override
void
execute
(
Task
task
)
{
task
.
dependsOn
(
variantPluginTaskName
)
}
})
}
if
(
project
.
extensions
.
extraProperties
.
get
(
Constants
.
GRADLE_3_1_0
))
{
taskFactory
.
configure
(
"assemblePlugin"
,
action
)
}
else
{
taskFactory
.
named
(
"assemblePlugin"
,
action
)
}
}
}
}
...
...
@@ -120,7 +138,12 @@ public abstract class BasePlugin implements Plugin<Project> {
}
appPlugin
.
variantManager
.
productFlavors
.
each
{
String
variantName
=
VariantConfiguration
.
computeFullName
(
it
.
key
,
buildType
,
VariantType
.
DEFAULT
,
null
)
String
variantName
if
(
project
.
extensions
.
extraProperties
.
get
(
Constants
.
GRADLE_3_1_0
))
{
variantName
=
com
.
android
.
build
.
gradle
.
internal
.
core
.
VariantConfiguration
.
computeFullName
(
it
.
key
,
buildType
,
VariantType
.
DEFAULT
,
null
)
}
else
{
variantName
=
com
.
android
.
builder
.
core
.
VariantConfiguration
.
computeFullName
(
it
.
key
,
buildType
,
VariantType
.
DEFAULT
,
null
)
}
def
variantPluginTaskName
=
createPluginTaskName
(
"assemble${variantName.capitalize()}Plugin"
.
toString
())
pluginTasks
.
add
(
variantPluginTaskName
)
}
...
...
virtualapk-gradle-plugin/src/main/groovy/com.didi.virtualapk/Constants.groovy
0 → 100644
浏览文件 @
dca835f0
package
com.didi.virtualapk
public
final
class
Constants
{
public
static
final
String
GRADLE_3_1_0
=
'va.gradle.3.1.0'
}
\ No newline at end of file
virtualapk-gradle-plugin/src/main/groovy/com.didi.virtualapk/VAHostPlugin.groovy
浏览文件 @
dca835f0
...
...
@@ -9,6 +9,7 @@ import com.android.build.gradle.internal.transforms.ProGuardTransform
import
com.android.build.gradle.tasks.ProcessAndroidResources
import
com.didi.virtualapk.utils.FileUtil
import
com.didi.virtualapk.utils.Log
import
com.google.common.collect.ImmutableMap
import
org.gradle.api.Plugin
import
org.gradle.api.Project
import
org.gradle.api.artifacts.component.ComponentIdentifier
...
...
@@ -32,7 +33,15 @@ public class VAHostPlugin implements Plugin<Project> {
public
void
apply
(
Project
project
)
{
this
.
project
=
project
project
.
ext
.
set
(
Constants
.
GRADLE_3_1_0
,
false
)
try
{
Class
.
forName
(
'com.android.builder.core.VariantConfiguration'
)
}
catch
(
Throwable
e
)
{
// com.android.tools.build:gradle:3.1.0
project
.
ext
.
set
(
Constants
.
GRADLE_3_1_0
,
true
)
}
//The target project must be a android application module
if
(!
project
.
plugins
.
hasPlugin
(
'com.android.application'
))
{
Log
.
e
(
TAG
,
"application required!"
)
...
...
@@ -86,8 +95,15 @@ public class VAHostPlugin implements Plugin<Project> {
FileUtil
.
saveFile
(
vaHostDir
,
"versions"
,
{
List
<
String
>
deps
=
new
ArrayList
<
String
>()
Log
.
i
TAG
,
"Used compileClasspath: ${applicationVariant.name}"
Set
<
ArtifactDependencyGraph
.
HashableResolvedArtifactResult
>
compileArtifacts
=
ArtifactDependencyGraph
.
getAllArtifacts
(
applicationVariant
.
variantData
.
scope
,
AndroidArtifacts
.
ConsumedConfigType
.
COMPILE_CLASSPATH
,
null
)
Set
<
ArtifactDependencyGraph
.
HashableResolvedArtifactResult
>
compileArtifacts
if
(
project
.
extensions
.
extraProperties
.
get
(
Constants
.
GRADLE_3_1_0
))
{
ImmutableMap
<
String
,
String
>
buildMapping
=
com
.
android
.
build
.
gradle
.
internal
.
ide
.
ModelBuilder
.
computeBuildMapping
(
project
.
gradle
)
compileArtifacts
=
ArtifactDependencyGraph
.
getAllArtifacts
(
applicationVariant
.
variantData
.
scope
,
AndroidArtifacts
.
ConsumedConfigType
.
COMPILE_CLASSPATH
,
null
,
buildMapping
)
}
else
{
compileArtifacts
=
ArtifactDependencyGraph
.
getAllArtifacts
(
applicationVariant
.
variantData
.
scope
,
AndroidArtifacts
.
ConsumedConfigType
.
COMPILE_CLASSPATH
,
null
)
}
compileArtifacts
.
each
{
ArtifactDependencyGraph
.
HashableResolvedArtifactResult
artifact
->
ComponentIdentifier
id
=
artifact
.
id
.
componentIdentifier
...
...
virtualapk-gradle-plugin/src/main/groovy/com.didi.virtualapk/VAPlugin.groovy
浏览文件 @
dca835f0
package
com.didi.virtualapk
import
com.android.build.gradle.AppPlugin
import
com.android.build.gradle.internal.api.ApplicationVariantImpl
import
com.android.build.gradle.options.BooleanOption
import
com.android.build.gradle.options.ProjectOptions
import
com.didi.virtualapk.hooker.*
import
com.didi.virtualapk.transform.StripClassAndResTransform
import
com.didi.virtualapk.utils.FileBinaryCategory
import
com.didi.virtualapk.utils.Log
import
com.didi.virtualapk.utils.Reflect
import
org.gradle.api.InvalidUserDataException
import
org.gradle.api.Project
import
org.gradle.api.artifacts.Configuration
...
...
@@ -220,6 +224,14 @@ class VAPlugin extends BasePlugin {
dst
<<
hostMapping
}
}
AppPlugin
appPlugin
=
project
.
plugins
.
findPlugin
(
AppPlugin
)
ProjectOptions
projectOptions
=
Reflect
.
on
(
appPlugin
).
field
(
'projectOptions'
).
get
()
if
(
projectOptions
.
get
(
BooleanOption
.
ENABLE_DEX_ARCHIVE
))
{
throw
new
InvalidUserDataException
(
"Can't using incremental dexing mode, please add 'android.useDexArchive=false' in gradle.properties of :${project.name}."
)
}
// project.ext.set('android.useDexArchive', false)
}
static
class
VATaskHookerManager
extends
TaskHookerManager
{
...
...
virtualapk-gradle-plugin/src/main/groovy/com.didi.virtualapk/hooker/MergeManifestsHooker.groovy
浏览文件 @
dca835f0
...
...
@@ -3,6 +3,7 @@ package com.didi.virtualapk.hooker
import
com.android.build.gradle.api.ApkVariant
import
com.android.build.gradle.internal.scope.TaskOutputHolder
import
com.android.build.gradle.tasks.MergeManifests
import
com.didi.virtualapk.Constants
import
com.didi.virtualapk.collector.dependence.DependenceInfo
import
com.didi.virtualapk.utils.Log
import
com.didi.virtualapk.utils.Reflect
...
...
@@ -57,8 +58,15 @@ class MergeManifestsHooker extends GradleTaskHooker<MergeManifests> {
*/
@Override
void
afterTaskExecute
(
MergeManifests
task
)
{
variantData
.
outputScope
.
getOutputs
(
TaskOutputHolder
.
TaskOutputType
.
MERGED_MANIFESTS
).
each
{
rewrite
(
it
.
outputFile
)
if
(
project
.
extensions
.
extraProperties
.
get
(
Constants
.
GRADLE_3_1_0
))
{
File
outputFile
=
com
.
android
.
build
.
gradle
.
internal
.
scope
.
ExistingBuildElements
.
from
(
TaskOutputHolder
.
TaskOutputType
.
MERGED_MANIFESTS
,
scope
.
getOutput
(
TaskOutputHolder
.
TaskOutputType
.
MERGED_MANIFESTS
))
.
element
(
variantData
.
outputScope
.
mainSplit
).
outputFile
rewrite
(
outputFile
)
}
else
{
variantData
.
outputScope
.
getOutputs
(
TaskOutputHolder
.
TaskOutputType
.
MERGED_MANIFESTS
).
each
{
rewrite
(
it
.
outputFile
)
}
}
}
...
...
virtualapk-gradle-plugin/src/main/groovy/com.didi.virtualapk/hooker/PrepareDependenciesHooker.groovy
浏览文件 @
dca835f0
...
...
@@ -5,11 +5,13 @@ import com.android.build.gradle.internal.ide.ArtifactDependencyGraph
import
com.android.build.gradle.internal.tasks.AppPreBuildTask
import
com.android.builder.model.Dependencies
import
com.android.builder.model.SyncIssue
import
com.didi.virtualapk.Constants
import
com.didi.virtualapk.collector.dependence.AarDependenceInfo
import
com.didi.virtualapk.collector.dependence.DependenceInfo
import
com.didi.virtualapk.collector.dependence.JarDependenceInfo
import
com.didi.virtualapk.utils.FileUtil
import
com.didi.virtualapk.utils.Log
import
com.google.common.collect.ImmutableMap
import
org.gradle.api.Project
import
java.util.function.Consumer
...
...
@@ -60,12 +62,19 @@ class PrepareDependenciesHooker extends GradleTaskHooker<AppPreBuildTask> {
*/
@Override
void
afterTaskExecute
(
AppPreBuildTask
task
)
{
Dependencies
dependencies
=
new
ArtifactDependencyGraph
().
createDependencies
(
scope
,
false
,
new
Consumer
<
SyncIssue
>()
{
Consumer
consumer
=
new
Consumer
<
SyncIssue
>()
{
@Override
void
accept
(
SyncIssue
syncIssue
)
{
Log
.
i
'PrepareDependenciesHooker'
,
"Error: ${syncIssue}"
}
})
}
Dependencies
dependencies
if
(
project
.
extensions
.
extraProperties
.
get
(
Constants
.
GRADLE_3_1_0
))
{
ImmutableMap
<
String
,
String
>
buildMapping
=
com
.
android
.
build
.
gradle
.
internal
.
ide
.
ModelBuilder
.
computeBuildMapping
(
project
.
gradle
)
dependencies
=
new
ArtifactDependencyGraph
().
createDependencies
(
scope
,
false
,
buildMapping
,
consumer
)
}
else
{
dependencies
=
new
ArtifactDependencyGraph
().
createDependencies
(
scope
,
false
,
consumer
)
}
dependencies
.
libraries
.
each
{
def
mavenCoordinates
=
it
.
resolvedCoordinates
...
...
virtualapk-gradle-plugin/src/main/groovy/com.didi.virtualapk/hooker/ProcessResourcesHooker.groovy
浏览文件 @
dca835f0
...
...
@@ -6,6 +6,7 @@ import com.android.build.gradle.api.ApkVariant
import
com.android.build.gradle.internal.scope.TaskOutputHolder
import
com.android.build.gradle.tasks.ProcessAndroidResources
import
com.android.sdklib.BuildToolInfo
import
com.didi.virtualapk.Constants
import
com.didi.virtualapk.aapt.Aapt
import
com.didi.virtualapk.collector.ResourceCollector
import
com.didi.virtualapk.collector.res.ResourceEntry
...
...
@@ -57,8 +58,15 @@ class ProcessResourcesHooker extends GradleTaskHooker<ProcessAndroidResources> {
*/
@Override
void
afterTaskExecute
(
ProcessAndroidResources
par
)
{
variantData
.
outputScope
.
getOutputs
(
TaskOutputHolder
.
TaskOutputType
.
PROCESSED_RES
).
each
{
repackage
(
par
,
it
.
outputFile
)
if
(
project
.
extensions
.
extraProperties
.
get
(
Constants
.
GRADLE_3_1_0
))
{
File
outputFile
=
com
.
android
.
build
.
gradle
.
internal
.
scope
.
ExistingBuildElements
.
from
(
TaskOutputHolder
.
TaskOutputType
.
PROCESSED_RES
,
scope
.
getOutput
(
TaskOutputHolder
.
TaskOutputType
.
PROCESSED_RES
))
.
element
(
variantData
.
outputScope
.
mainSplit
).
outputFile
repackage
(
par
,
outputFile
)
}
else
{
variantData
.
outputScope
.
getOutputs
(
TaskOutputHolder
.
TaskOutputType
.
PROCESSED_RES
).
each
{
repackage
(
par
,
it
.
outputFile
)
}
}
}
...
...
@@ -105,7 +113,7 @@ class ProcessResourcesHooker extends GradleTaskHooker<ProcessAndroidResources> {
def
resIdMap
=
resourceCollector
.
resIdMap
def
rSymbolFile
=
par
.
textSymbolOutputFile
def
libRefTable
=
[
"${virtualApk.packageId}"
:
par
.
packageForR
]
def
libRefTable
=
[
"${virtualApk.packageId}"
:
par
.
applicationId
]
def
filteredResources
=
[]
as
HashSet
<
String
>
def
updatedResources
=
[]
as
HashSet
<
String
>
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录