This commit is contained in:
baldeau 2024-03-05 00:34:31 +01:00
parent e7c55104e8
commit 39a6d87817
167 changed files with 5291 additions and 147 deletions

BIN
.DS_Store vendored

Binary file not shown.

8
.mermaid-config.json Normal file
View File

@ -0,0 +1,8 @@
{
"theme": "neutral",
"fontFamily": "Times New Roman",
"actorFontFamily": "Times New Roman",
"noteFontFamily": "Times New Roman",
"messageFontFamily": "Times New Roman",
"personFontFamily": "Times New Roman"
}

20
.vscode/settings.json vendored
View File

@ -1,11 +1,13 @@
{
"folder-path-color.folders": [
{ "path": "chapters/01", "symbol": "SR", "tooltip": "Source files" },
{ "path": "chapters/02", "symbol": "T", "tooltip": "Common" },
{ "path": "chapters/03", "symbol": "T", "tooltip": "Common" },
{ "path": "chapters/04", "symbol": "T", "tooltip": "Common" },
{ "path": "chapters/05", "symbol": "T", "tooltip": "Common" },
{ "path": "chapters/06", "symbol": "T", "tooltip": "Common" },
{ "path": "chapters/07", "symbol": "T", "tooltip": "Common" },
]
"folder-path-color.folders": [
{ "path": "chapters/01", "symbol": "SR", "tooltip": "01" },
{ "path": "chapters/02", "symbol": "T", "tooltip": "02" },
{ "path": "chapters/03", "symbol": "T", "tooltip": "03" },
{ "path": "chapters/04", "symbol": "T", "tooltip": "04" },
{ "path": "chapters/05", "symbol": "T", "tooltip": "05" },
{ "path": "chapters/06", "symbol": "T", "tooltip": "06" },
{ "path": "chapters/07", "symbol": "T", "tooltip": "07" }
],
"cSpell.enabled": true,
"cSpell.enableFiletypes": ["markdown_latex_combined"]
}

16
.vscode/tasks.json vendored Normal file
View File

@ -0,0 +1,16 @@
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "make",
"type": "shell",
"command": "make",
"group": {
"kind": "build",
"isDefault": true
}
}
]
}

View File

@ -1,3 +1,25 @@
@online{0andriyAnswerWhatMinimum2015,
title = {Answer to "{{What}} Is the Minimum Amount of {{RAM}} Required to Run {{Linux}} Kernel on an {{Embedded}} Device?"},
shorttitle = {Answer to "{{What}} Is the Minimum Amount of {{RAM}} Required to Run {{Linux}} Kernel on an {{Embedded}} Device?},
author = {0andriy},
date = {2015-01-14},
url = {https://stackoverflow.com/a/27950451},
urldate = {2024-02-19},
organization = {{Stack Overflow}},
file = {/Users/fabian/Zotero/storage/HNIIPU6S/what-is-the-minimum-amount-of-ram-required-to-run-linux-kernel-on-an-embedded-de.html}
}
@online{3ClauseBSDLicense2011,
title = {The 3-{{Clause BSD License}}},
date = {2011-05-22T22:21:11+00:00},
url = {https://opensource.org/license/bsd-3-clause/},
urldate = {2024-02-18},
abstract = {Note: This license has also been called the “New BSD License” or “Modified BSD License”. See also the 2-clause BSD License. Copyright {$<$}YEAR{$>$} {$<$}COPYRIGHT HOLDER{$>$} R…},
langid = {american},
organization = {{Open Source Initiative}},
file = {/Users/fabian/Zotero/storage/ZHWXNYXB/bsd-3-clause.html}
}
@online{bizzottoComparisonPopularFlutter2023,
title = {A {{Comparison}} of {{Popular Flutter App Architectures}}},
author = {Bizzotto, Andrea},
@ -10,6 +32,53 @@
file = {/Users/fabian/Zotero/storage/DUDXBAGD/comparison-flutter-app-architectures.html}
}
@article{dechenshawSystemsSystemsCyberPhysical2016,
title = {Systems of {{Systems}}, {{Cyber-Physical Systems}}, the {{Internet-of-Things}}…whatever {{Next}}?},
author = {family=C Henshaw, given=Michael J., prefix=de, useprefix=true},
date = {2016},
journaltitle = {INSIGHT},
volume = {19},
number = {3},
pages = {51--54},
issn = {2156-4868},
doi = {10.1002/inst.12109},
url = {https://onlinelibrary.wiley.com/doi/abs/10.1002/inst.12109},
urldate = {2024-02-15},
abstract = {This paper considers the concepts of systems of systems, cyber-physical systems, and the Internet-of-things. Although originating from different domains and perspectives, there is considerable convergence of the three concepts in terms of future complex systems, and it is concluded that the Internet-of-things is essentially a cyber-physical system of systems which will require new approaches in systems engineering to be developed.},
langid = {english},
file = {/Users/fabian/Zotero/storage/L4V53253/inst.html}
}
@article{dibattistaModellingDiseaseTransmission,
title = {Modelling Disease Transmission from Touchscreen User Interfaces},
author = {Di Battista, Andrew and Nicolaides, Christos and Georgiou, Orestis},
journaltitle = {Royal Society Open Science},
shortjournal = {R Soc Open Sci},
volume = {8},
number = {7},
eprint = {34350020},
eprinttype = {pmid},
pages = {210625},
issn = {2054-5703},
doi = {10.1098/rsos.210625},
url = {https://www.ncbi.nlm.nih.gov/pmc/articles/PMC8316822/},
urldate = {2024-02-22},
abstract = {The extensive use of touchscreens for all manner of humancomputer interactions has made them plausible instruments of touch-mediated disease transmission. To that end, we employ stochastic simulations to model humanfomite interaction with a distinct focus on touchscreen interfaces. The timings and frequency of interactions from within a closed population of infectious and susceptible individuals was modelled using a queuing network. A pseudo-reproductive number R was used to compare outcomes under various parameter conditions. We then apply the simulation to a specific real-world scenario; namely that of airport self-check-in and baggage drop. A counterintuitive result was that R decreased with increased touch rates required for touchscreen interaction. Additionally, as one of few parameters to be controlled, the rate of cleaning/disinfecting screens plays an essential role in mitigating R, though alternative technological strategies could prove more effective. The simulation model developed provides a foundation for future advances in more sophisticated fomite disease-transmission modelling.},
pmcid = {PMC8316822},
file = {/Users/fabian/Zotero/storage/UY4WG89R/Di Battista et al_Modelling disease transmission from touchscreen user interfaces.pdf}
}
@online{dikkyryanpratamaWhatLinuxDistribution,
title = {What {{Is Linux Distribution}}?},
author = {{Dikky Ryan Pratama}},
url = {https://www.alibabacloud.com/blog/what-is-linux-distribution_599979},
urldate = {2024-02-22},
abstract = {The article explains what a Linux distribution is, its main characteristics and components, how it caters to a wide range of users and purposes.},
langid = {english},
organization = {{Alibaba Cloud Community}},
file = {/Users/fabian/Zotero/storage/LAGSLH4P/what-is-linux-distribution_599979.html}
}
@online{FlutterArchitecturalOverviewb,
title = {Flutter Architectural Overview},
url = {https://docs.flutter.dev/resources/architectural-overview},
@ -28,8 +97,62 @@
file = {/Users/fabian/Zotero/storage/V9T5LLK6/inside-flutter.html}
}
@online{IntroductionDeclarativeUI,
@online{FlutterGPU,
title = {Flutter {{GPU}}},
url = {https://github.com/flutter/flutter/wiki/Flutter-GPU},
urldate = {2024-02-15},
abstract = {Flutter makes it easy and fast to build beautiful apps for mobile and beyond - flutter/flutter},
langid = {english},
organization = {{GitHub}},
file = {/Users/fabian/Zotero/storage/VVZT5YJA/Flutter-GPU.html}
}
@online{FlutterWeiSuoYouPingMuChuangZaoJingCai,
title = {Flutter: 为所有屏幕创造精彩},
shorttitle = {Flutter},
url = {https://flutter.cn/},
urldate = {2024-02-23},
abstract = {Flutter 官方文档中文版,包含 SDK 下载、最新特性介绍、代码示例、开发文档、中文社区等内容。},
langid = {chinese}
}
@online{ganssleWhatEmbedded2008,
title = {What's {{Embedded}}?},
author = {Ganssle, Jack},
date = {2008-03-17T13:06:00+00:00},
url = {https://www.embedded.com/whats-embedded/},
urldate = {2024-02-22},
abstract = {At the 2004 ESC Wind River's Jerry Fiddler claimed that there is no real embedded systems market. He felt that it was all about "the device," and in},
langid = {american},
organization = {{Embedded.com}},
file = {/Users/fabian/Zotero/storage/XNVLRL6Q/whats-embedded.html}
}
@online{gardeFlutterRaspberryPi2018,
title = {Flutter on {{Raspberry Pi}} (Mostly) from {{Scratch}}},
author = {Garde, Chinmay},
date = {2018-11-30T11:44:00},
url = {https://medium.com/flutter/flutter-on-raspberry-pi-mostly-from-scratch-2824c5e7dcb1},
urldate = {2023-11-13},
abstract = {This document describes an experiment in porting the Flutter engine to a target that is currently not supported. That fact that I used a…},
langid = {english},
organization = {{Flutter}},
file = {/Users/fabian/Zotero/storage/3K7HX2EI/flutter-on-raspberry-pi-mostly-from-scratch-2824c5e7dcb1.html}
}
@online{googleinc.FutterBuildAny,
title = {Futter - {{Build}} for Any Screen},
author = {{Google Inc.}},
url = {https://flutter.dev/},
urldate = {2024-02-22},
abstract = {Flutter transforms the entire app development process. Build, test, and deploy beautiful mobile, web, desktop, and embedded apps from a single codebase.},
langid = {english},
file = {/Users/fabian/Zotero/storage/FUSDYG34/flutter.dev.html}
}
@online{googleinc.IntroductionDeclarativeUI,
title = {Introduction to Declarative {{UI}}},
author = {{Google Inc.}},
url = {https://docs.flutter.dev/get-started/flutter-for/declarative},
urldate = {2024-02-13},
abstract = {Explains the difference between a declarative and imperative programming style.},
@ -37,6 +160,101 @@
file = {/Users/fabian/Zotero/storage/F6LI3FTY/declarative.html}
}
@book{hajianFlutterEngineering2024,
title = {Flutter Engineering},
author = {Hajian, Majid},
date = {2024-01-18},
publisher = {{Staten House}},
abstract = {Become a Flutter professional using tactics explained from a software engineer's perspective.This book covers various software engineering topics in Flutter and is divided into five parts, each addressing specific areas of interest and expertise.Foundation of Flutter Engineering introduces software engineering concepts specifically relevant to Flutter. It starts by explaining the fundamental principles of Flutter and how they work and then moves on to demonstrate how these concepts can be applied within the Flutter framework. This section also covers coding design patterns that help readers develop a foundational understanding of the subject matter.Architecture: beginning with basic principles and progressing onto different styles and patterns in architectural design. It covers essential concepts such as concurrency, parallelism, dependency injection, and state management. Additionally, this section explores the architectural factors involved in developing offline apps, guiding readers on strategic thinking and decision-making in software architecture.Processes part covers rules and guidelines, continuous delivery and integration, testing methodologies, and effective documentation practices in a comprehensive manner. This section gives readers the knowledge needed to streamline and efficiently develop apps.Ethical Engineering discusses the OWASP Top 10 security risks, privacy standards, and accessibility considerations. The section emphasizes creating inclusive and secure applications that value user privacy.Advancing UI Development explores adaptive and responsive UIs and sophisticated topics like custom painting, shaders, internationalization, localization, and effective theming in Flutter. This section enhances the readers skills in creating visually appealing and user-friendly interfaces.Whether a beginner or an experienced developer, this book can offer you something to learn.},
isbn = {9798889405528},
langid = {Englisch},
pagetotal = {547}
}
@book{heathEmbeddedSystemsDesign2002,
title = {Embedded Systems Design},
author = {Heath, Steve},
date = {2002},
publisher = {{Elsevier}},
isbn = {0-08-047756-9}
}
@online{HowGitObject,
title = {How {{Git}} Object Deduplication Works in {{GitLab}} | {{GitLab}}},
url = {https://docs.gitlab.com/ee/development/git_object_deduplication.html},
urldate = {2024-02-19},
abstract = {GitLab product documentation.},
langid = {american},
file = {/Users/fabian/Zotero/storage/4GAFAAXS/git_object_deduplication.html}
}
@online{IntroductionDeclarativeUIa,
title = {Introduction to Declarative {{UI}}},
url = {https://docs.flutter.dev/get-started/flutter-for/declarative},
urldate = {2024-02-18},
abstract = {Explains the difference between a declarative and imperative programming style.},
langid = {english},
file = {/Users/fabian/Zotero/storage/HRKBSWAK/declarative.html}
}
@letter{itoYoctoTimeZone2018,
type = {E-mail},
title = {[Yocto] Time Zone},
author = {Ito, Takayasu},
year = {Wed Oct 24 17:56:10 PDT 2018},
url = {https://docs.yoctoproject.org/pipermail/yocto/2018-October/042964.html},
urldate = {2024-03-04},
file = {/Users/fabian/Zotero/storage/5RDNK486/042964.html}
}
@article{korogluComparisonKeypadsTouchscreen2015,
title = {Comparison of Keypads and Touch-Screen Mobile Phones/Devices as Potential Risk for Microbial Contamination},
author = {Koroglu, Mehmet and Gunal, Selami and Yildiz, Fatma and Savas, Mehtap and Ozer, Ali and Altindis, Mustafa},
date = {2015-12-30},
journaltitle = {Journal of Infection in Developing Countries},
shortjournal = {J Infect Dev Ctries},
volume = {9},
number = {12},
eprint = {26719936},
eprinttype = {pmid},
pages = {1308--1314},
issn = {1972-2680},
doi = {10.3855/jidc.6171},
abstract = {INTRODUCTION: Touch-screen mobile phones/devices (TMPs/Ds) are increasingly used in hospitals. They may act as a mobile reservoir for microbial pathogens. The rates of microbial contamination of TMPs/Ds and keypad mobile phones (KMPs) with respect to different variables including use by healthcare workers (HCWs)/non-HCWs and the demographic characteristics of users were investigated. METHODOLOGY: A total of 205 mobile phones/devices were screened for microbial contamination: 76 devices belonged to HCWs and 129 devices belonged to the non-HCW group. By rubbing swabs to front screen, back, keypad, and metallic surfaces of devices, 444 samples were collected. RESULTS: Of 205 mobile phones/devices, 143 (97.9\%) of the TMPs/Ds and 58 (98.3\%) of the KMPs were positive for microbial contamination, and there were no significant differences in contamination rates between these groups, although TMPs/Ds had significantly higher microbial load than KMPs (p {$<$}0.05). The significant difference in this analysis was attributable to the screen size of mobile phones ≥ 5". Microbial contamination rates increased significantly as phone size increased (p {$<$}0.05). Higher numbers of coagulase-negative Staphylococci (CNS) were isolated from KMPs than TMPs/Ds (p = 0.049). The incidence of Enterococcus spp. was higher on the KMPs of HCWs, and methicillin resistant CNS was higher from the TMPs/Ds of non-HCWs (p {$<$}0.05). Isolation of CNS, Streptococcus spp. and Escherichia coli was higher from the TMPs/Ds of HCWs (p {$<$}0.05). CONCLUSIONS: We found no significant difference between TMP/Ds and KMPs in terms of microbial contamination, but TMP/Ds harboured more colonies and total microbial counts increased with screen size.},
langid = {english},
keywords = {Adult,Bacteria,Cross-Sectional Studies,Environmental Microbiology,Equipment Contamination,Fungi,Health Personnel,Hospitals,Humans,Male,Middle Aged,Prospective Studies,Telecommunications,Young Adult},
file = {/Users/fabian/Zotero/storage/TFSCZX36/Koroglu et al_2015_Comparison of keypads and touch-screen mobile phones-devices as potential risk.pdf}
}
@book{leeIntroductionEmbeddedSystems2016,
title = {Introduction to Embedded Systems: {{A}} Cyber-Physical Systems Approach},
author = {Lee, Edward Ashford and Seshia, Sanjit Arunkumar},
date = {2016},
publisher = {{MIT press}},
isbn = {0-262-53381-2}
}
@article{leePresentFutureCyberPhysical2015,
title = {The {{Past}}, {{Present}} and {{Future}} of {{Cyber-Physical Systems}}: {{A Focus}} on {{Models}}},
shorttitle = {The {{Past}}, {{Present}} and {{Future}} of {{Cyber-Physical Systems}}},
author = {Lee, Edward A.},
date = {2015-03},
journaltitle = {Sensors},
volume = {15},
number = {3},
pages = {4837--4869},
publisher = {{Multidisciplinary Digital Publishing Institute}},
issn = {1424-8220},
doi = {10.3390/s150304837},
url = {https://www.mdpi.com/1424-8220/15/3/4837},
urldate = {2024-02-15},
abstract = {This paper is about better engineering of cyber-physical systems (CPSs) through better models. Deterministic models have historically proven extremely useful and arguably form the kingpin of the industrial revolution and the digital and information technology revolutions. Key deterministic models that have proven successful include differential equations, synchronous digital logic and single-threaded imperative programs. Cyber-physical systems, however, combine these models in such a way that determinism is not preserved. Two projects show that deterministic CPS models with faithful physical realizations are possible and practical. The first project is PRET, which shows that the timing precision of synchronous digital logic can be practically made available at the software level of abstraction. The second project is Ptides (programming temporally-integrated distributed embedded systems), which shows that deterministic models for distributed cyber-physical systems have practical faithful realizations. These projects are existence proofs that deterministic CPS models are possible and practical.},
issue = {3},
langid = {english},
keywords = {clock synchronization,cyber-physical systems,distributed systems,PRET machines,real-time systems,time synchronization},
file = {/Users/fabian/Zotero/storage/IGCKHF3Y/Lee_2015_The Past, Present and Future of Cyber-Physical Systems.pdf}
}
@online{linuxfoundationYoctoProject162024,
title = {The {{Yocto Project}} ® 4.0.16 Documentation},
author = {{Linux Foundation}},
@ -46,6 +264,62 @@
file = {/Users/fabian/Zotero/storage/WWAQWEK2/singleindex.html}
}
@book{marwedelEmbeddedSystemDesign2021,
title = {Embedded System Design: Embedded Systems Foundations of Cyber-Physical Systems, and the Internet of Things},
author = {Marwedel, Peter},
date = {2021},
publisher = {{Springer Nature}},
isbn = {3-030-60910-3}
}
@article{oszutowska-mazurekAssociationsKnowledgeBehaviours2021,
title = {The {{Associations}} between {{Knowledge}} and {{Behaviours Related}} to {{Touch Screens}} and {{Microbiological Threats}} among {{IT Students}}},
author = {Oszutowska-Mazurek, Dorota and Fastowicz, Jaroslaw and Mazurek, Przemyslaw},
date = {2021-09-02},
journaltitle = {International Journal of Environmental Research and Public Health},
shortjournal = {Int J Environ Res Public Health},
volume = {18},
number = {17},
eprint = {34501860},
eprinttype = {pmid},
pages = {9269},
issn = {1661-7827},
doi = {10.3390/ijerph18179269},
url = {https://www.ncbi.nlm.nih.gov/pmc/articles/PMC8431698/},
urldate = {2024-02-22},
abstract = {Current issue like the COVID19 pandemic show how elementary knowledge and hygiene behaviours are important for ordinary people. Microbiological hazards, not just viruses, can be transmitted in various ways through touch screens. For ordinary users, there is a wide range of behaviours that affect the ability to transfer microbial hazards (viruses, bacteria and fungi). The purpose of the paper is to analyse the association between knowledge and behaviour of touch screen users based on surveys. This paper presents selected results of a survey conducted at the end of 2019 (preCOVID19 survey). The survey was conducted on a group of 172 IT school students. The relationship between responses using a 2D linear model regression and clustering is used. Most respondents believe that bacteria were more common than viruses on touch screens. The respondents declare altruism in terms of a greater willingness to lend their smartphone, rather than to use someone elses. An interesting result is that respondents often lend their smartphone to others, while being aware that viruses or bacteria are present on the touch screens. The results can be used in terms of changes in the education process of smartphone users in relation to microbiological hazards.},
pmcid = {PMC8431698},
file = {/Users/fabian/Zotero/storage/4GH3EW8M/Oszutowska-Mazurek et al_2021_The Associations between Knowledge and Behaviours Related to Touch Screens and.pdf}
}
@article{palKeypadMobilePhones2013,
title = {Keypad Mobile Phones Are Associated with a Significant Increased Risk of Microbial Contamination Compared to Touch Screen Phones},
author = {Pal, Pallavi and Roy, Ashoke and Moore, Ginny and Muzslay, Monika and Lee, Elaine and Alder, Sarah and Wilson, Peter and Powles, Tom and Wilson, Peter and Kelly, John},
date = {2013-03-01},
journaltitle = {Journal of Infection Prevention},
shortjournal = {Journal of Infection Prevention},
volume = {14},
number = {2},
pages = {65--68},
publisher = {{SAGE Publications}},
issn = {1757-1774},
doi = {10.1177/1757177413475903},
url = {https://doi.org/10.1177/1757177413475903},
urldate = {2024-02-22},
abstract = {The use of mobile phones in the clinical environment by healthcare workers has become widespread. Despite evidence that these devices can harbour pathogenic micro-organisms there is little guidance on how to reduce contamination. Recently touchscreen phones with a single flat surface have been introduced. We hypothesise that bacterial contamination of phones used in hospitals will be lower on touchscreen devices compared to keypad devices. Sixty seven mobile phones belonging to health care workers were sampled. The median colony count for touchscreen phones and keypad devices was 0·09 colony forming units (cfu)/cm2 (interquartile range (IQR) 0.050·14) and 0·77 cfu/cm2 (IQR range 0·453.52) respectively. Colony counts were significantly higher on the keypad phones (Fishers exact test p{$<$}0.001). Multivariate analysis showed the type of phone (keypad vs. touch screen) was associated with increased colony counts (F-statistic 14.13: p{$<$}0.001). Overall, nine (13\%) phones grew either meticillin resistant Staphylococcus aureus or vancomycin resistant enterococci. Eight (24\%) keypad phones were contaminated with these organisms compared with one touch screen phone (3\%). Our data indicate that touchscreen mobile phones are less contaminated than their keypad counterparts, and they are less likely to harbour pathogenic bacteria in the clinical setting.},
langid = {english},
file = {/Users/fabian/Zotero/storage/44QLMR8K/Pal et al_2013_Keypad mobile phones are associated with a significant increased risk of.pdf}
}
@online{Puro,
title = {Puro},
url = {https://puro.dev/},
urldate = {2024-02-20},
abstract = {A comments widget built on GitHub Discussions.},
langid = {english},
file = {/Users/fabian/Zotero/storage/GEQ4Q3EP/widget.html}
}
@online{ReactiveManifesto,
title = {The {{Reactive Manifesto}}},
url = {https://www.reactivemanifesto.org/},
@ -53,6 +327,32 @@
file = {/Users/fabian/Zotero/storage/FJSMEDYJ/www.reactivemanifesto.org.html}
}
@online{ReleaseV0Rev,
title = {Release v0.0.6: {{Rev}} Alpha Branch Version to 0.0.6, Flutter 0.0.26 (\#10010) · Flutter/Flutter},
shorttitle = {Release v0.0.6},
url = {https://github.com/flutter/flutter/releases/tag/v0.0.6},
urldate = {2024-02-18},
abstract = {VERSION: 0.0.6 flutter: 0.0.26 flutter\_driver: 0.0.4 flutter\_test: 0.0.4},
langid = {english},
organization = {{GitHub}},
file = {/Users/fabian/Zotero/storage/DJJMSGJK/v0.0.html}
}
@online{richardstallmanWhyGNULinux,
title = {Why {{GNU}}/{{Linux}}?},
author = {{Richard Stallman}},
url = {https://www.gnu.org/gnu/why-gnu-linux.en.html},
urldate = {2024-02-19},
file = {/Users/fabian/Zotero/storage/4YEIHLEH/why-gnu-linux.en.html}
}
@online{RpifirmwareAddFirmware,
title = {Rpi-Firmware: Add Firmware for Zero 2w by Classabbyamp · {{Pull Request}} \#39123 · Void-Linux/Void-Packages},
url = {https://github.com/void-linux/void-packages/pull/39123},
urldate = {2024-02-23},
file = {/Users/fabian/Zotero/storage/QWUKGL4U/39123.html}
}
@online{Skia,
title = {Skia},
url = {https://skia.org/},
@ -63,6 +363,17 @@
file = {/Users/fabian/Zotero/storage/NV4BSHXY/skia.org.html}
}
@online{theflutterauthorsEngineShellPlatform,
title = {Engine/Shell/Platform/Embedder/Embedder.h at 436f9707b94774d1d049c04b8cda9d81d85aa4a8 · Flutter/Engine},
author = {{The Flutter Authors}},
url = {https://github.com/flutter/engine/blob/436f9707b94774d1d049c04b8cda9d81d85aa4a8/shell/platform/embedder/embedder.h},
urldate = {2024-02-22},
abstract = {The Flutter engine. Contribute to flutter/engine development by creating an account on GitHub.},
langid = {english},
organization = {{GitHub}},
file = {/Users/fabian/Zotero/storage/SQZ53EIM/embedder.html}
}
@video{theflutterwayFlutterRubberDuck2022,
entrysubtype = {video},
title = {Before {{Flutter}} | {{Rubber Duck Engineering}} | {{Episode}} \#100},
@ -74,6 +385,19 @@
abstract = {Tonight we'll talk about the years leading up to Flutter and how Adam and I worked on a variety of projects for the web which inspired what Flutter would become, including at least 3 frameworks in JS, how we briefly thought "shake to reload" was our killer feature, how for more than the first 6 months of the project Flutter was DOM-based and network loaded and much more. Gonna be amazing. Slides: https://docs.google.com/presentation/...}
}
@online{valleyWhatLinuxOverview2020,
title = {What {{Is Linux}}: {{An Overview}} of the {{Linux Operating System}}},
shorttitle = {What {{Is Linux}}},
author = {family=valley, given=The, prefix=info, useprefix=false},
date = {2020-04-11T14:46:55},
url = {https://medium.com/@theinfovalley097/what-is-linux-an-overview-of-the-linux-operating-system-77bc7421c7e5},
urldate = {2024-02-19},
abstract = {What is Linux: An Overview of the Linux Operating System},
langid = {english},
organization = {{Medium}},
file = {/Users/fabian/Zotero/storage/L97SMPU5/what-is-linux-an-overview-of-the-linux-operating-system-77bc7421c7e5.html}
}
@article{weiserComputer21stCentury1999,
title = {The Computer for the 21st Century},
author = {Weiser, Mark},
@ -91,6 +415,13 @@
file = {/Users/fabian/Zotero/storage/8CCSE83J/Weiser - 1999 - The computer for the 21st century.pdf}
}
@online{WhatWouldYou,
title = {What Would You like to See Most in Minix?},
url = {https://groups.google.com/g/comp.os.minix/c/dlNtH7RRrGA/m/SwRavCzVE7gJ},
urldate = {2024-02-19},
file = {/Users/fabian/Zotero/storage/6TCWJW3N/SwRavCzVE7gJ.html}
}
@online{WorkingJSONFlutter2021,
title = {Working with {{JSON}} in {{Flutter While Using}} Json\_annotations and Json\_serializable {{Modules}} in 2022 | {{John Maeda}}s {{Blog}}},
date = {2021-06-22},
@ -101,3 +432,9 @@
organization = {{https://maeda.pm/}},
file = {/Users/fabian/Zotero/storage/ND8L5RU6/working-with-json-in-flutter-while-using-json_annotations-and-json_serializable-modules-in-2022.html}
}
@online{zotero-649,
url = {https://tagesschau.api.bund.dev/openapi.yaml},
urldate = {2024-03-03},
file = {/Users/fabian/Zotero/storage/MBRFKF6W/openapi.html}
}

View File

@ -1,6 +1,4 @@
SHELL:=/bin/bash
MARKDOWN_FILES := $(shell find chapters -type f -name "*.md" | sort | tr '\n' ' ')
BACHELOR_TEXT := @cat $(MARKDOWN_FILES)
export MERMAID_FILTER_FORMAT:=pdf
all: local
@ -11,11 +9,15 @@ help:
dir:
mkdir -p out
tmp:
cat $$(find chapters -type f -name "*.md" | sort) | grep -vw '<!-- prettier-ignore -->' > /tmp/bachelor-build
bachelor: @cat $(MARKDOWN_FILES)
local: dir
local: dir tmp
@echo "Building paper"
MERMAID_FILTER_FORMAT=pdf pandoc -V colorlinks=true -V linkcolor=black -V urlcolor=black -f 'markdown+autolink_bare_uris' --pdf-engine=lualatex --pdf-engine-opt=-shell-escape --filter mermaid-filter --lua-filter columns.lua --citeproc -s $(MARKDOWN_FILES) -o ./out/bachelor.pdf -V lang=de-DE -V fontsize=11pt --highlight-style tango --reference-links --bibliography Bachelor.bib --csl=harvard-right.csl -M lang:de --number-sections
pandoc -f markdown+implicit_figures --strip-comments --listings -V colorlinks=true -V linkcolor=black -V urlcolor=black -f 'markdown+autolink_bare_uris' --pdf-engine=lualatex --pdf-engine-opt=-shell-escape --filter mermaid-filter --filter py-pandoc-include-code --lua-filter columns.lua --citeproc -s /tmp/bachelor-build -o ./out/bachelor.pdf -V lang=de-DE -V fontsize=12pt --reference-links --bibliography Bachelor.bib --csl=harvard-right.csl -M lang:de --number-sections -Vindent=false
clean:
rm -rf out

3
README.md Normal file
View File

@ -0,0 +1,3 @@
# Flutter als Entwicklungsplattform für eingebettete Linux Systeme
## Eine Fallstudie

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

BIN
assets/mermaid/Caption.pdf Normal file

Binary file not shown.

BIN
assets/mermaid/Caption.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

BIN
chapters/.DS_Store vendored

Binary file not shown.

View File

@ -1,55 +1,57 @@
---
header-includes: |
\usepackage[T1]{fontenc}
\usepackage[usefilenames,RMstyle={Text,Semibold},SSstyle={Text,Semibold},TTstyle={Text,Semibold},DefaultFeatures={Ligatures=Common}]{plex-otf}
\usepackage[a4paper,bindingoffset=0.2in,%
left=4cm,right=2cm,top=2cm,bottom=2cm,%
footskip=.25in]{geometry}
\usepackage{fancyhdr}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\usetikzlibrary{snakes,arrows,shapes}
\usepackage{amsmath}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\pgfplotsset{compat=1.8}
\usepackage{multicol,lipsum}
\usepackage{listings}
\usepackage{wrapfig}
\usepackage[font=small,labelfont=bf]{caption}
\usepackage{graphicx}
\usepackage{xcolor,stackengine}
\usepackage{colortbl}
\usepackage{tcolorbox}
\usepackage{lastpage}
\usepackage{subcaption}
\usepackage{tabularx}
\usepackage{biblatex}
\usepackage{float}
\usepackage{refract}
\usepackage{svg}
\usepackage{setspace}
\usepackage{titling}
\usepackage[T1]{fontenc}
\usepackage[a4paper,bindingoffset=0in,left=4cm,right=2cm,top=2cm,bottom=2cm,footskip=.25in]{geometry}
\usepackage{fancyhdr}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\usetikzlibrary{snakes,arrows,shapes}
\usepackage{amsmath}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\pgfplotsset{compat=1.8}
\usepackage{multicol,lipsum}
\usepackage{listings}
\usepackage{wrapfig}
\usepackage[font=small,labelfont=bf,tableposition=top, position=above]{caption}
\usepackage{graphicx}
\usepackage{xcolor,stackengine}
\usepackage{colortbl}
\usepackage{tcolorbox}
\usepackage{lastpage}
\usepackage{subcaption}
\usepackage{tabularx}
\usepackage{biblatex}
\usepackage{float}
\usepackage{refract}
\usepackage{svg}
\usepackage{setspace}
\usepackage{titling}
\usepackage{abstract}
\usepackage{fvextra}
\usepackage{emoji}
\usepackage{fontspec}
\usepackage{dirtree}
\usepackage{etoolbox}
\setmainfont{Times New Roman}
\DefineVerbatimEnvironment{Highlighting}{Verbatim}{breaklines,commandchars=\\\{\}}
\newcommand{\hideFromPandoc}[1]{#1}
\hideFromPandoc{
\let\Begin\begin
\let\End\end
}
\makeatletter
\def\fps@figure{h}
\makeatother
nocite: |
@*
\newcommand{\hideFromPandoc}[1]{#1}
\hideFromPandoc{
\let\Begin\begin
\let\End\end
}
\makeatletter
\def\fps@figure{h}
\makeatother
---
\captionsetup[figure]{position=above}
\setstretch{1.5}
\setemojifont{Twemoji Mozilla}
\renewcommand{\familydefault}{\sfdefault}
<!-- \renewcommand{\familydefault}{\sfdefault} -->
\graphicspath{ {./img/} }
@ -59,6 +61,8 @@ nocite: |
\renewcommand{\comment}[1]{\hspace{2em}{\small\textit{#1}}\bigskip\par}
\renewcommand{\lstlistingname}{Auflistung}
\newcommand\palbox[1]{{\sffamily\fboxsep=5pt\relax\fboxrule=1pt\relax\footnotesize%
\fcolorbox{gray!50}{gray!10}{%
\stackengine{4pt}{%
@ -77,3 +81,8 @@ frame=single,
breaklines=true,
postbreak=\mbox{\textcolor{red}{$\hookrightarrow$}\space},
}
\apptocmd{\dirtree}{\bigskip}{}{}
\pretocmd{\dirtree}{\bigskip}{}{}
\newcommand{\mkbibnodate}{n\adddot d\adddot}

View File

@ -0,0 +1,31 @@
\definecolor{codegreen}{rgb}{0,0.6,0}
\definecolor{codegray}{rgb}{0.5,0.5,0.5}
\definecolor{codepurple}{rgb}{0.58,0,0.82}
\definecolor{backcolour}{rgb}{0.95, 0.95, 0.96}
\lstset{
backgroundcolor=\color{backcolour},
commentstyle=\color{codegreen},
keywordstyle=\color{magenta},
numberstyle=\tiny\color{codegray},
stringstyle=\color{codepurple},
basicstyle=\ttfamily\footnotesize,
breakatwhitespace=false,
breaklines=true,
captionpos=b,
keepspaces=true,
numbers=left,
numbersep=5pt,
showspaces=false,
showstringspaces=false,
showtabs=false,
tabsize=2,
morestring=\*[d]{"}
}
\lstset{
emph=[1]{var, String, int, List, void, Future, await, if, else, throw, async, true, false},
emphstyle=[1]{\color{codepurple}},
emph=[2]{findAllElements,findElements, setState, send, fromPath, add, parse, bytesToString},
emphstyle=[2]{\color{magenta}}
}

View File

@ -2,31 +2,39 @@
\begin{titlepage}
\begin{center}
\Large Hochschule Rhein-Waal \\
\vspace{2.5cm}
\Large Proposal für die Bachelorarbeit \\
\vspace{2.5cm}
\huge \textbf{\textsc{Flutter als Entwicklungsplattform für eingebettete Linux Systeme: eine Fallstudie}} \\
\vspace{1.0cm}
\Large Fabian Baldeau \\
\vspace{2.5cm}
\vspace{0.25cm}
\textsc{Studiengang}\\
\vspace{0.25cm}
\textsc{Medieninformatik}\\
\vspace{2.5cm}
\textsc{Gutachter}\\
\vspace{0.25cm}
\textsc{Prof. Dr.-Ing. Ido Iurgel}\\
\vspace{0.25cm}
\textsc{Prof. Dr. Kai Essig}\\
Hochschule Rhein-Waal \\
Fakultät Kommunikation und Umwelt \\
Prof Dr.-Ing. Ido Iurgel \\
Prof Dr. Kai Essig \\
\vspace{3cm}
\Large \textbf{\textsc{Flutter als Entwicklungsplattform für eingebettete Linux Systeme: eine Fallstudie}} \\
\vspace{2.0cm}
\normalsize Bachelorarbeit \\
im Studiengang \\
Medieninformatik \\
Zur Erlangung des akademischen Grades \\
\vspace{2.0cm}
Bachelor of Science \\
\vspace{2.0cm}
vorgelegt von\\
Fabian Baldeau \\
\vspace{1.5cm}
Matrikelnummer: \\
27516 \\
\vspace{1.5cm}
Abgabedatum: \\
xx. xxxx 2024 \\
\vspace{2cm}
\end{center}
\end{titlepage}
\pagenumbering{Roman}
\pagenumbering{roman}
\fancyhf{}
\fancyhead[C]{\thepage}
<!-- \fancyhead[C]{\thepage} -->
\fancyhead[C]{}
\fancyfoot[R]{\thepage}
\renewcommand{\headrulewidth}{0pt}
\pagestyle{fancy}

View File

@ -0,0 +1,27 @@
\addtocounter{page}{1}
\begin{abstract}
Die Integration von Flutter's plattformübergreifenden
UI-Fähigkeiten mit der Anpassungsfähigkeit von Embedded
Linux verspricht die Rationalisierung der Entwicklung
von Benutzeroberflächen (UIs) für eingebettete Systeme.
Diese Arbeit untersucht die Eignung von Flutter in
diesem Kontext durch eine Fallstudie: die Entwicklung
eines Flutter App Prototyps auf einem Raspberry
Pi mit einer angepassten eingebetteten Linux Distribution.
Leistungsmesswerte, Benutzerfreundlichkeit und der
Entwicklungsprozess werden bewertet. Die Ergebnisse
zeigen, dass Flutter, wenn es angepasst wird,
erfolgreich zur Erstellung von attraktiven und benutzerfreundlichen
eingebetteten Schnittstellen mit wenigen Kompromissen
bei der Leistung genutzt werden kann.
Die Arbeit beschäftigt sich im Wesentlichen mit der Entwicklung einer
prototypischen Anwendung mit Flutter für ein eingebettetes Linux System.
Dabei wurde ein Konzept ausgearbeitet werden, dass zeigt wie Flutter in
eingebetteten Linux Systemen genutzt werden kann und es wurde anhand der
prototypischen Anwendung untersucht, wie gut Flutter für diesen
Verwendungszweck geeignet ist. Die Ergebnisse der Untersuchung
zeigen ein großes Potential für die Nutzung von Flutter in eingebetteten
Linux Systemen.
\end{abstract}

View File

@ -1,6 +1,16 @@
\pagebreak
\tableofcontents
\pagebreak
\listoffigures
\pagebreak
\renewcommand\lstlistlistingname{Auflistungsverzeichnis}
\lstlistoflistings
\pagebreak
<!-- \fzframelinU{
\centering
\Huge{Kurz-Exposé} \\

View File

@ -1 +1,72 @@
<!--In der heutigen Zeit verbringen Menschen in der Regel mehr Zeit damit, über einen Bildschirm mit Maschinen zu interagieren, anstatt Maschinen mechanisch zu steuern. Dieser Trend lässt sich gut bei der Automobilindustrie oder an Haushaltsgeräten beobachten, wo immer mehr Funktionen über einen Touchscreen mit einer grafischen Benutzeroberfläche (GUI) angesteuert werden. Über die GUI können Benutzer Funktionen wie Musik, Radio, Telefon, Temperaturregelung und mehr ansteuern. Ebenso kann die Öffentlichkeit am Flughafen oder in Restaurants über einen Selbstbedienungskiosk mit Unternehmen kommunizieren. Der Kiosk führt eine GUI auf einem Anzeigegerät aus und über den Touchscreen des Kiosks können Maschinen die Kundenwünsche erfüllen.-->
<!--Zusammenfassend lässt sich sagen, dass es in der Industrie einen zunehmenden Trend gibt, dass der Endverbraucher auf bequeme und effiziente Weise mit GUIs interagiert, um Aufgaben zu erledigen.-->
# Einleitung
## Motivation
Die Entwicklung moderner und ansprechender Benutzeroberflächen (GUIs) für eingebettete
Linux-Systeme ist eine Herausforderung. Herkömmliche GUI-Toolkits stoßen häufig an
ihre Grenzen, wenn es um die Erfüllung der Anforderungen an Leistung,
plattformübergreifende Kompatibilität und Design geht. Flutter [@googleinc.FutterBuildAny],
ein quelloffenes Benutzerschnittstellen-Entwicklungs-Kit von Google,
stellt eine vielversprechende Alternative dar. Es zeichnet sich durch native Kompilierung
für hohe Performance und geringen Ressourcenverbrauch, eine flexible Architektur,
die an verschiedene Plattformen angepasst werden kann, und seinen Fokus auf moderne
und intuitive Benutzeroberflächen aus.
## Relevanz
In dieser Arbeit wird der Einsatz von Flutter für die Entwicklung von GUIs für
eingebettete Linux-Systeme untersucht. Die Arbeit leistet einen wichtigen Beitrag
zu diesem Forschungsbereich, indem sie:
- die Leistungsmerkmale von Flutter auf eingebetteter Hardware detailliert untersucht
und wertvolle Hinweise für die Auswahl des richtigen Toolkits liefert.
- den Entwicklungsprozess detailliert beschreibt und Herausforderungen sowie
bewährte Praktiken bei der Verwendung von Flutter in einem eingebetteten Linux-Kontext aufzeigt.
- eine reale eingebettete GUI mit Flutter implementiert und dabei die Fähigkeiten und
potenziellen Anwendungsfälle des Toolkits hervorhebt.
Die Ergebnisse dieser Arbeit sind relevant für Entwickler
im Bereich eingebetteter Systeme, die moderne,
performante und ansprechende GUIs für Linux-basierte Geräte entwickeln möchten.
## Zielsetzung
Ziel der Arbeit ist es, die Potenziale und Herausforderungen von
Flutter im Bereich der GUI-Entwicklung für eingebettete Linux-Systeme
zu beleuchten und Entwicklern wertvolle Hinweise für die Auswahl des
richtigen Toolkits zu liefern.
## Problemstellung
Beantwortet werden soll die Frage, inwieweit sich Flutter für die Entwicklung von GUIs
für eingebettete Linux-Systeme eignet. Dazu wird in dieser Arbeit geklärt:
Wie einfach und effizient ist die Entwicklung und Wartung von GUIs mit Flutter?
Welche Auswirkungen hat Flutter auf die Performance und den Ressourcenverbrauch im
eingebetteten Kontext? Wie hoch ist der Lernaufwand für Entwickler? Welche Community
und Support-Ressourcen stehen für Flutter-Entwickler zur Verfügung? Um diese Fragen
zu beantworten wird die folgende Methodik angewendet.
## Methodik
Um die Forschungsfrage zu beantworten, wird eine Literaturrecherche,
eine experimentelle Untersuchung und eine Auswertung der Untersuchung durchgeführt.
In der Literaturrecherche werden aktuelle wissenschaftliche Quellen zu GUI-Entwicklung
für eingebettete Systeme und Flutter ausgewertet. Die experimentelle Untersuchung
umfasst die Implementierung einer realen eingebetteten GUI mit Flutter und die
Bewertung der Performance, des Ressourcenverbrauchs und der Benutzerfreundlichkeit
der GUI. Die Ergebnisse der Literaturrecherche und der experimentellen Untersuchung
werden in einem Bewertungsschema zusammengefasst und abschließend bewertet. Basierend
auf den Ergebnissen wird ein Leitfaden für die Entwicklung von GUIs für eingebettete
Linux-Systeme mit Flutter erstellt.
## Struktur der Arbeit
Zu ergänzen wenn Arbeit fertig ist...
## Problematik
Zu ergänzen falls nötig...

View File

@ -0,0 +1,12 @@
<!-- test -->
<!-- ## Ziel der Arbeit
Die Arbeit beschäftigt sich im Wesentlichen mit der Entwicklung einer
prototypischen Anwendung mit Flutter für ein eingebettetes Linux System.
Dabei soll ein Konzept ausgearbeitet werden, dass zeigt wie Flutter in
eingebetteten Linux Systemen genutzt werden kann und es soll anhand der
prototypischen Anwendung untersucht werden, wie gut Flutter für diesen
Verwendungszweck geeignet ist. Die Ergebnisse der Untersuchung sollen
dann genutzt werden um Empfehlungen für die Nutzung von Flutter in
eingebetteten Linux Systemen abzuleiten. -->

View File

@ -1,18 +0,0 @@
<!--
Challenges with Direct Statistics
No Centralized Reporting:
Unlike mobile OS usage (Android vs. iOS), there's no unified app store
or market survey specifically for embedded Linux UIs. Projects range
from hobbyist work to closed-source industrial systems, making data
collection highly fragmented.
Embedded Development Diversity:
The range of devices running embedded Linux is immense, varying greatly
in purpose and visibility. This creates a large sample space thats
hard to track systematically.
Subjectivity in Definition:
What constitutes "most used" gets tricky. Is it by volume of devices
regardless of scale, or by developer preferences in recent projects?
-->

View File

@ -0,0 +1,172 @@
<!--
Challenges with Direct Statistics
No Centralized Reporting:
Unlike mobile OS usage (Android vs. iOS), there's no unified app store
or market survey specifically for embedded Linux UIs. Projects range
from hobbyist work to closed-source industrial systems, making data
collection highly fragmented.
Embedded Development Diversity:
The range of devices running embedded Linux is immense, varying greatly
in purpose and visibility. This creates a large sample space thats
hard to track systematically.
Subjectivity in Definition:
What constitutes "most used" gets tricky. Is it by volume of devices
regardless of scale, or by developer preferences in recent projects?
-->
\pagebreak
# Grundlagen
## Eingebettete Systeme
Traditionelle Ansichten über Computer beschreiben sie oft als
eigenständige Geräte wie Desktops oder Laptops. Im Gegensatz dazu
skizzierte Mark Weiser in seinem einflussreichen Paper
"The Computer of the 21st Century" 1999 eine Vision des "Ubiquitous Computing". [@weiserComputer21stCentury1999]
Diese Vision beschreibt eine Welt, in der nahtlos integrierte Geräte in unserem
Leben "verschwinden". Eingebettete Systeme verkörpern heute diese Philosophie.
Sie sind keine Allzweckcomputer, sondern spezialisierte Computer, die
in Geräten und Systemen eingebettet sind. Sie sind in der Regel auf eine
spezielle Aufgabe oder Funktion zugeschnitten und sind oft in
Geräten des täglichen Lebens zu finden.
Beispiele für eingebettete Systeme finden sich in allen Lebensbereichen:
- **Automobilindustrie**: Infotainment System
- **Industrie**: Automatisierungssysteme, Steuerung von Maschinen
- **Medizintechnik**: Medizinische Geräte, Diagnosegeräte
- **Haushaltsgeräte**: Waschmaschinen, Kühlschränke
- **Consumer Electronics**: Smartphones, Smartwatches
Eingebettete Systeme sind oft auf Echtzeitfähigkeit, Energieeffizienz
und Zuverlässigkeit ausgelegt. Sie sind in der Regel nicht so leistungsfähig
wie Desktop- oder Server-Computer, aber sie sind in der Lage, spezialisierte
Aufgaben zu erfüllen.
Auch Experten fällt eine klare Definition von eingebetteten Systemen
in der heutigen Zeit nicht leicht, wie auch Jack Ganssle, ein
Experte für eingebettete Systeme mit über 30 Jahre Berufserfahrung,
in einem Blog Beitrag schreibt. [@ganssleWhatEmbedded2008]
So konnte man laut Ganssle früher Systeme, die mit einem Mikrocontroller oder
Mikroprozessor ausgestattet sind und in einem Gerät eingebettet sind,
klar als eingebettete Systeme bezeichnen.
Doch heutzutage werden oft auch Systeme, die mit einem vollwertigen
Betriebssystem ausgestattet sind, als eingebettete Systeme bezeichnet.
Dazu gehört das Linux Betriebssystem, welches in vielen eingebetteten
Systemen zum Einsatz kommt und auch Windows ist laut Ganssle in
eingebetteten Systemen anzutreffen. Als weiteres Beispiel dazu
nennt er das Handy, welches als es nur zum telefonieren genutzt wurde
klar als eingebettetes System bezeichnet werden konnte, doch heutzutage
ist es ein vollwertiger Computer, der auch als solcher
für eine Vielzahl von anderen Funktionen genutzt werden kann.
\pagebreak
In weiterer Literatur zu eingebetteten Systemen finden sich
die folgenden Definitionen:
> "An embedded system is a microprocessor based system that is
> built to control a function or a range of functions." [@heathEmbeddedSystemsDesign2002]
> "Embedded systems are information processing systems embedded into enclosing products."
> [@marwedelEmbeddedSystemDesign2021]
Auch aus diesen Definitionen geht hervor, dass die Definition von eingebetteten
Systemen nicht eindeutig ist. Da es sowohl eine Funktion oder eine Reihe von
Funktionen steuern kann, als auch speziell ein System ist, das in ein Produkt
eingebettet ist.
Ein eingebettetes System ist also meistens ein Computersystem, das spezialisiert
ist auf eine bestimmte Funktion oder Aufgabe. Mittlerweile heißt das jedoch auch,
dass es sich oft um Systeme handelt, welche eigentlich vollwertige Computer sind und
daher viele Funktionen ausführen könnten, doch der Hersteller oder Entwickler das
System auf gezielte Funktionen beschränkt. So würde ein Bankautomat mit eingebetteten Linux
nur auf die speziellen Aufgaben beschränkt werden, welche ein Bankautomat zu erfüllen hat, obwohl er
eigentlich ein vollwertiger Computer sein könnte und viele weitere Funktionen ausführen könnte.
Besonders bei eingebetteten Systemen mit Touchscreens könnte eine schier unendliche Anzahl von
Funktionen auf dem Display angezeigt und angesteuert werden. Daher kommt die Definition
eines eingebetteten Systems auch auf die Definition des Systems vom Hersteller oder Entwickler an.
<!-- Ein weiterer Name für eingebettete Systeme is "Cyber-Physical Systems" (CPS).
Mit der zunehmenden Verbreitung von eingebetteten Systemen in einer
Vielzahl von Geräten und der steigenden Netzwerkkonnektivität verschmelzen
rechnerische und physikalische Prozesse immer enger miteinander. Im Jahr
2006 prägte Helen Gill von der National Science Foundation den Begriff
"Cyber-Physical Systems" (CPS), um diesen Paradigmenwechsel zu beschreiben. -->
## Linux
Linux ist die Bezeichnung für ein freies und quelloffenes Betriebssystem,
das auf dem Linux-Kernel und dem GNU-Betriebssystem basiert. Hinter der
Bezeichnung GNU steht das GNU-Projekt, das 1983 von Richard Stallman
ins Leben gerufen wurde. Das GNU-Projekt hat das Ziel, ein vollständig
freies Betriebssystem zu entwickeln, das auf freier Software basiert.
Im allgemeinen Sprachgebrauch wird Linux oft als Bezeichnung für das
gesamte Betriebssystem genutzt, obwohl es sich eigentlich um das
Betriebssystem GNU/Linux handelt. Richard Stallman, der Gründer des
GNU-Projekts und der Free Software Foundation, erläutert in einem
Blog-Beitrag, dass es wichtig wäre, GNU zu erwähnen, da es viele
der Kernkomponenten des Betriebssystems zusammen mit dem Linux-Kernel
bildet und dass die Bezeichnung GNU/Linux diesen wichtigen Beitrag
anerkennt. Zudem würde es dabei helfen, die Idee des GNU-Projekts
und der Free Software Foundation zu verbreiten. [@richardstallmanWhyGNULinux]
In der Arbeit wird die Bezeichnung "Linux" für das Betriebssystem
verwendet, da es sich um die allgemein gebräuchliche Bezeichnung
handelt und die Bezeichnung "GNU/Linux" in der Literatur und im
allgemeinen Sprachgebrauch nicht so verbreitet ist. Besonders im
eingebetteten Bereich wird es allgemein als "Eingebettetes Linux"
bezeichnet und nicht als "Eingebettetes GNU/Linux".
Linux gehört zu den weltweit am weitesten verbreiteten Betriebssystemen
und zählt zur Gruppe von "unixoide" oder unix-ähnlichen Betriebssystemen,
da es Konzepte des 1969 von Bell Laboratories entwickelten Betriebssystems
Unix aufgreift.
Nutzer von Linux verwendet oft eine sogenannte "Distribution" von Linux
wie Ubuntu. Eine Linux-Distribution, auch als Distro bezeichnet, ist ein vollständiges
Betriebssystem, das auf dem Linux-Kernel aufbaut. Der Kernel ist das
Herzstück des Betriebssystems. Zusätzlich zum Kernel gibt es weitere
wichtige Bestandteile einer Distro, wie Systembibliotheken, Dienstprogramme
und Softwareanwendungen. Die Auswahl dieser wird vom Ersteller der Distro
getroffen. Distros gibt es in vielen Varianten, jede mit ihren eigenen
Zielen, Zielgruppen und Softwareauswahl. Das bedeutet, dass es für viele
verschiedene Anwendungsfälle eine passende Distro gibt. [@dikkyryanpratamaWhatLinuxDistribution]
### Eingebettetes Linux
Unter eingebetteten Linux versteht man die Nutzung des
Linux-Betriebssystems im Umfeld eingebetteter Systeme. Der
einzige wesentliche Unterschied zu dem normalen Linux-Betriebssystem
ist dabei, dass das System auf die speziellen Anforderungen
eingebetteter Systeme zugeschnitten ist und vor allem
sparsamer mit den Ressourcen umgeht. Es hält jedoch nichts davon ab,
jede Art von Linux-Distribution auf einem eingebetteten System zu
installieren und als "eingebettetes Linux" zu betreiben. Um jedoch
das volle Potenzial eines eingebetteten Systems auszuschöpfen, ist
es ratsam, eine speziell für eingebettete Systeme entwickelte
Linux-Distribution zu verwenden. Yocto ist ein Projekt mit
dem eine solche spezielle Distribution für eingebettete Systeme
erstellt werden kann.
### Das Yocto Projekt
Yocto ist ein Open-Source-Projekt der Linux Foundation, das es ermöglicht,
maßgeschneiderte Linux-Distributionen für eingebettete Systeme
zu erstellen. Es bietet hierzu eine Sammlung von Tools, Vorlagen und
Methoden, die vor allem auf die Prinzipien der quellbasierten
Linux-Distribution Gentoo basieren. Eine quellbasierte Distribution
ist eine Linux-Distribution, die aus den Quellcodes der Software
zusammengestellt wird. Das bedeutet, dass die Software auf dem
Zielgerät aus den Quellcodes kompiliert wird und nicht aus
vorkompilierten Binärdateien installiert wird. Dies ermöglicht
eine hohe Flexibilität und Anpassbarkeit der Distribution und
Software. Yocto erweitert dieses Prinzip speziell auf eingebettete
Systeme. Es ist keine fertige Distribution, sondern ein Framework,
mit dem eigene Distributionen speziell für eingebettete Systeme erstellt werden können.
[@linuxfoundationYoctoProject162024]

View File

@ -0,0 +1,127 @@
<!-- TODO: Was ist Flutter? -->
<!-- - Provide a focused overview of Flutter's architecture (widgets, rendering engine, Dart).
- Discuss reasons why Flutter is gaining interest for non-mobile applications -->
## Flutter
Flutter ist ein von Google entwickeltes
quelloffenes Benutzerschnittstellen-Entwicklungs-Kit,
welches die effiziente Entwicklung ansprechender
Benutzeroberflächen für mobile, Web- und
Desktop-Anwendungen ermöglichen soll. Es wurde
2017 von Google veröffentlicht und ist
BSD-lizenziert [@3ClauseBSDLicense2011].
Die zunehmende Verbreitung mobiler Geräte und Betriebssysteme
stellt die effiziente Anwendungsentwicklung vor Herausforderungen.
Plattformübergreifende Frameworks wie Flutter zielen darauf ab,
diese Herausforderungen zu mildern, indem sie ein einheitliches
Toolset zum Erstellen von Benutzeroberflächen (GUIs) bereitstellen,
die nahtlos über verschiedene Plattformen hinweg funktionieren.
Dieses Kapitel befasst sich mit der grundlegenden Architektur
von Flutter.
### Flutters Architektur
Flutter verwendet eine modulare, geschichtete Architektur. Dieses
Design besteht aus unabhängigen Bibliotheken, die jeweils von der
darunter liegenden Schicht abhängig sind, was lose Kopplung und
Flexibilität gewährleistet. Dieser Ansatz fördert die Anpassbarkeit
und die Möglichkeit, Framework-Komponenten nach Bedarf zu ersetzen. [@FlutterArchitecturalOverviewb]
Die folgende Abbildung \ref{flutterArch} zeigt die Architektur von Flutter:
\pagebreak
```{=latex}
\begin{figure}[ht]
\centering
\caption{Flutter Architektur}
\includegraphics[width=9cm]{assets/flutter/archdiagram.png}
\label{flutterArch}
<!-- prettier-ignore -->
\caption*{
```
Quelle: @FlutterArchitecturalOverviewb
```{=latex}
}
\end{figure}
```
Das Kernelement von Flutter ist die Engine, die in C/C++ geschrieben
ist. Sie ist für das Rastern zusammengesetzter Szenen verantwortlich,
sobald ein neues Bild gezeichnet werden muss. Sie übernimmt alle
Aufgaben zur Darstellung der Benutzeroberfläche.
Auf der Engine liegt das Flutter-Framework, das in der Programmiersprache
Dart geschrieben ist. Diese Ebene bietet ein modernes, reaktives Framework,
das zum Aufbau der Benutzeroberfläche verwendet wird. In der Entwicklung
von Flutter Anwendungen wird meistens nur diese Flutter-Framework Ebene
verwendet und die komplette Flutter Anwendung wird meist nur im
Framework Teil in Dart geschrieben.
Die niedrigste Ebene ist der Embedder, dessen Aufgabe es ist,
die Rendering-Fläche bereitzustellen, die Eingaben zu verarbeiten
und Zugriff zu Dart Anwendungs-Snapshots zu ermöglichen. [@gardeFlutterRaspberryPi2018]
Die Flutter Engine hat hierzu eine C API, welche in einer einzelnen
C Header-Datei definiert ist. [@theflutterauthorsEngineShellPlatform] Diese API Punkte müssen von dem
Embedder angesprochen werden.
<!-- ```{#test .dart .number-lines caption="Example Dart test" captionpos=t}
import 'package:retry/retry.dart';
final response = await retry(
// Make a GET request
() => http.get('https://google.com').timeout(Duration(seconds: 5)),
// Retry on SocketException or TimeoutException
retryIf: (e) => e is SocketException || e is TimeoutException,
);
print(response.body);
``` -->
### Deklarative Programmierung in Flutter
Deklarative Programmierung ist ein Programmierparadigma, bei dem
der Programmierer den gewünschten Endzustand der Anwendung
beschreibt, anstatt die Schritte zu definieren, die zur Erreichung
dieses Zustands erforderlich sind. Dieses Paradigma ist in Flutter
zentral, da es die Entwicklung von Benutzeroberflächen erleichtert.
Die Benutzeroberfläche wird als Baum von Widgets dargestellt, die
jeweils den gewünschten Zustand der Benutzeroberfläche beschreiben.
Wenn sich der Zustand ändert, wird der Baum der Widgets neu
gerendert, um den neuen Zustand widerzuspiegeln. [@googleinc.IntroductionDeclarativeUI]
\lstinputlisting[language=Java, caption=Beispiel für deklarative Programmierung mit Flutter, linerange={65-73}, captionpos=t]
{code/flutter_architecture/lib/main.dart}
Wie im Code-Beispiel zu erkennen definiert der Entwickler hier
ein neues Widget `TextWidget`, welches einen Text als Parameter erhält
und diesen als Text-Widget mit dem im Parameter übergebenen Text
zurückgibt. Dieses Widget wird dann in der "build" Methode erstellt.
An einer gegebenen Stelle im Code kann der Entwickler nun dieses
`TextWidget` folgendermaßen verwenden:
```{#test .dart .number-lines caption="Nutzung des TextWidgets" captionpos=t}
TextWidget("Hello World");
```
Hier wird der Text "Hello World" als Parameter an das `TextWidget`
übergeben und das Widget wird an der beliebigen Stelle in der Anwendung
angezeigt wo es so eingesetzt wurde. Wenn nun aber eine dynamische
Variable an den Text übergeben werden soll, kann dies einfach
durch die folgende Deklaration geschehen:
```{.dart .number-lines caption="Nutzung des TextWidgets mit dynamischer Variable" captionpos=t}
String text = "Hello World";
TextWidget(text);
```
Falls nun die Variable `text` sich ändert, wird das `TextWidget`
automatisch neu gerendert und der neue Text wird angezeigt.
Der Entwickler muss sich also nicht darum kümmern, dass das Widget
neu gerendert wird, das ist deklarative Programmierung in Flutter.
Das Framework übernimmt das für den Entwickler automatisch.

View File

@ -1,17 +0,0 @@
# Yocto Environment
## Poky
## Metadata
## Open-Embedded Project
## Bitbake
## Board support package
## Meta-Flutter
# Setting up the build environment and building the image
# Flashing the image on Target

View File

@ -1,35 +0,0 @@
<!-- TODO: Was ist Flutter? -->
# Flutter
Die zunehmende Verbreitung mobiler Geräte und Betriebssysteme
stellt die effiziente Anwendungsentwicklung vor Herausforderungen.
Plattformübergreifende Frameworks wie Flutter zielen darauf ab,
diese Herausforderungen zu mildern, indem sie ein einheitliches
Toolset zum Erstellen von Benutzeroberflächen (UIs) bereitstellen,
die nahtlos über verschiedene Plattformen hinweg funktionieren.
Dieses Kapitel befasst sich mit der grundlegenden Architektur,
den Vorteilen und Überlegungen zur Verwendung von Flutter für
die Anwendungsentwicklung. [@theflutterwayFlutterRubberDuck2022]
Was ist Flutter [@FlutterArchitecturalOverviewb]
test [@weiserComputer21stCentury1999]
```{#test .dart .number-lines caption="Example Dart test"}
import 'package:retry/retry.dart';
final response = await retry(
// Make a GET request
() => http.get('https://google.com').timeout(Duration(seconds: 5)),
// Retry on SocketException or TimeoutException
retryIf: (e) => e is SocketException || e is TimeoutException,
);
print(response.body);
```
Nice Dart highlighting!
![](./assets/skizzen/led.png)
WORKING :)

View File

@ -0,0 +1,13 @@
\pagebreak
# Analyse und Design
## Anforderungen
### Anwendungseinsatz
### Anwendungsfunktionen
### Abgrenzungskriterien
### Benutzeroberfläche

View File

@ -0,0 +1,29 @@
## Architektur
### Analyse
### Design
- three-layer architecture [@hajianFlutterEngineering2024, 219]
\begin{figure}[ht]
\centering
\begin{minipage}{7cm}
\dirtree{%
.1 lib/.
.2 common.
.2 constants.
.2 features.
.3 benchmark.
.3 home.
.3 settings.
<!-- prettier-ignore -->
.3 system\_information.
.2 localization.
}
\end{minipage}
\caption{Example caption}
<!-- prettier-ignore -->
\caption*{Quelle: hier Quellangabe}
\end{figure}

Binary file not shown.

View File

@ -0,0 +1,76 @@
# Implementierung
## Grundaufbau
### Entwicklungsumgebung
### Flutter Version Management
Zur Installation von Flutter und Dart empfiehlt
sich ein Version Manager. Der bekannteste Version
Manager ist FVM (Flutter Version Management), doch
der neuere Manager Puro bietet viele Vorteile.
MacOS und Linux
```bash
curl -o- https://puro.dev/install.sh | PURO_VERSION="1.4.4" bash
```
Windows
```powershell
Invoke-WebRequest -Uri "https://puro.dev/builds/1.4.4/windows-x64/puro.exe" -OutFile "$env:temp\puro.exe"; &"$env:temp\puro.exe" install-puro --promote
```
Puro Optimierungen:
- parallel git clone and engine download
- global cache for git history
- global cache for engine versions
With other approaches, each Flutter repository is in its own folder, requiring you to download and store the git history, engine, and framework of each version:
Puro implements a technology similar to GitLab's object deduplication to avoid downloading the same git objects over and over again. It also uses symlinks to share the same engine version between multiple installations:
```bash
puro use -g stable
```
```bash
puro create bachelor_elinux 3.19.0
```
```bash
puro use bachelor_elinux
```
`.puro.json`:
```json
{
"env": "bachelor_elinux"
}
```
`.vscode/settings.json`
```json
{
"dart.flutterSdkPath": "/Users/fabian/.puro/envs/bachelor_elinux/flutter",
"dart.sdkPath": "/Users/fabian/.puro/envs/bachelor_elinux/flutter/bin/cache/dart-sdk"
}
```
```bash
puro flutter --version
```
```bash
Flutter 3.19.0 • channel stable • https://github.com/flutter/flutter.git
Framework • revision bae5e49bc2 (6 days ago) • 2024-02-13 17:46:18 -0800
Engine • revision 04817c99c9
Tools • Dart 3.3.0 • DevTools 2.31.1
```
## Setup von Raspberry Pi

View File

@ -60,3 +60,18 @@ Caveats
Experimental: Not considered production-ready for every use-case (as might be expected with projects pushing Flutters boundaries).
Limited APIs: Compared to mainstream platforms, Flutters full suite of plugins and packages might not be compatible without extra platform channel work on your end.
-->
<!-- Introduction:
- Clearly describe what your Flutter application does and its main functionality.
Architecture:
- Diagram and explain your app's structure (state management approach, key widgets, navigation).
- Consider using visual aids to make this section more engaging.
Key Design Concepts:
- Challenges solved by your design choices.
- Did you address performance optimizations for embedded systems?
- How did you make the UI fit for the embedded target? -->

View File

@ -0,0 +1,23 @@
```{=latex}
\begin{center}
```
```{.mermaid loc=assets/mermaid caption="Caption" #fig:reference-name}
graph LR
A[Flutter] -- Engine --> B((SKIA))
A --> C(Facebook)
B --> D{Twitter}
C --> D
```
```{=latex}
\end{center}
```
\begin{figure}[ht]
\centering
\caption{Example caption}
<!-- prettier-ignore -->
\caption*{Quelle: hier Quellangabe}
\end{figure}

View File

@ -0,0 +1,2 @@
\lstinputlisting[language=Java, caption=Beispiel öpvn, linerange={65-73}]
{code/flutter_architecture/lib/main.dart}

View File

@ -0,0 +1,8 @@
\begin{figure}[ht]
\centering
\includegraphics[scale=1]{assets/flutter/archdiagram.png}
\caption{Example caption}
<!-- prettier-ignore -->
\caption*{Quelle: hier Quellangabe}
\end{figure}

View File

@ -1,3 +1,5 @@
\pagebreak
# Literaturverzeichnis
\setstretch{1.0}

43
code/flutter_architecture/.gitignore vendored Normal file
View File

@ -0,0 +1,43 @@
# Miscellaneous
*.class
*.log
*.pyc
*.swp
.DS_Store
.atom/
.buildlog/
.history
.svn/
migrate_working_dir/
# IntelliJ related
*.iml
*.ipr
*.iws
.idea/
# The .vscode folder contains launch configuration and tasks you configure in
# VS Code which you may wish to be included in version control, so this line
# is commented out by default.
#.vscode/
# Flutter/Dart/Pub related
**/doc/api/
**/ios/Flutter/.last_build_id
.dart_tool/
.flutter-plugins
.flutter-plugins-dependencies
.pub-cache/
.pub/
/build/
# Symbolication related
app.*.symbols
# Obfuscation related
app.*.map.json
# Android Studio will place build artifacts here
/android/app/debug
/android/app/profile
/android/app/release

View File

@ -0,0 +1,42 @@
# This file tracks properties of this Flutter project.
# Used by Flutter tool to assess capabilities and perform upgrades etc.
#
# This file should be version controlled and should not be manually edited.
version:
revision: "41456452f29d64e8deb623a3c927524bcf9f111b"
channel: "stable"
project_type: app
# Tracks metadata for the flutter migrate command
migration:
platforms:
- platform: root
create_revision: 41456452f29d64e8deb623a3c927524bcf9f111b
base_revision: 41456452f29d64e8deb623a3c927524bcf9f111b
- platform: android
create_revision: 41456452f29d64e8deb623a3c927524bcf9f111b
base_revision: 41456452f29d64e8deb623a3c927524bcf9f111b
- platform: ios
create_revision: 41456452f29d64e8deb623a3c927524bcf9f111b
base_revision: 41456452f29d64e8deb623a3c927524bcf9f111b
- platform: linux
create_revision: 41456452f29d64e8deb623a3c927524bcf9f111b
base_revision: 41456452f29d64e8deb623a3c927524bcf9f111b
- platform: macos
create_revision: 41456452f29d64e8deb623a3c927524bcf9f111b
base_revision: 41456452f29d64e8deb623a3c927524bcf9f111b
- platform: web
create_revision: 41456452f29d64e8deb623a3c927524bcf9f111b
base_revision: 41456452f29d64e8deb623a3c927524bcf9f111b
# User provided section
# List of Local paths (relative to this file) that should be
# ignored by the migrate tool.
#
# Files that are not part of the templates will be ignored by default.
unmanaged_files:
- 'lib/main.dart'
- 'ios/Runner.xcodeproj/project.pbxproj'

View File

@ -0,0 +1,16 @@
# flutter_architecture
A new Flutter project.
## Getting Started
This project is a starting point for a Flutter application.
A few resources to get you started if this is your first Flutter project:
- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab)
- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook)
For help getting started with Flutter development, view the
[online documentation](https://docs.flutter.dev/), which offers tutorials,
samples, guidance on mobile development, and a full API reference.

View File

@ -0,0 +1,28 @@
# This file configures the analyzer, which statically analyzes Dart code to
# check for errors, warnings, and lints.
#
# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
# invoked from the command line by running `flutter analyze`.
# The following line activates a set of recommended lints for Flutter apps,
# packages, and plugins designed to encourage good coding practices.
include: package:flutter_lints/flutter.yaml
linter:
# The lint rules applied to this project can be customized in the
# section below to disable rules from the `package:flutter_lints/flutter.yaml`
# included above or to enable additional rules. A list of all available lints
# and their documentation is published at https://dart.dev/lints.
#
# Instead of disabling a lint rule for the entire project in the
# section below, it can also be suppressed for a single line of code
# or a specific dart file by using the `// ignore: name_of_lint` and
# `// ignore_for_file: name_of_lint` syntax on the line or in the file
# producing the lint.
rules:
# avoid_print: false # Uncomment to disable the `avoid_print` rule
# prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
# Additional information about this file can be found at
# https://dart.dev/guides/language/analysis-options

View File

@ -0,0 +1,13 @@
gradle-wrapper.jar
/.gradle
/captures/
/gradlew
/gradlew.bat
/local.properties
GeneratedPluginRegistrant.java
# Remember to never publicly share your keystore.
# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
key.properties
**/*.keystore
**/*.jks

View File

@ -0,0 +1,67 @@
plugins {
id "com.android.application"
id "kotlin-android"
id "dev.flutter.flutter-gradle-plugin"
}
def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
localPropertiesFile.withReader('UTF-8') { reader ->
localProperties.load(reader)
}
}
def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
flutterVersionCode = '1'
}
def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) {
flutterVersionName = '1.0'
}
android {
namespace "com.example.flutter_architecture"
compileSdkVersion flutter.compileSdkVersion
ndkVersion flutter.ndkVersion
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
}
defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "com.example.flutter_architecture"
// You can update the following values to match your application needs.
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
minSdkVersion flutter.minSdkVersion
targetSdkVersion flutter.targetSdkVersion
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
}
buildTypes {
release {
// TODO: Add your own signing config for the release build.
// Signing with the debug keys for now, so `flutter run --release` works.
signingConfig signingConfigs.debug
}
}
}
flutter {
source '../..'
}
dependencies {}

View File

@ -0,0 +1,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- The INTERNET permission is required for development. Specifically,
the Flutter tool needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>

View File

@ -0,0 +1,33 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application
android:label="flutter_architecture"
android:name="${applicationName}"
android:icon="@mipmap/ic_launcher">
<activity
android:name=".MainActivity"
android:exported="true"
android:launchMode="singleTop"
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize">
<!-- Specifies an Android theme to apply to this Activity as soon as
the Android process has started. This theme is visible to the user
while the Flutter UI initializes. After that, this theme continues
to determine the Window background behind the Flutter UI. -->
<meta-data
android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme"
/>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<!-- Don't delete the meta-data below.
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
<meta-data
android:name="flutterEmbedding"
android:value="2" />
</application>
</manifest>

View File

@ -0,0 +1,6 @@
package com.example.flutter_architecture
import io.flutter.embedding.android.FlutterActivity
class MainActivity: FlutterActivity() {
}

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="?android:colorBackground" />
<!-- You can insert your own image assets here -->
<!-- <item>
<bitmap
android:gravity="center"
android:src="@mipmap/launch_image" />
</item> -->
</layer-list>

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:color/white" />
<!-- You can insert your own image assets here -->
<!-- <item>
<bitmap
android:gravity="center"
android:src="@mipmap/launch_image" />
</item> -->
</layer-list>

Binary file not shown.

After

Width:  |  Height:  |  Size: 544 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 442 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 721 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on -->
<style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
<!-- Show a splash screen on the activity. Automatically removed when
the Flutter engine draws its first frame -->
<item name="android:windowBackground">@drawable/launch_background</item>
</style>
<!-- Theme applied to the Android Window as soon as the process has started.
This theme determines the color of the Android Window while your
Flutter UI initializes, as well as behind your Flutter UI while its
running.
This Theme is only used starting with V2 of Flutter's Android embedding. -->
<style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
<item name="android:windowBackground">?android:colorBackground</item>
</style>
</resources>

View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->
<style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
<!-- Show a splash screen on the activity. Automatically removed when
the Flutter engine draws its first frame -->
<item name="android:windowBackground">@drawable/launch_background</item>
</style>
<!-- Theme applied to the Android Window as soon as the process has started.
This theme determines the color of the Android Window while your
Flutter UI initializes, as well as behind your Flutter UI while its
running.
This Theme is only used starting with V2 of Flutter's Android embedding. -->
<style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
<item name="android:windowBackground">?android:colorBackground</item>
</style>
</resources>

View File

@ -0,0 +1,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- The INTERNET permission is required for development. Specifically,
the Flutter tool needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>

View File

@ -0,0 +1,30 @@
buildscript {
ext.kotlin_version = '1.7.10'
repositories {
google()
mavenCentral()
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
allprojects {
repositories {
google()
mavenCentral()
}
}
rootProject.buildDir = '../build'
subprojects {
project.buildDir = "${rootProject.buildDir}/${project.name}"
}
subprojects {
project.evaluationDependsOn(':app')
}
tasks.register("clean", Delete) {
delete rootProject.buildDir
}

View File

@ -0,0 +1,3 @@
org.gradle.jvmargs=-Xmx4G
android.useAndroidX=true
android.enableJetifier=true

View File

@ -0,0 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip

View File

@ -0,0 +1,29 @@
pluginManagement {
def flutterSdkPath = {
def properties = new Properties()
file("local.properties").withInputStream { properties.load(it) }
def flutterSdkPath = properties.getProperty("flutter.sdk")
assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
return flutterSdkPath
}
settings.ext.flutterSdkPath = flutterSdkPath()
includeBuild("${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle")
repositories {
google()
mavenCentral()
gradlePluginPortal()
}
plugins {
id "dev.flutter.flutter-gradle-plugin" version "1.0.0" apply false
}
}
plugins {
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
id "com.android.application" version "7.3.0" apply false
}
include ":app"

View File

@ -0,0 +1,34 @@
**/dgph
*.mode1v3
*.mode2v3
*.moved-aside
*.pbxuser
*.perspectivev3
**/*sync/
.sconsign.dblite
.tags*
**/.vagrant/
**/DerivedData/
Icon?
**/Pods/
**/.symlinks/
profile
xcuserdata
**/.generated/
Flutter/App.framework
Flutter/Flutter.framework
Flutter/Flutter.podspec
Flutter/Generated.xcconfig
Flutter/ephemeral/
Flutter/app.flx
Flutter/app.zip
Flutter/flutter_assets/
Flutter/flutter_export_environment.sh
ServiceDefinitions.json
Runner/GeneratedPluginRegistrant.*
# Exceptions to above rules.
!default.mode1v3
!default.mode2v3
!default.pbxuser
!default.perspectivev3

View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>App</string>
<key>CFBundleIdentifier</key>
<string>io.flutter.flutter.app</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>App</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>MinimumOSVersion</key>
<string>12.0</string>
</dict>
</plist>

View File

@ -0,0 +1 @@
#include "Generated.xcconfig"

View File

@ -0,0 +1 @@
#include "Generated.xcconfig"

View File

@ -0,0 +1,617 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 54;
objects = {
/* Begin PBXBuildFile section */
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 97C146E61CF9000F007C117D /* Project object */;
proxyType = 1;
remoteGlobalIDString = 97C146ED1CF9000F007C117D;
remoteInfo = Runner;
};
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
9705A1C41CF9048500538489 /* Embed Frameworks */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 10;
files = (
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = "<group>"; };
331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
97C146EB1CF9000F007C117D /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
9740EEB11CF90186004384FC /* Flutter */ = {
isa = PBXGroup;
children = (
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
9740EEB21CF90195004384FC /* Debug.xcconfig */,
7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
9740EEB31CF90195004384FC /* Generated.xcconfig */,
);
name = Flutter;
sourceTree = "<group>";
};
331C8082294A63A400263BE5 /* RunnerTests */ = {
isa = PBXGroup;
children = (
331C807B294A618700263BE5 /* RunnerTests.swift */,
);
path = RunnerTests;
sourceTree = "<group>";
};
97C146E51CF9000F007C117D = {
isa = PBXGroup;
children = (
9740EEB11CF90186004384FC /* Flutter */,
97C146F01CF9000F007C117D /* Runner */,
97C146EF1CF9000F007C117D /* Products */,
331C8082294A63A400263BE5 /* RunnerTests */,
);
sourceTree = "<group>";
};
97C146EF1CF9000F007C117D /* Products */ = {
isa = PBXGroup;
children = (
97C146EE1CF9000F007C117D /* Runner.app */,
331C8081294A63A400263BE5 /* RunnerTests.xctest */,
);
name = Products;
sourceTree = "<group>";
};
97C146F01CF9000F007C117D /* Runner */ = {
isa = PBXGroup;
children = (
97C146FA1CF9000F007C117D /* Main.storyboard */,
97C146FD1CF9000F007C117D /* Assets.xcassets */,
97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
97C147021CF9000F007C117D /* Info.plist */,
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
);
path = Runner;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
331C8080294A63A400263BE5 /* RunnerTests */ = {
isa = PBXNativeTarget;
buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
buildPhases = (
331C807D294A63A400263BE5 /* Sources */,
331C807E294A63A400263BE5 /* Frameworks */,
331C807F294A63A400263BE5 /* Resources */,
);
buildRules = (
);
dependencies = (
331C8086294A63A400263BE5 /* PBXTargetDependency */,
);
name = RunnerTests;
productName = RunnerTests;
productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */;
productType = "com.apple.product-type.bundle.unit-test";
};
97C146ED1CF9000F007C117D /* Runner */ = {
isa = PBXNativeTarget;
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
buildPhases = (
9740EEB61CF901F6004384FC /* Run Script */,
97C146EA1CF9000F007C117D /* Sources */,
97C146EB1CF9000F007C117D /* Frameworks */,
97C146EC1CF9000F007C117D /* Resources */,
9705A1C41CF9048500538489 /* Embed Frameworks */,
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
);
buildRules = (
);
dependencies = (
);
name = Runner;
productName = Runner;
productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
97C146E61CF9000F007C117D /* Project object */ = {
isa = PBXProject;
attributes = {
BuildIndependentTargetsInParallel = YES;
LastUpgradeCheck = 1430;
ORGANIZATIONNAME = "";
TargetAttributes = {
331C8080294A63A400263BE5 = {
CreatedOnToolsVersion = 14.0;
TestTargetID = 97C146ED1CF9000F007C117D;
};
97C146ED1CF9000F007C117D = {
CreatedOnToolsVersion = 7.3.1;
LastSwiftMigration = 1100;
};
};
};
buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
compatibilityVersion = "Xcode 9.3";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = 97C146E51CF9000F007C117D;
productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
97C146ED1CF9000F007C117D /* Runner */,
331C8080294A63A400263BE5 /* RunnerTests */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
331C807F294A63A400263BE5 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
97C146EC1CF9000F007C117D /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${TARGET_BUILD_DIR}/${INFOPLIST_PATH}",
);
name = "Thin Binary";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
};
9740EEB61CF901F6004384FC /* Run Script */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "Run Script";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
331C807D294A63A400263BE5 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
97C146EA1CF9000F007C117D /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
331C8086294A63A400263BE5 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 97C146ED1CF9000F007C117D /* Runner */;
targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin PBXVariantGroup section */
97C146FA1CF9000F007C117D /* Main.storyboard */ = {
isa = PBXVariantGroup;
children = (
97C146FB1CF9000F007C117D /* Base */,
);
name = Main.storyboard;
sourceTree = "<group>";
};
97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
isa = PBXVariantGroup;
children = (
97C147001CF9000F007C117D /* Base */,
);
name = LaunchScreen.storyboard;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
249021D3217E4FDB00AE95B9 /* Profile */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
};
name = Profile;
};
249021D4217E4FDB00AE95B9 /* Profile */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = T67F6A44RM;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterArchitecture;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
};
name = Profile;
};
331C8088294A63A400263BE5 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = AE0B7B92F70575B8D7E0D07E /* Pods-RunnerTests.debug.xcconfig */;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterArchitecture.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
};
name = Debug;
};
331C8089294A63A400263BE5 /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 89B67EB44CE7B6631473024E /* Pods-RunnerTests.release.xcconfig */;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterArchitecture.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
};
name = Release;
};
331C808A294A63A400263BE5 /* Profile */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 640959BDD8F10B91D80A66BE /* Pods-RunnerTests.profile.xcconfig */;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterArchitecture.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
};
name = Profile;
};
97C147031CF9000F007C117D /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
97C147041CF9000F007C117D /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
};
name = Release;
};
97C147061CF9000F007C117D /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = T67F6A44RM;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterArchitecture;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
};
name = Debug;
};
97C147071CF9000F007C117D /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = T67F6A44RM;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterArchitecture;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
331C8088294A63A400263BE5 /* Debug */,
331C8089294A63A400263BE5 /* Release */,
331C808A294A63A400263BE5 /* Profile */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
isa = XCConfigurationList;
buildConfigurations = (
97C147031CF9000F007C117D /* Debug */,
97C147041CF9000F007C117D /* Release */,
249021D3217E4FDB00AE95B9 /* Profile */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
isa = XCConfigurationList;
buildConfigurations = (
97C147061CF9000F007C117D /* Debug */,
97C147071CF9000F007C117D /* Release */,
249021D4217E4FDB00AE95B9 /* Profile */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 97C146E61CF9000F007C117D /* Project object */;
}

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:">
</FileRef>
</Workspace>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PreviewsEnabled</key>
<false/>
</dict>
</plist>

View File

@ -0,0 +1,98 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1430"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</MacroExpansion>
<Testables>
<TestableReference
skipped = "NO"
parallelizable = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "331C8080294A63A400263BE5"
BuildableName = "RunnerTests.xctest"
BlueprintName = "RunnerTests"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</TestableReference>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</LaunchAction>
<ProfileAction
buildConfiguration = "Profile"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "group:Runner.xcodeproj">
</FileRef>
</Workspace>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PreviewsEnabled</key>
<false/>
</dict>
</plist>

View File

@ -0,0 +1,13 @@
import UIKit
import Flutter
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
GeneratedPluginRegistrant.register(with: self)
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
}

View File

@ -0,0 +1,122 @@
{
"images" : [
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "Icon-App-20x20@2x.png",
"scale" : "2x"
},
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "Icon-App-20x20@3x.png",
"scale" : "3x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@1x.png",
"scale" : "1x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@2x.png",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@3x.png",
"scale" : "3x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-App-40x40@2x.png",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-App-40x40@3x.png",
"scale" : "3x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "Icon-App-60x60@2x.png",
"scale" : "2x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "Icon-App-60x60@3x.png",
"scale" : "3x"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "Icon-App-20x20@1x.png",
"scale" : "1x"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "Icon-App-20x20@2x.png",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "Icon-App-29x29@1x.png",
"scale" : "1x"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "Icon-App-29x29@2x.png",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "Icon-App-40x40@1x.png",
"scale" : "1x"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "Icon-App-40x40@2x.png",
"scale" : "2x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "Icon-App-76x76@1x.png",
"scale" : "1x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "Icon-App-76x76@2x.png",
"scale" : "2x"
},
{
"size" : "83.5x83.5",
"idiom" : "ipad",
"filename" : "Icon-App-83.5x83.5@2x.png",
"scale" : "2x"
},
{
"size" : "1024x1024",
"idiom" : "ios-marketing",
"filename" : "Icon-App-1024x1024@1x.png",
"scale" : "1x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 295 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 406 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 450 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 282 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 462 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 704 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 406 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 586 B

Some files were not shown because too many files have changed in this diff Show More