Flutter Engine
 
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 parsed_mapping_.clear();
49
50 rapidjson::Document document;
51 static_assert(sizeof(decltype(document)::Ch) == sizeof(uint8_t), "");
52 document.Parse(reinterpret_cast<const decltype(document)::Ch*>(manifest),
53 manifest_size);
54 if (document.HasParseError()) {
55 FML_DLOG(WARNING) << "NativeAssetsManifest.json is malformed.";
56 return;
57 }
58 if (!document.IsObject()) {
59 FML_DLOG(WARNING) << "NativeAssetsManifest.json is malformed.";
60 return;
61 }
62 auto native_assets = document.FindMember("native-assets");
63 if (native_assets == document.MemberEnd() ||
64 !native_assets->value.IsObject()) {
65 FML_DLOG(WARNING) << "NativeAssetsManifest.json is malformed.";
66 return;
67 }
68 auto mapping = native_assets->value.FindMember(kTarget);
69 if (mapping == native_assets->value.MemberEnd() ||
70 !mapping->value.IsObject()) {
71 FML_DLOG(WARNING) << "NativeAssetsManifest.json is malformed.";
72 return;
73 }
74 for (auto entry = mapping->value.MemberBegin();
75 entry != mapping->value.MemberEnd(); entry++) {
76 std::vector<std::string> parsed_path;
77 entry->name.GetString();
78 auto& value = entry->value;
79 if (!value.IsArray()) {
80 FML_DLOG(WARNING) << "NativeAssetsManifest.json is malformed.";
81 continue;
82 }
83 for (const auto& element : value.GetArray()) {
84 if (!element.IsString()) {
85 FML_DLOG(WARNING) << "NativeAssetsManifest.json is malformed.";
86 continue;
87 }
88 parsed_path.push_back(element.GetString());
89 }
90 parsed_mapping_[entry->name.GetString()] = std::move(parsed_path);
91 }
92}
93
95 const std::shared_ptr<AssetManager>& asset_manager) {
96 std::unique_ptr<fml::Mapping> manifest_mapping =
97 asset_manager->GetAsMapping("NativeAssetsManifest.json");
98 if (manifest_mapping == nullptr) {
99 FML_DLOG(WARNING)
100 << "Could not find NativeAssetsManifest.json in the asset store.";
101 return;
102 }
103
104 RegisterNativeAssets(manifest_mapping->GetMapping(),
105 manifest_mapping->GetSize());
106}
107
109 std::string_view asset_id) {
110 // Cpp17 does not support unordered_map lookup with std::string_view on a
111 // std::string key.
112 std::string as_string = std::string(asset_id);
113 if (parsed_mapping_.find(as_string) == parsed_mapping_.end()) {
114 return std::vector<std::string>();
115 }
116 return parsed_mapping_[as_string];
117}
118
120 if (parsed_mapping_.empty()) {
121 return std::string("No available native assets.");
122 }
123
124 std::string result;
125 result.append("Available native assets: ");
126 bool first = true;
127 for (const auto& n : parsed_mapping_) {
128 if (first) {
129 first = false;
130 } else {
131 result.append(", ");
132 }
133 result.append(n.first);
134 }
135
136 result.append(".");
137 return result;
138}
139
140} // 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