// Copyright 2014 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import 'dart:convert'; import 'dart:typed_data'; import 'package:archive/archive.dart'; import 'package:file_testing/file_testing.dart'; import 'package:flutter_tools/src/base/file_system.dart'; import '../src/common.dart'; import 'test_utils.dart'; void main() { late Directory tempDir; setUp(() async { tempDir = fileSystem.systemTempDirectory.createTempSync('flutter_tools_packages_test.'); }); tearDown(() { tryToDelete(tempDir); }); test('Dart identifiers are obfuscated with build apk --obfuscate', () async { const projectName = 'hello_world'; await processManager.run([ flutterBin, 'create', projectName, ], workingDirectory: tempDir.path); final String projectPath = tempDir.childDirectory(projectName).path; await processManager.run([ flutterBin, 'build', 'apk', '--target-platform=android-arm', '--obfuscate', '--split-debug-info=foo/', '--ci', ], workingDirectory: projectPath); final File outputApkDirectory = fileSystem.file( fileSystem.path.join( projectPath, 'build', 'app', 'outputs', 'apk', 'release', 'app-release.apk', ), ); expect(outputApkDirectory, exists); // Expect "hello_world" is not present in the compiled output. // This fails without the --obfuscate flag. expect(_containsSymbol(outputApkDirectory, 'lib/armeabi-v7a/libapp.so', projectName), false); }); test('Dart identifiers are obfuscated with build aar --obfuscate', () async { const moduleName = 'hello_module'; await processManager.run([ flutterBin, 'create', '-t', 'module', moduleName, '--ci', ], workingDirectory: tempDir.path); final String projectPath = tempDir.childDirectory(moduleName).path; await processManager.run([ flutterBin, 'build', 'aar', '--target-platform=android-arm', '--obfuscate', '--split-debug-info=foo/', '--no-debug', '--no-profile', ], workingDirectory: projectPath); final File outputAarDirectory = fileSystem.file( fileSystem.path.join( projectPath, 'build', 'host', 'outputs', 'repo', 'com', 'example', moduleName, 'flutter_release', '1.0', 'flutter_release-1.0.aar', ), ); expect(outputAarDirectory, exists); // Expect "hello_module" is not present in the compiled output. // This fails without the --obfuscate flag. expect(_containsSymbol(outputAarDirectory, 'jni/armeabi-v7a/libapp.so', moduleName), false); }); } bool _containsSymbol(File outputArchive, String libappPath, String symbol) { final Archive archive = ZipDecoder().decodeBytes(outputArchive.readAsBytesSync()); final ArchiveFile? libapp = archive.findFile(libappPath); expect(libapp, isNotNull); final libappBytes = libapp!.content as Uint8List; final String libappStrings = utf8.decode(libappBytes, allowMalformed: true); return libappStrings.contains(symbol); }