gradle_plugin_fat_apk_test.dart 5.07 KB
Newer Older
Ian Hickson's avatar
Ian Hickson committed
1
// Copyright 2014 The Flutter Authors. All rights reserved.
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'dart:async';
import 'dart:io';

import 'package:path/path.dart' as path;
import 'package:flutter_devicelab/framework/apk_utils.dart';
import 'package:flutter_devicelab/framework/framework.dart';
import 'package:flutter_devicelab/framework/utils.dart';

Future<void> main() async {
  await task(() async {
    try {
      await runPluginProjectTest((FlutterPluginProject pluginProject) async {
        section('APK content for task assembleDebug without explicit target platform');
        await pluginProject.runGradleTask('assembleDebug');

20
        final Iterable<String> apkFiles = await getFilesInApk(pluginProject.debugApkPath);
21

22
        checkCollectionContains<String>(<String>[
23
          ...flutterAssets,
24 25
          ...debugAssets,
          ...baseApkFiles,
26
          'lib/armeabi-v7a/libflutter.so',
27
          'lib/arm64-v8a/libflutter.so',
28 29 30 31 32
          // Debug mode intentionally includes `x86` and `x86_64`.
          'lib/x86/libflutter.so',
          'lib/x86_64/libflutter.so',
        ], apkFiles);

33
        checkCollectionDoesNotContain<String>(<String>[
34 35 36 37 38 39 40 41 42 43 44
          'lib/arm64-v8a/libapp.so',
          'lib/armeabi-v7a/libapp.so',
          'lib/x86/libapp.so',
          'lib/x86_64/libapp.so',
        ], apkFiles);
      });

      await runPluginProjectTest((FlutterPluginProject pluginProject) async {
        section('APK content for task assembleRelease without explicit target platform');
        await pluginProject.runGradleTask('assembleRelease');

45
        final Iterable<String> apkFiles = await getFilesInApk(pluginProject.releaseApkPath);
46

47
        checkCollectionContains<String>(<String>[
48
          ...flutterAssets,
49
          ...baseApkFiles,
50 51
          'lib/armeabi-v7a/libflutter.so',
          'lib/armeabi-v7a/libapp.so',
52 53
          'lib/arm64-v8a/libflutter.so',
          'lib/arm64-v8a/libapp.so',
54 55
        ], apkFiles);

56
        checkCollectionDoesNotContain<String>(debugAssets, apkFiles);
57 58 59 60 61 62 63
      });

      await runPluginProjectTest((FlutterPluginProject pluginProject) async {
        section('APK content for task assembleRelease with target platform = android-arm, android-arm64');
        await pluginProject.runGradleTask('assembleRelease',
            options: <String>['-Ptarget-platform=android-arm,android-arm64']);

64
        final Iterable<String> apkFiles = await getFilesInApk(pluginProject.releaseApkPath);
65

66
        checkCollectionContains<String>(<String>[
67
          ...flutterAssets,
68
          ...baseApkFiles,
69 70 71 72 73 74
          'lib/armeabi-v7a/libflutter.so',
          'lib/armeabi-v7a/libapp.so',
          'lib/arm64-v8a/libflutter.so',
          'lib/arm64-v8a/libapp.so',
        ], apkFiles);

75
        checkCollectionDoesNotContain<String>(debugAssets, apkFiles);
76 77 78 79 80 81 82 83
      });

      await runPluginProjectTest((FlutterPluginProject pluginProject) async {
        section('APK content for task assembleRelease with '
                'target platform = android-arm, android-arm64 and split per ABI');
        await pluginProject.runGradleTask('assembleRelease',
            options: <String>['-Ptarget-platform=android-arm,android-arm64', '-Psplit-per-abi=true']);

84
        final Iterable<String> armApkFiles = await getFilesInApk(pluginProject.releaseArmApkPath);
85

86
        checkCollectionContains<String>(<String>[
87
          ...flutterAssets,
88
          ...baseApkFiles,
89 90 91 92
          'lib/armeabi-v7a/libflutter.so',
          'lib/armeabi-v7a/libapp.so',
        ], armApkFiles);

93
        checkCollectionDoesNotContain<String>(debugAssets, armApkFiles);
94

95
        final Iterable<String> arm64ApkFiles = await getFilesInApk(pluginProject.releaseArm64ApkPath);
96

97
        checkCollectionContains<String>(<String>[
98
          ...flutterAssets,
99
          ...baseApkFiles,
100 101 102 103
          'lib/arm64-v8a/libflutter.so',
          'lib/arm64-v8a/libapp.so',
        ], arm64ApkFiles);

104
        checkCollectionDoesNotContain<String>(debugAssets, arm64ApkFiles);
105 106 107 108 109 110 111 112 113
      });

      await runProjectTest((FlutterProject project) async {
        section('gradlew assembleRelease');
        await project.runGradleTask('assembleRelease');

        // When the platform-target isn't specified, we generate the snapshots
        // for arm and arm64.
        final List<String> targetPlatforms = <String>[
114 115
          'arm64-v8a',
          'armeabi-v7a',
116 117 118
        ];
        for (final String targetPlatform in targetPlatforms) {
          final String androidArmSnapshotPath = path.join(
119 120 121 122 123 124 125 126
            project.rootPath,
            'build',
            'app',
            'intermediates',
            'flutter',
            'release',
            targetPlatform,
          );
127 128 129

          final String sharedLibrary = path.join(androidArmSnapshotPath, 'app.so');
          if (!File(sharedLibrary).existsSync()) {
130
            throw TaskResult.failure("Shared library doesn't exist");
131 132 133 134 135 136 137 138 139 140 141 142
          }
        }
      });

      return TaskResult.success(null);
    } on TaskResult catch (taskResult) {
      return taskResult;
    } catch (e) {
      return TaskResult.failure(e.toString());
    }
  });
}