Skip to content

Commit 3374dfe

Browse files
authored
Merge branch 'master' into enhance-build-time
2 parents 982d583 + cc8db88 commit 3374dfe

10 files changed

Lines changed: 234 additions & 1 deletion

File tree

lib/build_targets/package.dart

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,16 +102,21 @@ class DotnetTpk extends TizenPackage {
102102
getEngineArtifactsDirectory(buildInfo.targetArch, buildMode);
103103
final Directory embedderDir =
104104
getEmbedderArtifactsDirectory(apiVersion, buildInfo.targetArch);
105-
106105
final File engineBinary = engineDir.childFile('libflutter_engine.so');
107106
final File embedder = embedderDir.childFile('libflutter_tizen_$profile.so');
108107
final File icuData = engineDir.childFile('icudtl.dat');
108+
final File appDepsJson =
109+
tizenProject.hostAppRoot.childFile('.app.deps.json');
109110

110111
engineBinary.copySync(libDir.childFile(engineBinary.basename).path);
111112
// The embedder so name is statically defined in C# code and cannot be
112113
// provided at runtime, so the file name must be a constant.
113114
embedder.copySync(libDir.childFile('libflutter_tizen.so').path);
114115
icuData.copySync(resDir.childFile(icuData.basename).path);
116+
appDepsJson.copySync(resDir
117+
.childDirectory('flutter_assets')
118+
.childFile(appDepsJson.basename)
119+
.path);
115120

116121
if (buildMode.isPrecompiled) {
117122
final File aotSnapshot = environment.buildDir.childFile('app.so');
@@ -280,10 +285,16 @@ class NativeTpk extends TizenPackage {
280285
final File engineBinary = engineDir.childFile('libflutter_engine.so');
281286
final File embedder = embedderDir.childFile('libflutter_tizen_$profile.so');
282287
final File icuData = engineDir.childFile('icudtl.dat');
288+
final File appDepsJson =
289+
tizenProject.hostAppRoot.childFile('.app.deps.json');
283290

284291
engineBinary.copySync(libDir.childFile(engineBinary.basename).path);
285292
embedder.copySync(libDir.childFile(embedder.basename).path);
286293
icuData.copySync(resDir.childFile(icuData.basename).path);
294+
appDepsJson.copySync(resDir
295+
.childDirectory('flutter_assets')
296+
.childFile(appDepsJson.basename)
297+
.path);
287298

288299
if (buildMode.isPrecompiled) {
289300
final File aotSnapshot = environment.buildDir.childFile('app.so');

lib/tizen_plugins.dart

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
// Use of this source code is governed by a BSD-style license that can be
44
// found in the LICENSE file.
55

6+
import 'dart:convert';
7+
68
import 'package:analyzer/dart/analysis/analysis_context.dart';
79
import 'package:analyzer/dart/analysis/analysis_context_collection.dart';
810
import 'package:analyzer/dart/analysis/results.dart';
@@ -25,6 +27,7 @@ import 'package:flutter_tools/src/runner/flutter_command.dart';
2527
import 'package:package_config/package_config.dart';
2628
import 'package:yaml/yaml.dart';
2729

30+
import 'tizen_cache.dart';
2831
import 'tizen_project.dart';
2932
import 'tizen_sdk.dart';
3033

@@ -367,6 +370,7 @@ Future<void> injectTizenPlugins(FlutterProject project) async {
367370
await findTizenPlugins(project, cppOnly: true);
368371
final List<TizenPlugin> dotnetPlugins =
369372
await findTizenPlugins(project, dotnetOnly: true);
373+
await _writeAppDepndencyInfo(project);
370374
await _writeTizenPluginRegistrant(tizenProject, cppPlugins, dotnetPlugins);
371375
if (tizenProject.isDotnet) {
372376
await _writeIntermediateDotnetFiles(tizenProject, dotnetPlugins);
@@ -629,3 +633,82 @@ Future<void> renderTemplateToFile(
629633
await file.create(recursive: true);
630634
await file.writeAsString(renderedTemplate);
631635
}
636+
637+
/// See: [_writeFlutterPluginsList] in flutter_plugins.dart
638+
Future<void> _writeAppDepndencyInfo(
639+
FlutterProject project,
640+
) async {
641+
YamlMap? packagesFromPubspecLock() {
642+
final File pubspec = project.directory.childFile('pubspec.lock');
643+
if (!pubspec.existsSync()) {
644+
return null;
645+
}
646+
647+
Object? contents;
648+
try {
649+
contents = loadYaml(pubspec.readAsStringSync());
650+
} on YamlException catch (err) {
651+
globals.printTrace('Failed to parse packages from pubspec.lock: $err');
652+
}
653+
if (contents == null || contents is! YamlMap) {
654+
return null;
655+
}
656+
final Object? packages = contents['packages'];
657+
if (packages == null || packages is! YamlMap) {
658+
return null;
659+
}
660+
return packages;
661+
}
662+
663+
final TizenProject tizenProject = TizenProject.fromFlutter(project);
664+
final File appDepsJson = tizenProject.hostAppRoot.childFile('.app.deps.json');
665+
final List<TizenPlugin> plugins = await findTizenPlugins(project);
666+
final List<Map<String, Object>> pluginInfo = <Map<String, Object>>[];
667+
final YamlMap? packages = packagesFromPubspecLock();
668+
for (final TizenPlugin plugin in plugins) {
669+
String version = '';
670+
if (packages != null && packages.containsKey(plugin.name)) {
671+
final YamlMap package = packages[plugin.name] as YamlMap;
672+
if (package.containsKey('version')) {
673+
version = package['version'] as String;
674+
}
675+
}
676+
pluginInfo.add(<String, Object>{
677+
'name': plugin.name,
678+
'version': version,
679+
});
680+
}
681+
682+
final Map<String, Object?> result = <String, Object>{};
683+
result['info'] =
684+
'This is a generated file; do not edit or check into version control.';
685+
result['plugins'] = pluginInfo;
686+
final Map<String, Object> dart = <String, Object>{};
687+
dart['version'] = globals.flutterVersion.dartSdkVersion;
688+
689+
final Map<String, Object> flutter = <String, Object>{};
690+
flutter['version'] = globals.flutterVersion.frameworkVersion;
691+
692+
final Map<String, Object> flutterTizen = <String, Object>{};
693+
flutterTizen['revision'] = globals.flutterVersion.frameworkRevisionShort;
694+
695+
final Map<String, Object> engine = <String, Object>{};
696+
engine['revision'] = globals.flutterVersion.engineRevisionShort;
697+
698+
final Map<String, Object> embedder = <String, Object>{};
699+
final String revision =
700+
globals.cache.getStampFor(kTizenEmbedderStampName) ?? '';
701+
embedder['revision'] =
702+
revision.length > 10 ? revision.substring(0, 10) : revision;
703+
704+
result['dart'] = dart;
705+
result['flutter'] = flutter;
706+
result['flutter-tizen'] = flutterTizen;
707+
result['engine'] = engine;
708+
result['embedder'] = embedder;
709+
result['date_created'] = globals.systemClock.now().toString();
710+
711+
const JsonEncoder encoder = JsonEncoder.withIndent(' ');
712+
final String formattedJsonString = encoder.convert(result);
713+
appDepsJson.writeAsStringSync(formattedJsonString);
714+
}

templates/multi-app/cpp/ui/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@ flutter/
44
crash-info/
55
Debug/
66
Release/
7+
.app.deps.json

templates/multi-app/csharp/ui/.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,6 @@ obj/
77
# Tizen Core CLI (tz) related files
88
tizen_dotnet_project.yaml
99
*.csproj.backup
10+
11+
# Flutter-tizen dependency information file
12+
.app.deps.json

templates/service-app/cpp/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@ flutter/
44
crash-info/
55
Debug/
66
Release/
7+
.app.deps.json

templates/service-app/csharp/.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,6 @@ obj/
77
# Tizen Core CLI (tz) related files
88
tizen_dotnet_project.yaml
99
*.csproj.backup
10+
11+
# Flutter-tizen dependency information file
12+
.app.deps.json

templates/ui-app/cpp/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@ flutter/
44
crash-info/
55
Debug/
66
Release/
7+
.app.deps.json

templates/ui-app/csharp/.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,6 @@ obj/
77
# Tizen Core CLI (tz) related files
88
tizen_dotnet_project.yaml
99
*.csproj.backup
10+
11+
# Flutter-tizen dependency information file
12+
.app.deps.json

test/general/build_targets/package_test.dart

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,10 @@ void main() {
9696
environment.buildDir
9797
.childFile('tizen_plugins/lib/libshared.so')
9898
.createSync(recursive: true);
99+
projectDir
100+
.childDirectory('tizen')
101+
.childFile('.app.deps.json')
102+
.createSync(recursive: true);
99103

100104
processManager.addCommands(<FakeCommand>[
101105
FakeCommand(
@@ -143,6 +147,7 @@ void main() {
143147
ephemeralDir.childFile('lib/libflutter_engine.so');
144148
final File embedder = ephemeralDir.childFile('lib/libflutter_tizen.so');
145149
final File icuData = ephemeralDir.childFile('res/icudtl.dat');
150+
final File appDepsJson = flutterAssetsDir.childFile('.app.deps.json');
146151
final File aotSnapshot = ephemeralDir.childFile('lib/libapp.so');
147152
final File pluginsLib =
148153
ephemeralDir.childFile('lib/libflutter_plugins.so');
@@ -152,6 +157,7 @@ void main() {
152157
expect(engineBinary, exists);
153158
expect(embedder, exists);
154159
expect(icuData, exists);
160+
expect(appDepsJson, exists);
155161
expect(aotSnapshot, exists);
156162
expect(pluginsLib, exists);
157163
expect(pluginsUserLib, exists);
@@ -179,6 +185,10 @@ void main() {
179185
.childDirectory('flutter_assets')
180186
.createSync(recursive: true);
181187
environment.buildDir.childFile('app.so').createSync(recursive: true);
188+
projectDir
189+
.childDirectory('tizen')
190+
.childFile('.app.deps.json')
191+
.createSync(recursive: true);
182192

183193
processManager.addCommands(<FakeCommand>[
184194
FakeCommand(
@@ -256,6 +266,10 @@ type = app
256266
environment.buildDir
257267
.childFile('tizen_plugins/lib/libshared.so')
258268
.createSync(recursive: true);
269+
projectDir
270+
.childDirectory('tizen')
271+
.childFile('.app.deps.json')
272+
.createSync(recursive: true);
259273

260274
await NativeTpk(const TizenBuildInfo(
261275
BuildInfo.release,
@@ -275,6 +289,7 @@ type = app
275289
final File embedder =
276290
ephemeralDir.childFile('lib/libflutter_tizen_common.so');
277291
final File icuData = ephemeralDir.childFile('res/icudtl.dat');
292+
final File appDepsJson = flutterAssetsDir.childFile('.app.deps.json');
278293
final File aotSnapshot = ephemeralDir.childFile('lib/libapp.so');
279294
final File pluginsLib =
280295
ephemeralDir.childFile('lib/libflutter_plugins.so');
@@ -284,6 +299,7 @@ type = app
284299
expect(engineBinary, exists);
285300
expect(embedder, exists);
286301
expect(icuData, exists);
302+
expect(appDepsJson, exists);
287303
expect(aotSnapshot, exists);
288304
expect(pluginsLib, exists);
289305
expect(pluginsUserLib, exists);
@@ -306,6 +322,10 @@ type = app
306322
environment.buildDir
307323
.childDirectory('flutter_assets')
308324
.createSync(recursive: true);
325+
projectDir
326+
.childDirectory('tizen')
327+
.childFile('.app.deps.json')
328+
.createSync(recursive: true);
309329

310330
await expectLater(
311331
() => NativeTpk(const TizenBuildInfo(

test/general/tizen_plugins_test.dart

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,113 @@ dependencies:
326326
FileSystem: () => fileSystem,
327327
ProcessManager: () => FakeProcessManager.any(),
328328
}, testOn: 'posix');
329+
330+
testUsingContext('Generates plugins & extra info file for C++', () async {
331+
fileSystem.file('tizen/tizen-manifest.xml').createSync(recursive: true);
332+
333+
final Directory pluginDir = fileSystem.directory('/some_native_plugin');
334+
pluginDir.childFile('pubspec.yaml')
335+
..createSync(recursive: true)
336+
..writeAsStringSync('''
337+
flutter:
338+
plugin:
339+
platforms:
340+
tizen:
341+
pluginClass: SomeNativePlugin
342+
fileName: some_native_plugin.h
343+
''');
344+
pubspecFile.writeAsStringSync('''
345+
dependencies:
346+
some_native_plugin:
347+
path: ${pluginDir.path}
348+
''');
349+
packageConfigFile.writeAsStringSync('''
350+
{
351+
"configVersion": 2,
352+
"packages": [
353+
{
354+
"name": "some_native_plugin",
355+
"rootUri": "${pluginDir.uri}",
356+
"packageUri": "lib/",
357+
"languageVersion": "2.12"
358+
}
359+
]
360+
}
361+
''');
362+
await injectTizenPlugins(project);
363+
364+
final File appDepsJson = fileSystem.file('tizen/.app.deps.json');
365+
expect(appDepsJson, exists);
366+
expect(appDepsJson.readAsStringSync(), contains('''
367+
"info": "This is a generated file; do not edit or check into version control.",
368+
"plugins": [
369+
{
370+
"name": "some_native_plugin",
371+
"version": ""
372+
}
373+
],
374+
'''));
375+
}, overrides: <Type, Generator>{
376+
FileSystem: () => fileSystem,
377+
ProcessManager: () => FakeProcessManager.any(),
378+
}, testOn: 'posix');
379+
380+
testUsingContext('Generates plugins & extra info file for C#', () async {
381+
fileSystem.file('tizen/Runner.csproj').createSync(recursive: true);
382+
fileSystem.file('tizen/tizen-manifest.xml').createSync(recursive: true);
383+
384+
final Directory pluginDir = fileSystem.directory('/some_native_plugin');
385+
pluginDir.childFile('pubspec.yaml')
386+
..createSync(recursive: true)
387+
..writeAsStringSync('''
388+
flutter:
389+
plugin:
390+
platforms:
391+
tizen:
392+
pluginClass: SomeNativePlugin
393+
fileName: some_native_plugin.h
394+
''');
395+
pluginDir.childFile('tizen/project_def.prop')
396+
..createSync(recursive: true)
397+
..writeAsStringSync('''
398+
APPNAME = some_native_plugin
399+
type = staticLib
400+
''');
401+
pubspecFile.writeAsStringSync('''
402+
dependencies:
403+
some_native_plugin:
404+
path: ${pluginDir.path}
405+
''');
406+
packageConfigFile.writeAsStringSync('''
407+
{
408+
"configVersion": 2,
409+
"packages": [
410+
{
411+
"name": "some_native_plugin",
412+
"rootUri": "${pluginDir.uri}",
413+
"packageUri": "lib/",
414+
"languageVersion": "2.12"
415+
}
416+
]
417+
}
418+
''');
419+
await injectTizenPlugins(project);
420+
421+
final File appDepsJson = fileSystem.file('tizen/.app.deps.json');
422+
expect(appDepsJson, exists);
423+
expect(appDepsJson.readAsStringSync(), contains('''
424+
"info": "This is a generated file; do not edit or check into version control.",
425+
"plugins": [
426+
{
427+
"name": "some_native_plugin",
428+
"version": ""
429+
}
430+
],
431+
'''));
432+
}, overrides: <Type, Generator>{
433+
FileSystem: () => fileSystem,
434+
ProcessManager: () => FakeProcessManager.any(),
435+
}, testOn: 'posix');
329436
}
330437

331438
class _DummyFlutterCommand extends FlutterCommand with DartPluginRegistry {

0 commit comments

Comments
 (0)