Slicing: τι είναι, αρχή λειτουργίας και σύνδεση με το App Thinning

Συγγραφέας: IT Sectr Δημοσιεύτηκε: 2026-04-17 Χρόνος ανάγνωσης: 11 λεπ

Slicing — είναι ένας μηχανισμός του App Thinning κατά τον οποίο το App Store δημιουργεί αυτόματα πολλές παραλλαγές του δυαδικού αρχείου, κάθε μία περιέχει πόρους μόνο για ένα συγκεκριμένο μοντέλο συσκευής. Σύμφωνα με το Apple Developer Documentation, 2026, το Slicing εξαιρεί από τη διανομή πόρους για μη υποστηριζόμενες διαμορφώσεις, μειώνοντας το μέγεθος εγκατάστασης. Ας εξετάσουμε την αρχή λειτουργίας, τις παραλλαγές κοπής και τον έλεγχο αποτελεσμάτων.

Κύρια σημεία

  • Slicing — διαίρεση του δυαδικού αρχείου της εφαρμογής σε παραλλαγές για διαφορετικές αρχιτεκτονικές, αναλύσεις και εκδόσεις iOS
  • App Store παραδίδει στον χρήστη μόνο τους πόρους που αντιστοιχούν στη συσκευή του
  • Asset Catalogs — το κύριο εργαλείο του προγραμματιστή για τη διαχείριση πόρων που συμμετέχουν στο Slicing
  • Οικογένειες GPU (Apple GPU, PowerVR, Mali) λαμβάνονται επίσης υπόψη κατά την κοπή shader Metal
  • Έλεγχος των τεμαχίων γίνεται μέσω Xcode Organizer και App Store Connect Build Metrics

Τι είναι το Slicing

Slicing — είναι το στοιχείο του App Thinning που είναι υπεύθυνο για τη δημιουργία παραλλαγών (τεμαχίων) του δυαδικού αρχείου της εφαρμογής στην πλευρά του App Store. Όταν ο προγραμματιστής ανεβάζει ένα καθολικό δυαδικό αρχείο (fat binary) που περιέχει κώδικα και πόρους για όλες τις υποστηριζόμενες διαμορφώσεις, το App Store το αναλύει και δημιουργεί πολλά τεμάχια: ξεχωριστά για iPhone με επεξεργαστή A17, ξεχωριστά για iPad με M4, ξεχωριστά για Apple Watch. Κάθε τεμάχιο περιέχει μόνο εκείνα τα τμήματα κώδικα και πόρους που είναι απαραίτητα για αυτόν τον συνδυασμό αρχιτεκτονικής και ανάλυσης.

Πριν από το iOS 9, οι προγραμματιστές δημιουργούσαν χειροκίνητα ξεχωριστά δυαδικά αρχεία για διαφορετικές συσκευές ή παρείχαν ένα καθολικό fat binary που περιείχε τα πάντα ταυτόχρονα. Slicing αυτοματοποίησε πλήρως αυτή τη διαδικασία: ο προγραμματιστής προετοιμάζει ένα έργο στο Xcode, ανεβάζει ένα αρχείο στο App Store Connect και το Slicing στην πλευρά του διακομιστή δημιουργεί τον βέλτιστο αριθμό παραλλαγών. Ο χρήστης δεν βλέπει ποτέ τη διαδικασία κοπής — λαμβάνει ένα έτοιμο .app βελτιστοποιημένο για τη συσκευή του.

Το Slicing εφαρμόζεται όχι μόνο σε κώδικα και εικόνες, αλλά και σε shader Metal. Η Apple GPU χρησιμοποιεί το δικό της σύνολο εντολών (Metal Shading Language) που διαφέρει από τις εντολές PowerVR ή ARM Mali. Το Slicing περιλαμβάνει στο τεμάχιο μόνο shader για την οικογένεια GPU της συσκευής-στόχου. Αυτό είναι ιδιαίτερα σημαντικό για παιχνίδια με προσαρμοσμένα shader — για παράδειγμα, εφέ μετα-επεξεργασίας υψηλής λεπτομέρειας μεταγλωττίζονται μόνο για συσκευές με ισχυρή GPU (iPad Pro M4, iPhone 16 Pro Max).

Διαφορά μεταξύ Slicing και απλής μεταγλώττισης για αρχιτεκτονική

Ο μεταγλωττιστής Xcode δημιουργεί ένα fat binary με πολλές αρχιτεκτονικές (armv7, arm64, arm64e), αλλά δεν αφαιρεί πόρους — όλες οι εικόνες για όλες τις αναλύσεις παραμένουν μέσα στο .app. Slicing πηγαίνει παραπέρα: αναλύει τα Asset Catalogs, τα shader Metal και τις βιβλιοθήκες Swift, αφαιρώντας από κάθε τεμάχιο ό,τι δεν χρειάζεται για έναν συγκεκριμένο σκοπό. Για παράδειγμα, από το τεμάχιο για iPhone SE δεν μπαίνουν γραφικά @3x, και από το τεμάχιο για iPad Air — ελεγκτές ειδικοί για iPhone (αν είναι ξεχωρισμένοι σε ξεχωριστούς πόρους).

Πώς λειτουργεί το Slicing

Η διαδικασία Slicing ξεκινά μετά τη μεταφόρτωση του build στο App Store Connect και αποτελείται από τρία στάδια: ανάλυση, κοπή και συσκευασία. Στο στάδιο της ανάλυσης, ο διακομιστής App Store αναλύει το δυαδικό αρχείο, εξάγει πληροφορίες σχετικά με τις υποστηριζόμενες αρχιτεκτονικές, συσκευές, αναλύσεις οθόνης και εκδόσεις iOS. Το App Store χρησιμοποιεί την αντιστοίχιση όλων των εμπορικών μοντέλων Apple με τις τεχνικές προδιαγραφές τους — η βάση δεδομένων συσκευών (Device Database) ενημερώνεται με κάθε έκδοση iOS.

Στο στάδιο της κοπής, ο διακομιστής δημιουργεί ξεχωριστά αντίγραφα του δυαδικού αρχείου για κάθε μοναδικό συνδυασμό. Για αυτό, το App Store εξάγει από τα Asset Catalogs εικόνες με συγκεκριμένες ετικέτες (idiom, subtype, scale), επιλέγει μόνο εκείνες που αντιστοιχούν στη συσκευή-στόχο και συναρμολογεί ένα νέο πακέτο πόρων. Η τυποποιημένη βιβλιοθήκη Swift επίσης υπόκειται σε κοπή — από αυτήν αφαιρούνται σύμβολα και μέθοδοι που δεν χρησιμοποιούνται από τη συγκεκριμένη εφαρμογή (dead code stripping).

Στο στάδιο της συσκευασίας, κάθε τεμάχιο τοποθετείται σε ξεχωριστό πακέτο διανομής και συνδέεται με μεταδεδομένα — λίστα μοντέλων συσκευών για τα οποία προορίζεται αυτό το τεμάχιο. App Store κατά τη λήψη της εφαρμογής από τον χρήστη επιλέγει το κατάλληλο τεμάχιο με βάση το μοντέλο συσκευής, την έκδοση iOS και τον τύπο σύνδεσης. Εάν δεν υπάρχει ακριβής αντιστοιχία, ο διακομιστής χρησιμοποιεί το πλησιέστερο τεμάχιο ως προς τις προδιαγραφές. Η Apple αποθηκεύει όλες τις παραλλαγές στο δίκτυο CDN CloudKit για γρήγορη παράδοση παγκοσμίως.

Slicing στο πλαίσιο του App Thinning

Slicing — είναι ένας από τους τρεις μηχανισμούς του App Thinning, αλλά συνεισφέρει τα μέγιστα στη μείωση του μεγέθους λήψης. Bitcode είναι υπεύθυνο για τη βελτιστοποίηση κώδικα μηχανής, On-Demand Resources — για τη διαχείριση πόρων στη συσκευή, και Slicing — για την αφαίρεση πλεονάζοντων πόρων στο στάδιο διανομής. Χωρίς Slicing, οι πρώτοι δύο μηχανισμοί λειτουργούν, αλλά οι χρήστες λαμβάνουν πόρους για όλες τις συσκευές, γεγονός που αυξάνει το μέγεθος κατά 20-40% ανάλογα με τον αριθμό των Asset Catalogs.

Η διαφορά μεταξύ Slicing και Bitcode είναι στο σημείο εφαρμογής: το Slicing λειτουργεί σε επίπεδο πόρων (εικόνες, shader, αρχεία NIB), το Bitcode — σε επίπεδο κώδικα μηχανής. Το Slicing χωρίζει τον κώδικα κατά αρχιτεκτονικές (arm64 vs arm64e), το Bitcode επιτρέπει στην Apple να μεταγλωττίσει ξανά τον κώδικα για νέες αρχιτεκτονικές. Bitcode + Slicing μαζί δίνουν μέγιστη βελτιστοποίηση: το Bitcode παράγει κώδικα για συγκεκριμένη αρχιτεκτονική και το Slicing αφαιρεί τους περιττούς πόρους για αυτήν την αρχιτεκτονική.

Σχέση με το On-Demand Resources — το Slicing και το ODR δεν αλληλοεπικαλύπτονται. Το Slicing αποφασίζει ποιοι πόροι θα εισέλθουν στη διανομή στη συσκευή και το ODR διαχειρίζεται πότε αυτοί οι πόροι θα φορτωθούν και θα εκφορτωθούν. Ο προγραμματιστής μπορεί να επισημάνει έναν πόρο με ετικέτα ODR και το Slicing θα τον συμπεριλάβει στο τεμάχιο εάν αντιστοιχεί στη συσκευή. Apple συνιστά τη χρήση και των τριών μηχανισμών ταυτόχρονα για ελάχιστο μέγεθος εγκατάστασης.

ΜηχανισμόςΑντικείμενο βελτιστοποίησηςΠότε εφαρμόζεταιΕπίδραση στο μέγεθος
SlicingΠόροι (εικόνες, shader)Στην πλευρά App StoreΑφαιρεί ~30% πλεονάζοντες πόρους
BitcodeΚώδικας μηχανήςΚατά τη λήψη από τον χρήστηΒελτιστοποίηση κώδικα για αρχιτεκτονική
ODRΠόροι στη συσκευήΜετά την εγκατάστασηΜειώνει το αρχικό μέγεθος κατά 40-60%

Παραλλαγές Slicing για διαφορετικές συσκευές

Το Slicing δημιουργεί ξεχωριστά τεμάχια βάσει πολλών διαστάσεων: αρχιτεκτονική επεξεργαστή, μέγεθος οθόνης (ανάλυση), έκδοση iOS και οικογένεια GPU (για Metal). Αρχιτεκτονική καθορίζει το σύνολο εντολών CPU: arm64 — βασικό 64-bit σύνολο (iPhone 5s — iPhone X), arm64e — εκτεταμένο σύνολο με υποστήριξη για Pointer Authentication και PAC (iPhone XS και νεότερα, iPad Pro με A12X+). Το τεμάχιο για arm64e περιλαμβάνει κώδικα με εντολές προστασίας μνήμης που δεν είναι διαθέσιμες σε συσκευές arm64.

Ανάλυση οθόνης — η δεύτερη βασική διάσταση του Slicing. Η Apple χρησιμοποιεί κλίμακες @1x (iPhone 3GS), @2x (iPhone 4 — iPhone SE 3), @3x (iPhone 6 Plus και νεότερα) και ειδικές για iPad (2x και 3x με πρόσθετες μετρήσεις). Το Slicing περιλαμβάνει στο τεμάχιο μόνο εικόνες με κλίμακα που αντιστοιχεί στη συσκευή-στόχο. Με τη σωστή οργάνωση των Asset Catalogs στο Xcode, αυτό εξαλείφει την ανάγκη χειροκίνητης διαχείρισης συνόλων πόρων — αρκεί να προσθέσετε την εικόνα στον κατάλογο, υποδεικνύοντας τους υποστηριζόμενους τύπους συσκευών.

Οικογένεια GPU — η τρίτη διάσταση, κρίσιμη για εφαρμογές Metal. Η Apple χρησιμοποιεί ταξινόμηση GPU κατά γενιές: Apple GPU family 1 (A7), family 2 (A8), ... family 8 (M4). Τα shader Metal μεταγλωττίζονται για κάθε οικογένεια ξεχωριστά, καθώς το σύνολο εντολών Metal Shading Language επεκτείνεται με κάθε γενιά GPU. Το Slicing περιλαμβάνει στο τεμάχιο μόνο shader για την οικογένεια GPU της συσκευής-στόχου, μειώνοντας σημαντικά το μέγεθος παιχνιδιών και εφαρμογών που χρησιμοποιούν Metal για απόδοση.

Επίδραση της αρχιτεκτονικής στο μέγεθος τεμαχίου

Αρχιτεκτονική CPU επηρεάζει άμεσα το μέγεθος τεμαχίου: ο κώδικας arm64e περιέχει πρόσθετες εντολές Pointer Authentication (PAC) και Signed Return Address που αυξάνουν το δυαδικό αρχείο κατά 5-10% σε σύγκριση με arm64. Ωστόσο, αυτή η αύξηση αντισταθμίζεται από το γεγονός ότι το Slicing περιλαμβάνει κώδικα arm64e μόνο σε τεμάχια για συσκευές με επεξεργαστές A12+. Για iPhone SE (τρίτης γενιάς) με A15 Bionic, το Slicing δημιουργεί ένα ξεχωριστό τεμάχιο βελτιστοποιημένο για τις δυνατότητες αυτού του τσιπ.

Διαμόρφωση Slicing στο Xcode

Η διαμόρφωση του Slicing στο Xcode είναι ελάχιστη — η κύρια διαμόρφωση γίνεται μέσω Asset Catalogs και Build Settings. Asset Catalog πρέπει να περιέχει πόρους οργανωμένους ανά τύπο συσκευής (Any, iPhone, iPad, Apple Watch, Apple TV) με σωστή ένδειξη κλίμακας και λειτουργίας εμφάνισης. Το Xcode συμπεριλαμβάνει αυτόματα στη μεταγλώττιση μόνο εκείνους τους πόρους που αντιστοιχούν στις συσκευές-στόχους που καθορίζονται στις ρυθμίσεις Deployment Target.

Η βασική ρύθμιση Slicing στο Xcode — Build Setting App Thinning. Διαθέσιμες τιμές:

  • None — Slicing απενεργοποιημένο, η εφαρμογή παρέχεται ως universal fat binary
  • Automatic — Το Xcode ενεργοποιεί το Slicing με προεπιλεγμένες ρυθμίσεις
  • Manual — ο προγραμματιστής επιλέγει συγκεκριμένους συνδυασμούς για Slicing
Για δημοσίευση στο App Store χρησιμοποιήστε Automatic. Η λειτουργία Manual είναι χρήσιμη για δοκιμή συγκεκριμένων τεμαχίων σε τοπική συσκευή.

Targeted Device Families στο General → Deployment Info καθορίζει για ποιους τύπους συσκευών μεταγλωττίζεται η εφαρμογή (iPhone / iPad / Universal). Το Slicing βασίζεται σε αυτήν την παράμετρο κατά την κοπή — εάν η εφαρμογή υποστηρίζει μόνο iPhone, το τεμάχιο για iPad δεν δημιουργείται. Deployment Target (ελάχιστη έκδοση iOS) επηρεάζει επίσης το Slicing: για παλιές εκδόσεις iOS μπορεί να απαιτούνται τεμάχια armv7 που δεν χρειάζονται για iOS 13+. Η Apple συνιστά να ορίζετε το Deployment Target στην τελευταία σταθερή έκδοση iOS — αυτό μειώνει τον αριθμό τεμαχίων και το μέγεθος του δυαδικού αρχείου.

Παράμετροι Asset Catalog για Slicing

Για μέγιστη αποδοτικότητα Slicing, τα Asset Catalogs πρέπει να χρησιμοποιούν συγκεκριμένες ετικέτες για κάθε πόρο. Xcode παρέχει στο Attributes Inspector για εικόνες: Width Class (Any, Compact, Regular), Height Class (Any, Compact, Regular), Gamut (sRGB, Display P3), Memory (Any, Low, High), Graphics (Any, Low, High). Συνδυάζοντας αυτές τις ετικέτες, ο προγραμματιστής ελέγχει σε ποια τεμάχια θα εισέλθει κάθε εικόνα. Για παράδειγμα, μια εικόνα για iPad με ετικέτα Regular Width + Regular Height θα μπει μόνο σε τεμάχια για iPad σε οριζόντιο προσανατολισμό.

bash
# Εξαγωγή τεμαχίου για συγκεκριμένη συσκευή
xcodebuild -exportArchive \
  -archivePath "App.xcarchive" \
  -exportPath "sliced/" \
  -exportOptionsPlist "export.plist" \
  -thinning "iPhone17,2" # iPhone 16 Pro Max

Xcodebuild με παράμετρο -thinning και αναγνωριστικό μοντέλου δημιουργεί τεμάχιο μόνο για αυτό το μοντέλο. Η λίστα αναγνωριστικών βρίσκεται στο Apple Device Database (μορφή: iPhone17,2 — iPhone 16 Pro Max, iPad14,1 — iPad Pro 11 M4). Αυτή η μέθοδος είναι χρήσιμη για τον έλεγχο μεγέθους τεμαχίου πριν από την αποστολή στο App Store Connect. CI/CD μπορεί να χρησιμοποιήσει αυτήν την εντολή για αυτόματη επαλήθευση — εάν το μέγεθος τεμαχίου υπερβαίνει το όριο (π.χ. 100 MB για λήψη κινητού), το pipeline εκδίδει προειδοποίηση.

Έλεγχος αποτελεσμάτων Slicing

Μετά τη μεταφόρτωση του αρχείου στο App Store Connect, η Apple παρέχει λεπτομερή στατιστικά σχετικά με τα μεγέθη τεμαχίων. App Store Connect → Activity → επιλέξτε build → App Thinning — εμφανίζει το Estimated App Store Size για κάθε κατηγορία συσκευών: iPhone, iPad, Apple Watch, tvOS. Τα μεγέθη χωρίζονται ανά έκδοση iOS και τύπο επεξεργαστή. Εάν κάποιο τεμάχιο υπερβαίνει το αναμενόμενο μέγεθος, το App Store Connect το επισημαίνει με κίτρινη προειδοποίηση.

Τοπικός έλεγχος μέσω Xcode Organizer: μετά την αρχειοθέτηση, ανοίξτε το Window → Organizer, επιλέξτε το αρχείο και κάντε κλικ στο App Thinning Profiles. Το Xcode θα εμφανίσει τα μεγέθη για κάθε πιθανό τεμάχιο βάσει της τρέχουσας διαμόρφωσης του έργου. Διατίθεται επίσης η επιλογή Export για δημιουργία IPA με συγκεκριμένο προφίλ Slicing. Xcode δημιουργεί το αρχείο .app-thinning.plist με πληροφορίες σχετικά με το ποιοι πόροι εισήλθαν σε κάθε τεμάχιο.

Για αυτοματοποίηση ελέγχου Slicing σε CI/CD, χρησιμοποιήστε το xcodebuild με -thinning και αναλύστε το μέγεθος των δημιουργηθέντων αρχείων .app. Apple παρέχει το εργαλείο γραμμής εντολών app-size (εγκαθίσταται μέσω Xcode Command Line Tools) που εμφανίζει λεπτομερή αναφορά: μέγεθος κώδικα, μέγεθος πόρων ανά κατηγορία (εικόνες, shader, NIB), μέγεθος βιβλιοθηκών Swift. Η σύγκριση μεγεθών τεμαχίων πριν και μετά τη βελτιστοποίηση Asset Catalogs βοηθά στον εντοπισμό πόρων που δεν συμμετέχουν στο Slicing λόγω εσφαλμένης διαμόρφωσης.

bash
# Ανάλυση μεγέθους τεμαχίου
app-size -m "sliced/App.app" \
  --format json

App-size εμφανίζει αναφορά JSON με ανάλυση ανά κατηγορία πόρων. Εάν το Slicing έχει ρυθμιστεί σωστά, στην ενότητα „images” θα υπάρχει μόνο ένα σύνολο κλίμακας (@2x ή @3x), όχι όλες οι παραλλαγές. Το σφάλμα διαμόρφωσης Asset Catalogs εκδηλώνεται με το ότι όλες οι κλίμακες (@1x, @2x, @3x) είναι παρούσες στο τεμάχιο — αυτό σημαίνει ότι το Xcode δεν μπόρεσε να καθορίσει τη συσκευή-στόχο για αυτές τις εικόνες και το Slicing δεν λειτούργησε.

Συχνές ερωτήσεις

Επηρεάζει το Slicing εφαρμογές που διανέμονται μέσω TestFlight;

Ναι, το TestFlight υποστηρίζει επίσης Slicing. Όταν ο δοκιμαστής κατεβάζει την εφαρμογή μέσω TestFlight, ο διακομιστής Apple παραδίδει ένα τεμάχιο βελτιστοποιημένο για τη συσκευή του δοκιμαστή. App Store Connect επεξεργάζεται αυτόματα το Slicing για όλες τις διανομές, συμπεριλαμβανομένου του TestFlight, εκτός από τις εκδόσεις Enterprise και Ad Hoc.

Μπορώ να απενεργοποιήσω το Slicing για έναν συγκεκριμένο πόρο;

Ναι, στα Asset Catalogs για κάθε εικόνα μπορείτε να αφαιρέσετε τις σημάνσεις για συγκεκριμένους τύπους συσκευών. Xcode επιτρέπει στο Attributes Inspector να καθορίσετε για ποιο Idiom (iPhone, iPad, Apple Watch, Mac) και κλίμακες πρέπει να συμπεριληφθεί ο πόρος. Εάν ο πόρος χρειάζεται σε όλες τις συσκευές, χρησιμοποιήστε Universal με οποιαδήποτε κλίμακα.

Πώς λειτουργεί το Slicing με προσαρμοσμένα framework;

Τα προσαρμοσμένα framework (.framework) συμμετέχουν επίσης στο Slicing εάν είναι μεταγλωττισμένα ως XCFramework (με πολλές αρχιτεκτονικές). App Store περιλαμβάνει στο τεμάχιο μόνο εκείνη την αρχιτεκτονική του framework που αντιστοιχεί στη συσκευή-στόχο. Οι στατικές βιβλιοθήκες (.a) δεν υπόκεινται σε Slicing — ενσωματώνονται πλήρως στο δυαδικό αρχείο.

Γιατί το μέγεθος build του App Store διαφέρει από το μέγεθος στο Xcode Organizer;

Xcode Organizer εμφανίζει estimated size — εκτιμώμενο μέγεθος χωρίς να λαμβάνει υπόψη την πραγματική κοπή στους διακομιστές Apple. Το App Store Connect εμφανίζει το πραγματικό μέγεθος μετά το Slicing, το οποίο μπορεί να είναι 10-15% μικρότερο από την εκτίμηση, επειδή ο διακομιστής εφαρμόζει πρόσθετες βελτιστοποιήσεις (αλγόριθμοι συμπίεσης LZFSE, Zstandard) που δεν είναι διαθέσιμες τοπικά.

Το Slicing υποστηρίζει πόρους SwiftUI;

Ναι, το Slicing είναι πλήρως συμβατό με SwiftUI. Asset Catalogs χρησιμοποιούνται από το SwiftUI μέσω των τύπων Image, Color, SymbolImage. Το Slicing εφαρμόζεται σε διανυσματικές και ραστεροποιημένες εικόνες, σύμβολα SF Symbols και shader Metal, ανεξάρτητα από το αν χρησιμοποιείται SwiftUI ή UIKit για την κατασκευή της διεπαφής.

Σύνοψη

  • Slicing — μηχανισμός κοπής δυαδικού αρχείου στην πλευρά App Store που αφαιρεί περιττούς πόρους για συγκεκριμένη συσκευή
  • Τρεις διαστάσεις κοπής: αρχιτεκτονική CPU (arm64/arm64e), ανάλυση οθόνης (@2x/@3x) και οικογένεια GPU (Metal)
  • Asset Catalogs — το κύριο εργαλείο διαχείρισης πόρων που συμμετέχουν στο Slicing
  • App Store παραδίδει μόνο τους πόρους που αντιστοιχούν στο μοντέλο συσκευής, την έκδοση iOS και τον τύπο σύνδεσης
  • Xcode Organizer και App Store Connect δείχνουν μεγέθη τεμαχίων για όλες τις υποστηριζόμενες διαμορφώσεις
  • App-size εργαλείο από Xcode CL Tools επιτρέπει τον έλεγχο αποδοτικότητας Slicing σε CI/CD
  • TestFlight υποστηρίζει επίσης Slicing, σε αντίθεση με τη διανομή Enterprise και Ad Hoc

Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση

Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης