Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in
Toggle navigation
F
Front-End
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
abdullh.alsoleman
Front-End
Commits
606e91ad
Unverified
Commit
606e91ad
authored
Apr 19, 2022
by
Elsabe Ros
Committed by
GitHub
Apr 19, 2022
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Use the maven-publish plugin to publish AAR files. (#101891)
parent
a9914e78
Changes
8
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
306 additions
and
120 deletions
+306
-120
.ci.yaml
.ci.yaml
+44
-44
AUTHORS
AUTHORS
+1
-0
android_obfuscate_test.dart
dev/devicelab/bin/tasks/android_obfuscate_test.dart
+41
-8
build_aar_module_test.dart
dev/devicelab/bin/tasks/build_aar_module_test.dart
+163
-10
aar_init_script.gradle
packages/flutter_tools/gradle/aar_init_script.gradle
+49
-49
gradle.dart
packages/flutter_tools/lib/src/android/gradle.dart
+1
-1
gradle_utils.dart
packages/flutter_tools/lib/src/android/gradle_utils.dart
+1
-2
gradle_test.dart
...flutter_tools/test/general.shard/android/gradle_test.dart
+6
-6
No files found.
.ci.yaml
View file @
606e91ad
This diff is collapsed.
Click to expand it.
AUTHORS
View file @
606e91ad
...
...
@@ -93,3 +93,4 @@ Alberto Miola <betoman96@gmail.com>
Twin Sun, LLC <google-contrib@twinsunsolutions.com>
Taskulu LDA <contributions@taskulu.com>
Jonathan Joelson <jon@joelson.co>
Elsabe Ros <hello@elsabe.dev>
dev/devicelab/bin/tasks/android_obfuscate_test.dart
View file @
606e91ad
...
...
@@ -51,7 +51,8 @@ Future<void> main() async {
});
});
bool
foundAarProjectName
=
false
;
bool
foundProjectNameInOldAar
=
false
;
bool
foundProjectNameInNewAar
=
false
;
await
runModuleProjectTest
((
FlutterModuleProject
flutterProject
)
async
{
section
(
'AAR content with --obfuscate'
);
...
...
@@ -67,21 +68,49 @@ Future<void> main() async {
]);
});
final
String
outputAarDirectory
=
path
.
join
(
section
(
'Check old _release AAR files'
);
final
String
oldReleaseAar
=
path
.
join
(
flutterProject
.
rootPath
,
'build/host/outputs/repo/com/example/
${flutterProject.name}
/flutter_release/1.0/flutter_release-1.0.aar'
,
);
final
Iterable
<
String
>
aarFiles
=
await
getFilesInAar
(
outputAarDirectory
);
final
Iterable
<
String
>
filesInOldAar
=
await
getFilesInAar
(
oldReleaseAar
);
checkCollectionContains
<
String
>(<
String
>[
...
flutterAssets
,
'jni/armeabi-v7a/libapp.so'
,
],
aarFiles
);
],
filesInOldAar
);
// Verify that an identifier from the Dart project code is not present
// in the compiled binary.
await
inDirectory
(
flutterProject
.
rootPath
,
()
async
{
await
exec
(
'unzip'
,
<
String
>[
outputAarDirectory
]);
await
exec
(
'unzip'
,
<
String
>[
'-o'
,
oldReleaseAar
]);
checkFileExists
(
path
.
join
(
flutterProject
.
rootPath
,
'jni/armeabi-v7a/libapp.so'
));
final
String
response
=
await
eval
(
'grep'
,
<
String
>[
flutterProject
.
name
,
'jni/armeabi-v7a/libapp.so'
],
canFail:
true
,
);
if
(
response
.
trim
().
contains
(
'matches'
))
{
foundProjectNameInOldAar
=
true
;
}
});
section
(
'Check new -release AAR files'
);
final
String
newReleaseAar
=
path
.
join
(
flutterProject
.
rootPath
,
'build/host/outputs/repo/com/example/
${flutterProject.name}
/flutter/1.0/flutter-1.0-release.aar'
,
);
final
Iterable
<
String
>
filesInNewAar
=
await
getFilesInAar
(
newReleaseAar
);
checkCollectionContains
<
String
>(<
String
>[
...
flutterAssets
,
'jni/armeabi-v7a/libapp.so'
,
],
filesInNewAar
);
await
inDirectory
(
flutterProject
.
rootPath
,
()
async
{
await
exec
(
'unzip'
,
<
String
>[
'-o'
,
newReleaseAar
]);
checkFileExists
(
path
.
join
(
flutterProject
.
rootPath
,
'jni/armeabi-v7a/libapp.so'
));
final
String
response
=
await
eval
(
'grep'
,
...
...
@@ -89,16 +118,20 @@ Future<void> main() async {
canFail:
true
,
);
if
(
response
.
trim
().
contains
(
'matches'
))
{
found
AarProjectName
=
true
;
found
ProjectNameInNewAar
=
true
;
}
});
});
if
(
foundApkProjectName
)
{
return
TaskResult
.
failure
(
'Found project name in obfuscated APK dart library'
);
}
if
(
foundAarProjectName
)
{
return
TaskResult
.
failure
(
'Found project name in obfuscated AAR dart library'
);
if
(
foundProjectNameInOldAar
)
{
return
TaskResult
.
failure
(
'Found project name in obfuscated AAR _release dart library'
);
}
if
(
foundProjectNameInNewAar
)
{
return
TaskResult
.
failure
(
'Found project name in obfuscated AAR -release dart library'
);
}
return
TaskResult
.
success
(
null
);
...
...
dev/devicelab/bin/tasks/build_aar_module_test.dart
View file @
606e91ad
...
...
@@ -98,7 +98,7 @@ Future<void> main() async {
'repo'
,
);
section
(
'Check release Maven artifacts'
);
section
(
'Check release Maven artifacts
(old format)
'
);
checkFileExists
(
path
.
join
(
repoPath
,
...
...
@@ -111,7 +111,7 @@ Future<void> main() async {
'flutter_release-1.0.aar'
,
));
final
String
releasePom
=
path
.
join
(
final
String
releasePom
Old
=
path
.
join
(
repoPath
,
'io'
,
'flutter'
,
...
...
@@ -122,7 +122,7 @@ Future<void> main() async {
'flutter_release-1.0.pom'
,
);
checkFileExists
(
releasePom
);
checkFileExists
(
releasePom
Old
);
checkFileExists
(
path
.
join
(
repoPath
,
...
...
@@ -146,6 +146,54 @@ Future<void> main() async {
'plugin_with_android_release-1.0.pom'
,
));
section
(
'Check release Maven artifacts (new format)'
);
checkFileExists
(
path
.
join
(
repoPath
,
'io'
,
'flutter'
,
'devicelab'
,
'hello'
,
'flutter'
,
'1.0'
,
'flutter-1.0-release.aar'
,
));
final
String
releasePomNew
=
path
.
join
(
repoPath
,
'io'
,
'flutter'
,
'devicelab'
,
'hello'
,
'flutter'
,
'1.0'
,
'flutter-1.0.pom'
,
);
checkFileExists
(
releasePomNew
);
checkFileExists
(
path
.
join
(
repoPath
,
'io'
,
'flutter'
,
'devicelab'
,
'plugin_with_android'
,
'plugin_with_android'
,
'1.0'
,
'plugin_with_android-1.0-release.aar'
,
));
checkFileExists
(
path
.
join
(
repoPath
,
'io'
,
'flutter'
,
'devicelab'
,
'plugin_with_android'
,
'plugin_with_android'
,
'1.0'
,
'plugin_with_android-1.0.pom'
,
));
section
(
'Check AOT blobs in release POM'
);
checkFileContains
(<
String
>[
...
...
@@ -153,8 +201,17 @@ Future<void> main() async {
'armeabi_v7a_release'
,
'arm64_v8a_release'
,
'x86_64_release'
,
'plugin_with_android_release'
,
],
releasePom
);
'plugin_with_android'
,
'<relocation>'
,
//make sure the old pom contains the <relocation> tag
],
releasePomOld
);
checkFileContains
(<
String
>[
'flutter_embedding_release'
,
'armeabi_v7a_release'
,
'arm64_v8a_release'
,
'x86_64_release'
,
'plugin_with_android'
,
],
releasePomNew
);
section
(
'Check assets in release AAR'
);
...
...
@@ -180,7 +237,29 @@ Future<void> main() async {
)
);
section
(
'Check debug Maven artifacts'
);
checkCollectionContains
<
String
>(
<
String
>[
...
flutterAssets
,
// AOT snapshots
'jni/arm64-v8a/libapp.so'
,
'jni/armeabi-v7a/libapp.so'
,
'jni/x86_64/libapp.so'
,
],
await
getFilesInAar
(
path
.
join
(
repoPath
,
'io'
,
'flutter'
,
'devicelab'
,
'hello'
,
'flutter'
,
'1.0'
,
'flutter-1.0-release.aar'
,
)
)
);
section
(
'Check debug Maven artifacts (old format)'
);
checkFileExists
(
path
.
join
(
repoPath
,
...
...
@@ -193,7 +272,7 @@ Future<void> main() async {
'flutter_debug-1.0.aar'
,
));
final
String
debugPom
=
path
.
join
(
final
String
debugPom
Old
=
path
.
join
(
repoPath
,
'io'
,
'flutter'
,
...
...
@@ -204,7 +283,7 @@ Future<void> main() async {
'flutter_debug-1.0.pom'
,
);
checkFileExists
(
debugPom
);
checkFileExists
(
debugPom
Old
);
checkFileExists
(
path
.
join
(
repoPath
,
...
...
@@ -228,6 +307,54 @@ Future<void> main() async {
'plugin_with_android_debug-1.0.pom'
,
));
section
(
'Check debug Maven artifacts (new format)'
);
checkFileExists
(
path
.
join
(
repoPath
,
'io'
,
'flutter'
,
'devicelab'
,
'hello'
,
'flutter'
,
'1.0'
,
'flutter-1.0-debug.aar'
,
));
final
String
debugPomNew
=
path
.
join
(
repoPath
,
'io'
,
'flutter'
,
'devicelab'
,
'hello'
,
'flutter'
,
'1.0'
,
'flutter-1.0.pom'
,
);
checkFileExists
(
debugPomNew
);
checkFileExists
(
path
.
join
(
repoPath
,
'io'
,
'flutter'
,
'devicelab'
,
'plugin_with_android'
,
'plugin_with_android'
,
'1.0'
,
'plugin_with_android-1.0-debug.aar'
,
));
checkFileExists
(
path
.
join
(
repoPath
,
'io'
,
'flutter'
,
'devicelab'
,
'plugin_with_android'
,
'plugin_with_android'
,
'1.0'
,
'plugin_with_android-1.0.pom'
,
));
section
(
'Check AOT blobs in debug POM'
);
checkFileContains
(<
String
>[
...
...
@@ -236,8 +363,18 @@ Future<void> main() async {
'x86_64_debug'
,
'armeabi_v7a_debug'
,
'arm64_v8a_debug'
,
'plugin_with_android_debug'
,
],
debugPom
);
'plugin_with_android'
,
'<relocation>'
,
//make sure the old pom contains the <relocation> tag
],
debugPomOld
);
checkFileContains
(<
String
>[
'flutter_embedding_debug'
,
'x86_debug'
,
'x86_64_debug'
,
'armeabi_v7a_debug'
,
'arm64_v8a_debug'
,
'plugin_with_android'
,
],
debugPomNew
);
section
(
'Check assets in debug AAR'
);
...
...
@@ -252,11 +389,27 @@ Future<void> main() async {
'flutter_debug-1.0.aar'
,
));
final
Iterable
<
String
>
debugAarNew
=
await
getFilesInAar
(
path
.
join
(
repoPath
,
'io'
,
'flutter'
,
'devicelab'
,
'hello'
,
'flutter'
,
'1.0'
,
'flutter-1.0-debug.aar'
,
));
checkCollectionContains
<
String
>(<
String
>[
...
flutterAssets
,
...
debugAssets
,
],
debugAar
);
checkCollectionContains
<
String
>(<
String
>[
...
flutterAssets
,
...
debugAssets
,
],
debugAarNew
);
return
TaskResult
.
success
(
null
);
}
on
TaskResult
catch
(
taskResult
)
{
return
taskResult
;
...
...
packages/flutter_tools/gradle/aar_init_script.gradle
View file @
606e91ad
...
...
@@ -6,9 +6,7 @@
import
java.nio.file.Paths
import
org.gradle.api.Project
import
org.gradle.api.artifacts.Configuration
import
org.gradle.api.artifacts.maven.MavenDeployer
import
org.gradle.api.plugins.MavenPlugin
import
org.gradle.api.tasks.Upload
import
org.gradle.api.publish.maven.MavenPublication
void
configureProject
(
Project
project
,
String
outputDir
)
{
if
(!
project
.
hasProperty
(
"android"
))
{
...
...
@@ -18,8 +16,6 @@ void configureProject(Project project, String outputDir) {
throw
new
GradleException
(
"Can't generate AAR on a non Android library project."
);
}
project
.
apply
plugin:
"maven"
// Snapshot versions include the timestamp in the artifact name.
// Therefore, remove the snapshot part, so new runs of `flutter build aar` overrides existing artifacts.
// This version isn't relevant in Flutter since the pub version is used
...
...
@@ -34,13 +30,51 @@ void configureProject(Project project, String outputDir) {
addAarTask
(
project
,
variant
)
}
project
.
uploadArchives
{
project
.
publishing
{
repositories
{
mavenDeployer
{
repository
(
url:
"file://${outputDir}/outputs/repo"
)
maven
{
url
=
uri
(
"file://${outputDir}/outputs/repo"
)
}
}
}
// Some extra work to have alternative publications with the same format as the old maven plugin.
// Instead of using classifiers for the variants, the old maven plugin appended `_{variant}` to the artifactId
// First, create a default MavenPublication for each variant (except "all" since that is used to publish artifacts in the new way)
project
.
components
.
forEach
{
component
->
if
(
component
.
name
!=
"all"
)
{
project
.
publishing
.
publications
.
create
(
component
.
name
,
MavenPublication
)
{
from
component
}
}
}
// then, rename the artifactId to include the variant and make sure to remove any classifier
// data tha gradle has set, as well as adding a <relocation> tag pointing to the new coordinates
project
.
publishing
.
publications
.
forEach
{
pub
->
def
relocationArtifactId
=
pub
.
artifactId
pub
.
artifactId
=
"${relocationArtifactId}_${pub.name}"
pub
.
alias
=
true
pub
.
pom
.
distributionManagement
{
relocation
{
// New artifact coordinates
groupId
=
"${pub.groupId}"
artifactId
=
"${relocationArtifactId}"
version
=
"${pub.version}"
message
=
"Use classifiers rather than _variant for new publish plugin"
}
}
}
// also publish the artifacts in the new way, using one set of coordinates with classifiers
project
.
publishing
.
publications
.
create
(
"all"
,
MavenPublication
)
{
from
project
.
components
.
all
alias
false
}
if
(!
project
.
property
(
"is-plugin"
).
toBoolean
())
{
return
}
...
...
@@ -84,55 +118,21 @@ void addAarTask(Project project, variant) {
String
variantName
=
variant
.
name
.
capitalize
()
String
taskName
=
"assembleAar$variantName"
project
.
tasks
.
create
(
name:
taskName
)
{
// This check is required to be able to configure the archives before `
uploadArchives
` runs.
// This check is required to be able to configure the archives before `
publish
` runs.
if
(!
project
.
gradle
.
startParameter
.
taskNames
.
contains
(
taskName
))
{
return
}
project
.
uploadArchives
.
repositories
.
mavenDeployer
{
pom
{
artifactId
=
"${project.name}_${variant.name.toLowerCase()}"
}
}
overrideDefaultPublishConfig
(
project
,
variant
)
// Generate the Maven artifacts.
finalizedBy
"
uploadArchives
"
finalizedBy
"
publish
"
}
}
// This method mimics the logic in AGP when `android.defaultPublishConfig` is set in `build.gradle`:
// https://android.googlesource.com/platform/tools/base/+/studio-master-dev/build-system/gradle-core/src/main/java/com/android/build/gradle/internal/variant/VariantHelper.java
//
// Unfortunately, `android.defaultPublishConfig` cannot be overridden at this point since
// AGP already run this code.
void
overrideDefaultPublishConfig
(
Project
project
,
variant
)
{
String
variantName
=
variant
.
name
.
capitalize
()
Task
bundle
=
project
.
tasks
.
findByName
(
"bundle${variantName}Aar"
)
// gradle:3.2.0
if
(
bundle
==
null
)
{
bundle
=
project
.
tasks
.
findByName
(
"bundle${variantName}"
)
// gradle:3.1.0
}
if
(
bundle
==
null
)
{
throw
new
GradleException
(
"Can't generate AAR for variant ${variantName}."
);
}
// Clear the current archive artifacts since the artifacts are based on `android.defaultPublishConfig`.
project
.
configurations
[
"archives"
].
artifacts
.
clear
()
// Add the artifact that will be published.
project
.
artifacts
.
add
(
"archives"
,
bundle
)
// maven-publish has to be applied _before_ the project gets evaluated, but some of the code in
// `configureProject` requires the project to be evaluated. Apply the maven plugin to all projects, but
// only configure it if it matches the conditions in `projectsEvaluated`
def
scopeMappings
=
project
.
uploadArchives
.
repositories
.
mavenDeployer
.
pom
.
scopeMappings
// Clear the scope mappings added by AGP since they are based on the current `android.defaultPublishConfig`.
scopeMappings
.
mappings
.
clear
()
// Add the new mappings.
for
(
Configuration
configuration
:
flattenConfiguration
(
variant
.
runtimeConfiguration
))
{
scopeMappings
.
addMapping
(
/* priority = */
300
,
configuration
,
"compile"
)
}
}
Set
<
Configuration
>
flattenConfiguration
(
Configuration
configuration
)
{
Set
<
Configuration
>
configs
=
[
configuration
]
for
(
Configuration
extend
:
configuration
.
extendsFrom
)
{
configs
.
addAll
(
flattenConfiguration
(
extend
))
}
return
configs
allprojects
{
apply
plugin:
"maven-publish"
}
projectsEvaluated
{
...
...
packages/flutter_tools/lib/src/android/gradle.dart
View file @
606e91ad
...
...
@@ -726,7 +726,7 @@ void printHowToConsumeAar({
for
(
final
String
buildMode
in
buildModes
)
{
logger
.
printStatus
(
"""
${buildMode}
Implementation '
$androidPackage
:flutter
_
$buildMode
:
$buildNumber
'"""
);
${buildMode}
Implementation '
$androidPackage
:flutter
:
$buildNumber
:
$buildMode
'"""
);
}
logger
.
printStatus
(
'''
...
...
packages/flutter_tools/lib/src/android/gradle_utils.dart
View file @
606e91ad
...
...
@@ -29,8 +29,7 @@ import 'android_sdk.dart';
// https://kotlinlang.org/docs/gradle.html#plugin-and-versions
const
String
templateDefaultGradleVersion
=
'7.4'
;
const
String
templateAndroidGradlePluginVersion
=
'7.1.2'
;
// TODO(egarciad): Gradle 7 breaks AARs builds: https://github.com/flutter/flutter/issues/101083
const
String
templateDefaultGradleVersionForModule
=
'4.1.0'
;
const
String
templateDefaultGradleVersionForModule
=
'7.1.2'
;
const
String
templateKotlinGradlePluginVersion
=
'1.6.10'
;
// These versions should match the values in flutter.gradle (FlutterExtension).
...
...
packages/flutter_tools/test/general.shard/android/gradle_test.dart
View file @
606e91ad
...
...
@@ -543,9 +543,9 @@ flutter:
' 3. Make the host app depend on the Flutter module:
\n
'
'
\n
'
' dependencies {
\n
'
" releaseImplementation 'com.mycompany:flutter
_release:2.2
'
\n
"
" debugImplementation 'com.mycompany:flutter
_debug:2.2
'
\n
"
" profileImplementation 'com.mycompany:flutter
_profile:2.2
'
\n
"
" releaseImplementation 'com.mycompany:flutter
:2.2:release
'
\n
"
" debugImplementation 'com.mycompany:flutter
:2.2:debug
'
\n
"
" profileImplementation 'com.mycompany:flutter
:2.2:profile
'
\n
"
' }
\n
'
'
\n
'
'
\n
'
...
...
@@ -594,7 +594,7 @@ flutter:
' 3. Make the host app depend on the Flutter module:
\n
'
'
\n
'
' dependencies {
\n
'
" releaseImplementation 'com.mycompany:flutter
_release:1.0
'
\n
"
" releaseImplementation 'com.mycompany:flutter
:1.0:release
'
\n
"
' }
\n
'
'
\n
'
'To learn more, visit https://flutter.dev/go/build-aar
\n
'
...
...
@@ -632,7 +632,7 @@ flutter:
' 3. Make the host app depend on the Flutter module:
\n
'
'
\n
'
' dependencies {
\n
'
" debugImplementation 'com.mycompany:flutter
_debug:1.0
'
\n
"
" debugImplementation 'com.mycompany:flutter
:1.0:debug
'
\n
"
' }
\n
'
'
\n
'
'To learn more, visit https://flutter.dev/go/build-aar
\n
'
...
...
@@ -671,7 +671,7 @@ flutter:
' 3. Make the host app depend on the Flutter module:
\n
'
'
\n
'
' dependencies {
\n
'
" profileImplementation 'com.mycompany:flutter
_profile:1.0
'
\n
"
" profileImplementation 'com.mycompany:flutter
:1.0:profile
'
\n
"
' }
\n
'
'
\n
'
'
\n
'
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment