Flutter Engine Uber Docs
Docs for the entire Flutter Engine repo.
 
Loading...
Searching...
No Matches
native_assets.cc
Go to the documentation of this file.
1// Copyright 2013 The Flutter Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
6
8#include "rapidjson/document.h"
9
10namespace flutter {
11
12#if defined(FML_ARCH_CPU_ARMEL)
13#define kTargetArchitectureName "arm"
14#elif defined(FML_ARCH_CPU_ARM64)
15#define kTargetArchitectureName "arm64"
16#elif defined(FML_ARCH_CPU_X86)
17#define kTargetArchitectureName "ia32"
18#elif defined(FML_ARCH_CPU_X86_64)
19#define kTargetArchitectureName "x64"
20#elif defined(FML_ARCH_CPU_RISCV32)
21#define kTargetArchitectureName "riscv32"
22#elif defined(FML_ARCH_CPU_RISCV64)
23#define kTargetArchitectureName "riscv64"
24#else
25#error Target architecture detection failed.
26#endif
27
28#if defined(FML_OS_ANDROID)
29#define kTargetOperatingSystemName "android"
30#elif defined(OS_FUCHSIA)
31#define kTargetOperatingSystemName "fuchsia"
32#elif defined(FML_OS_LINUX)
33#define kTargetOperatingSystemName "linux"
34#elif defined(FML_OS_IOS) || defined(FML_OS_IOS_SIMULATOR)
35#define kTargetOperatingSystemName "ios"
36#elif defined(FML_OS_MACOSX)
37#define kTargetOperatingSystemName "macos"
38#elif defined(FML_OS_WIN)
39#define kTargetOperatingSystemName "windows"
40#else
41#error Target operating system detection failed.
42#endif
43
44#define kTarget kTargetOperatingSystemName "_" kTargetArchitectureName
45
46void NativeAssetsManager::RegisterNativeAssets(const uint8_t* manifest,
47 size_t manifest_size) {
48 // Note that this format is also expected by build tools for Apple
49 // platforms in packages/flutter_tools/bin/xcode_backend.dart.
50 parsed_mapping_.clear();
51
52 rapidjson::Document document;
53 static_assert(sizeof(decltype(document)::Ch) == sizeof(uint8_t), "");
54 document.Parse(reinterpret_cast<const decltype(document)::Ch*>(manifest),
55 manifest_size);
56 if (document.HasParseError()) {
57 FML_DLOG(WARNING) << "NativeAssetsManifest.json is malformed.";
58 return;
59 }
60 if (!document.IsObject()) {
61 FML_DLOG(WARNING) << "NativeAssetsManifest.json is malformed.";
62 return;
63 }
64 auto native_assets = document.FindMember("native-assets");
65 if (native_assets == document.MemberEnd() ||
66 !native_assets->value.IsObject()) {
67 FML_DLOG(WARNING) << "NativeAssetsManifest.json is malformed.";
68 return;
69 }
70 auto mapping = native_assets->value.FindMember(kTarget);
71 if (mapping == native_assets->value.MemberEnd() ||
72 !mapping->value.IsObject()) {
73 FML_DLOG(WARNING) << "NativeAssetsManifest.json is malformed.";
74 return;
75 }
76 for (auto entry = mapping->value.MemberBegin();
77 entry != mapping->value.MemberEnd(); entry++) {
78 std::vector<std::string> parsed_path;
79 entry->name.GetString();
80 auto& value = entry->value;
81 if (!value.IsArray()) {
82 FML_DLOG(WARNING) << "NativeAssetsManifest.json is malformed.";
83 continue;
84 }
85 for (const auto& element : value.GetArray()) {
86 if (!element.IsString()) {
87 FML_DLOG(WARNING) << "NativeAssetsManifest.json is malformed.";
88 continue;
89 }
90 parsed_path.push_back(element.GetString());
91 }
92 parsed_mapping_[entry->name.GetString()] = std::move(parsed_path);
93 }
94}
95
97 const std::shared_ptr<AssetManager>& asset_manager) {
98 std::unique_ptr<fml::Mapping> manifest_mapping =
99 asset_manager->GetAsMapping("NativeAssetsManifest.json");
100 if (manifest_mapping == nullptr) {
101 FML_DLOG(WARNING)
102 << "Could not find NativeAssetsManifest.json in the asset store.";
103 return;
104 }
105
106 RegisterNativeAssets(manifest_mapping->GetMapping(),
107 manifest_mapping->GetSize());
108}
109
111 std::string_view asset_id) {
112 // Cpp17 does not support unordered_map lookup with std::string_view on a
113 // std::string key.
114 std::string as_string = std::string(asset_id);
115 if (parsed_mapping_.find(as_string) == parsed_mapping_.end()) {
116 return std::vector<std::string>();
117 }
118 return parsed_mapping_[as_string];
119}
120
122 if (parsed_mapping_.empty()) {
123 return std::string("No available native assets.");
124 }
125
126 std::string result;
127 result.append("Available native assets: ");
128 bool first = true;
129 for (const auto& n : parsed_mapping_) {
130 if (first) {
131 first = false;
132 } else {
133 result.append(", ");
134 }
135 result.append(n.first);
136 }
137
138 result.append(".");
139 return result;
140}
141
142} // namespace flutter
void RegisterNativeAssets(const uint8_t *manifest, size_t manifest_size)
std::vector< std::string > LookupNativeAsset(std::string_view asset_id)
int32_t value
#define FML_DLOG(severity)
Definition logging.h:121
#define kTarget