// 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 'package:flutter_tools/src/base/io.dart'; import 'package:process/process.dart'; bool containsBitcode(String pathToBinary, ProcessManager processManager) { // See: https://stackoverflow.com/questions/32755775/how-to-check-a-static-library-is-built-contain-bitcode final ProcessResult result = processManager.runSync(<String>[ 'otool', '-l', '-arch', 'arm64', pathToBinary, ]); final String loadCommands = result.stdout as String; if (!loadCommands.contains('__LLVM')) { return false; } // Presence of the section may mean a bitcode marker was embedded (size=1), but there is no content. if (!loadCommands.contains('size 0x0000000000000001')) { return true; } // Check the false positives: size=1 wasn't referencing the __LLVM section. bool emptyBitcodeMarkerFound = false; // Section // sectname __bundle // segname __LLVM // addr 0x003c4000 // size 0x0042b633 // offset 3932160 // ... final List<String> lines = LineSplitter.split(loadCommands).toList(); lines.asMap().forEach((int index, String line) { if (line.contains('segname __LLVM') && lines.length - index - 1 > 3) { final bool bitcodeMarkerFound = lines .skip(index - 1) .take(4) .any((String line) => line.contains(' size 0x0000000000000001')); if (bitcodeMarkerFound) { emptyBitcodeMarkerFound = true; return; } } }); return !emptyBitcodeMarkerFound; }