metadidomi-builder 1.5.2411250404 → 1.7.3101261533
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +185 -776
- package/build_tools_py/build_nsis_installer.py +1054 -19
- package/build_tools_py/builder.py +3 -3
- package/build_tools_py/compile_launcher_with_entry.py +19 -271
- package/build_tools_py/launcher_integration.py +19 -189
- package/build_tools_py/pyMetadidomi/__pycache__/pyMetadidomi.cpython-311.pyc +0 -0
- package/build_tools_py/pyMetadidomi/pyMetadidomi.py +3 -3
- package/package.json +7 -5
- package/build_tools/backup-manager.js +0 -3
- package/build_tools/build_apk.js +0 -3
- package/build_tools/builder.js +0 -2
- package/build_tools/certs/cert-65198130.key +0 -1
- package/build_tools/certs/cert-65198130.pfx +0 -0
- package/build_tools/certs/cert-f1fad9b5.key +0 -1
- package/build_tools/certs/cert-f1fad9b5.pfx +0 -0
- package/build_tools/commands-help.js +0 -465
- package/build_tools/create-example-app.js +0 -73
- package/build_tools/decrypt_pfx_password.js +0 -26
- package/build_tools/diagnose-apk.js +0 -61
- package/build_tools/generate-icons.js +0 -3
- package/build_tools/generate-resources.js +0 -3
- package/build_tools/prune_modules.js +0 -147
- package/build_tools/restore-resources.js +0 -3
- package/build_tools/signing.js +0 -20
- package/build_tools/templates/bootstrap.template.js +0 -78
- package/build_tools/templates/default.ico +0 -1
- package/build_tools/templates/nsis_template.nsi +0 -380
- package/build_tools/templates/security_addons.js +0 -60
- package/build_tools/templates/sfx_config.txt.tpl +0 -5
- package/build_tools/test_sign_with_vendor.js +0 -35
- package/build_tools/upx_advanced.js +0 -68
package/README.md
CHANGED
|
@@ -17,18 +17,19 @@
|
|
|
17
17
|
4. **[Configuration](#-configuration)** - Personnalisation
|
|
18
18
|
5. **[Modes de Construction](#-modes-de-construction)** - Options de build
|
|
19
19
|
6. **[Gestion des Dépendances](#-gestion-des-dépendances)** - Electron et Python
|
|
20
|
-
7. **[
|
|
21
|
-
8. **[
|
|
22
|
-
9. **[
|
|
23
|
-
10. **[
|
|
24
|
-
11. **[
|
|
25
|
-
12. **[
|
|
20
|
+
7. **[Build APK Android](#-build-apk-android)** - Construction d'APK
|
|
21
|
+
8. **[Protection du Code](#-système-de-protection-avancé)** - Sécurité
|
|
22
|
+
9. **[Utilisation de jsMetadidomi](#-utilisation-de-jsmetadidomi)** - Protection JavaScript
|
|
23
|
+
10. **[Packaging Python](#-packaging-dapplications-python)** - Applications Python
|
|
24
|
+
11. **[Comparaison](#-comparaison-avec-electron-builder)** - vs electron-builder
|
|
25
|
+
12. **[Roadmap](#-roadmap---vision-multi-plateforme)** - Futures versions
|
|
26
|
+
13. **[Support](#-support-et-contribution)** - Aide et contact
|
|
26
27
|
|
|
27
28
|
---
|
|
28
29
|
|
|
29
30
|
## 💝 À Propos
|
|
30
31
|
|
|
31
|
-
Constructeur **professionnel** pour applications Electron et Python
|
|
32
|
+
Constructeur **professionnel** pour applications Electron et Python :
|
|
32
33
|
- ✅ **Sécurité maximale** - Chiffrement AES-256, bytecode, obfuscation
|
|
33
34
|
- ✅ **Builds reproductibles** - 100% déterministe et offline
|
|
34
35
|
- ✅ **Customisation totale** - Contrôle complet du processus
|
|
@@ -60,7 +61,7 @@ npm install
|
|
|
60
61
|
Si lors de l'installation le dossier `build_tools/vendor` n'est pas présent, suivez ces instructions :
|
|
61
62
|
|
|
62
63
|
. Téléchargez le fichier `vendor.zip` depuis :
|
|
63
|
-
https://github.com/METADIDOMIOFFICIEL/Metadidomi-Builder/releases/download/1.3.171125/vendor.
|
|
64
|
+
https://github.com/METADIDOMIOFFICIEL/Metadidomi-Builder/releases/download/1.3.171125/vendor.zi
|
|
64
65
|
|
|
65
66
|
En suite télécharger le kit Android:
|
|
66
67
|
https://github.com/METADIDOMIOFFICIEL/Metadidomi-Builder/releases/download/Android.zip/android.zip
|
|
@@ -512,6 +513,68 @@ mon-app/
|
|
|
512
513
|
- ✅ **Empaquetage ASAR récursif** - Tous les fichiers inclus à tous les niveaux
|
|
513
514
|
- ✅ **Gestion Python** - Support applications Python standalone
|
|
514
515
|
|
|
516
|
+
# 📱 Build APK Android
|
|
517
|
+
|
|
518
|
+
Construisez facilement des applications Android APK avec le builder.
|
|
519
|
+
|
|
520
|
+
### Démarrage Rapide
|
|
521
|
+
```powershell
|
|
522
|
+
# Depuis votre dossier d'application Android
|
|
523
|
+
cd D:\mon-app-android
|
|
524
|
+
node D:\chemin-vers\metadidomi-builder\build_tools\build_apk.js release
|
|
525
|
+
|
|
526
|
+
# Résultat: ./app/build/outputs/apk/release/app-release.apk
|
|
527
|
+
```
|
|
528
|
+
|
|
529
|
+
### Commandes Disponibles (Direct)
|
|
530
|
+
```powershell
|
|
531
|
+
# Build debug (chemin complet)
|
|
532
|
+
node D:\chemin-vers\metadidomi-builder\build_tools\build_apk.js debug
|
|
533
|
+
|
|
534
|
+
# Build release (chemin complet)
|
|
535
|
+
node D:\chemin-vers\metadidomi-builder\build_tools\build_apk.js release
|
|
536
|
+
|
|
537
|
+
# Mode offline
|
|
538
|
+
node D:\chemin-vers\metadidomi-builder\build_tools\build_apk.js release --offline
|
|
539
|
+
|
|
540
|
+
# Nettoyer
|
|
541
|
+
node D:\chemin-vers\metadidomi-builder\build_tools\build_apk.js clean
|
|
542
|
+
```
|
|
543
|
+
|
|
544
|
+
### Configuration npm (package.json)
|
|
545
|
+
|
|
546
|
+
Créez ou modifiez votre `package.json` avec les scripts appropriés :
|
|
547
|
+
|
|
548
|
+
```json
|
|
549
|
+
{
|
|
550
|
+
"name": "mon-app-android",
|
|
551
|
+
"version": "1.0.0",
|
|
552
|
+
"description": "Application Android",
|
|
553
|
+
"scripts": {
|
|
554
|
+
"build:debug": "node node_modules/metadidomi-builder/build_tools/build_apk.js debug",
|
|
555
|
+
"build:release": "node node_modules/metadidomi-builder/build_tools/build_apk.js release",
|
|
556
|
+
"build:offline": "node node_modules/metadidomi-builder/build_tools/build_apk.js debug --offline",
|
|
557
|
+
"build:release:offline": "node node_modules/metadidomi-builder/build_tools/build_apk.js release --offline",
|
|
558
|
+
"clean": "node node_modules/metadidomi-builder/build_tools/build_apk.js clean"
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
```
|
|
562
|
+
|
|
563
|
+
Puis exécutez :
|
|
564
|
+
```powershell
|
|
565
|
+
npm run build:release
|
|
566
|
+
```
|
|
567
|
+
|
|
568
|
+
### Fonctionnalités
|
|
569
|
+
- ✅ Support Gradle automatique
|
|
570
|
+
- ✅ Signature APK (debug et release)
|
|
571
|
+
- ✅ ZipAlign optimisation
|
|
572
|
+
- ✅ Génération AAB bundle
|
|
573
|
+
- ✅ Mode offline complète
|
|
574
|
+
- ✅ JDK et Android SDK vendorisés
|
|
575
|
+
|
|
576
|
+
---
|
|
577
|
+
|
|
515
578
|
# 🛡️ Système de Protection Avancé
|
|
516
579
|
|
|
517
580
|
Le builder intègre un **système complet de protection du code** avec obfuscation intelligente, chiffrement multi-couches, et anti-analyse.
|
|
@@ -548,6 +611,58 @@ node build_tools/builder.js --heavy-protection
|
|
|
548
611
|
|
|
549
612
|
👉 **[📖 Documentation complète des protections →](build_tools_py/PROTECTION_COMMANDS.md)**
|
|
550
613
|
|
|
614
|
+
---
|
|
615
|
+
|
|
616
|
+
## 🚀 Utilisation de jsMetadidomi
|
|
617
|
+
|
|
618
|
+
**jsMetadidomi** est l'outil de protection JavaScript/HTML du builder. Il obfusque et chiffre votre code avec des couches de sécurité avancées.
|
|
619
|
+
|
|
620
|
+
### Démarrage Rapide
|
|
621
|
+
|
|
622
|
+
#### Protéger un Fichier Individuel
|
|
623
|
+
```powershell
|
|
624
|
+
# Protéger un fichier JavaScript
|
|
625
|
+
node node_modules/metadidomi-builder/build_tools/jsMetadidomi/protect.js mon-script.js dossier-sortie light
|
|
626
|
+
|
|
627
|
+
# Protéger un fichier HTML
|
|
628
|
+
node node_modules/metadidomi-builder/build_tools/jsMetadidomi/protect.js page.html dossier-sortie light
|
|
629
|
+
```
|
|
630
|
+
|
|
631
|
+
#### Protéger un Dossier Complet
|
|
632
|
+
```powershell
|
|
633
|
+
# Protéger tous les fichiers d'un dossier
|
|
634
|
+
node node_modules/metadidomi-builder/build_tools/jsMetadidomi/protect.js src protected-output medium
|
|
635
|
+
```
|
|
636
|
+
|
|
637
|
+
### Niveaux de Protection
|
|
638
|
+
|
|
639
|
+
| Niveau | Description | Cas d'usage |
|
|
640
|
+
|--------|-------------|-----------|
|
|
641
|
+
| **light** | Obfuscation basique + loader | Développement, tests rapides |
|
|
642
|
+
| **medium** | Obfuscation + anti-debug + dead code | Production standard |
|
|
643
|
+
|
|
644
|
+
### Résultat de la Protection
|
|
645
|
+
|
|
646
|
+
Une fois la protection complétée, vous obtenez :
|
|
647
|
+
- 📄 **Fichiers protégés** - Code obfusqué et chiffré
|
|
648
|
+
- 🔑 **jsloader.js** - Loader de déchiffrement (généré automatiquement)
|
|
649
|
+
|
|
650
|
+
**⚠️ Important** : Distribuez le `jsloader.js` généré avec vos fichiers protégés. Le loader contient les clés et le bytecode nécessaires au déchiffrement.
|
|
651
|
+
|
|
652
|
+
### Utilisation Programmatique
|
|
653
|
+
|
|
654
|
+
```javascript
|
|
655
|
+
const { obfuscateFile, obfuscateApp } = require('metadidomi-builder/build_tools/jsMetadidomi/jsMetadidomi.js');
|
|
656
|
+
|
|
657
|
+
// Protéger un fichier
|
|
658
|
+
obfuscateFile('mon-script.js', 'dossier-sortie', 'light', true);
|
|
659
|
+
|
|
660
|
+
// Protéger un dossier
|
|
661
|
+
obfuscateApp('src', 'protected-output', 'medium', true);
|
|
662
|
+
```
|
|
663
|
+
|
|
664
|
+
---
|
|
665
|
+
|
|
551
666
|
## Construction LITE (optimisation)
|
|
552
667
|
```powershell
|
|
553
668
|
$env:LITE_BUILD="true"
|
|
@@ -1164,6 +1279,31 @@ AUTHOR = "Votre Entreprise"
|
|
|
1164
1279
|
ENTRY = "__main__"
|
|
1165
1280
|
```
|
|
1166
1281
|
|
|
1282
|
+
### ⚠️ Point d'Entrée Unique (IMPORTANT)
|
|
1283
|
+
|
|
1284
|
+
Le builder utilise **un seul point d'entrée**, celui défini dans la clé `ENTRY` de `config.py`.
|
|
1285
|
+
|
|
1286
|
+
- ✅ **Seul le fichier défini dans `ENTRY`** sera utilisé comme point d'entrée principal
|
|
1287
|
+
- ❌ Les autres fichiers d'entrée potentiels (`main.py`, `app.py`, etc.) seront **ignorés et non embarqués** dans le launcher
|
|
1288
|
+
- 🔒 Cela garantit qu'il n'y a **aucune ambiguïté** sur le point d'entrée réel
|
|
1289
|
+
|
|
1290
|
+
**Exemple :**
|
|
1291
|
+
```python
|
|
1292
|
+
# Si vous définissez dans config.py:
|
|
1293
|
+
ENTRY = "app_launcher"
|
|
1294
|
+
|
|
1295
|
+
# Alors SEUL app_launcher.py sera utilisé comme point d'entrée
|
|
1296
|
+
# Les fichiers main.py, __main__.py, app.py seront complètement ignorés
|
|
1297
|
+
```
|
|
1298
|
+
|
|
1299
|
+
**Comportement du builder :**
|
|
1300
|
+
1. Lit la clé `ENTRY` dans `config.py`
|
|
1301
|
+
2. Cherche le fichier correspondant (ex: `app_launcher.py`)
|
|
1302
|
+
3. L'embarque dans le launcher compilé
|
|
1303
|
+
4. **Exclut tous les autres fichiers Python d'entrée** du payload
|
|
1304
|
+
|
|
1305
|
+
Cela évite les conflits et les comportements imprévisibles dus à plusieurs points d'entrée.
|
|
1306
|
+
|
|
1167
1307
|
### 📝 Exemple : __main__.py Minimal
|
|
1168
1308
|
|
|
1169
1309
|
```python
|
|
@@ -1271,6 +1411,43 @@ python builder.py --gui
|
|
|
1271
1411
|
| `--gui` | Compiler en mode GUI (pas de console) | `--gui` |
|
|
1272
1412
|
| `--no-pyc` | Ne pas compiler les .py en .pyc | `--no-pyc` |
|
|
1273
1413
|
| `--key <clé>` | Clé de chiffrement personnalisée | `--key ma-clé` |
|
|
1414
|
+
| `--python-embed <chemin>` | Python embeddable personnalisé | `--python-embed D:\python-embed-amd64` |
|
|
1415
|
+
|
|
1416
|
+
### 🐍 Utilisation d'un Python Embeddable Personnalisé
|
|
1417
|
+
|
|
1418
|
+
Le paramètre `--python-embed` permet d'utiliser votre propre distribution Python embeddable au lieu de celle par défaut. Cela est utile pour :
|
|
1419
|
+
- ✅ Utiliser une version Python différente
|
|
1420
|
+
- ✅ Utiliser un Python pré-configuré avec vos dépendances
|
|
1421
|
+
- ✅ Optimiser la taille du package final
|
|
1422
|
+
- ✅ Builds reproductibles avec un Python maîtrisé
|
|
1423
|
+
|
|
1424
|
+
**Utilisation :**
|
|
1425
|
+
|
|
1426
|
+
```powershell
|
|
1427
|
+
# Utiliser un Python embeddable personnalisé
|
|
1428
|
+
python builder.py --python-embed D:\python-embed-amd64
|
|
1429
|
+
|
|
1430
|
+
# Combiné avec d'autres paramètres
|
|
1431
|
+
python builder.py --app-src D:\mon-app --output D:\dist --python-embed D:\python-embed-amd64 --gui
|
|
1432
|
+
|
|
1433
|
+
# Via variable d'environnement
|
|
1434
|
+
$env:PYTHON_EMBED = "D:\python-embed-amd64"
|
|
1435
|
+
python builder.py
|
|
1436
|
+
```
|
|
1437
|
+
|
|
1438
|
+
**Structure attendue du dossier Python embeddable :**
|
|
1439
|
+
|
|
1440
|
+
```
|
|
1441
|
+
python-embed-amd64/
|
|
1442
|
+
├── python.exe ← Exécutable Python principal
|
|
1443
|
+
├── python311.dll ← Librairie Python
|
|
1444
|
+
├── Lib/ ← Librairies standard Python
|
|
1445
|
+
├── DLLs/ ← DLLs compilées
|
|
1446
|
+
├── Scripts/ ← Scripts exécutables
|
|
1447
|
+
└── site-packages/ ← Packages tiers installés
|
|
1448
|
+
```
|
|
1449
|
+
|
|
1450
|
+
**Important :** Assurez-vous que votre dossier Python embeddable contient tous les fichiers standards et que les dépendances requises sont installées dans `site-packages/`.
|
|
1274
1451
|
|
|
1275
1452
|
### 💾 Architecture du Packaging Python
|
|
1276
1453
|
|
|
@@ -1557,774 +1734,6 @@ Python Embeddable distribution not found
|
|
|
1557
1734
|
```
|
|
1558
1735
|
**✅ SOLUTION:** Vérifiez le dossier `build_tools/vendor/python_embeddable/`
|
|
1559
1736
|
|
|
1560
|
-
---
|
|
1561
|
-
# Metadidomi Crone - Générateur d'APK Android
|
|
1562
|
-
|
|
1563
|
-
Une solution complète et automatisée pour créer des applications Android (APK) sans besoin de connaissances avancées en Android Studio.
|
|
1564
|
-
|
|
1565
|
-
<a id="top"></a>
|
|
1566
|
-
|
|
1567
|
-
## 📋 Table des matières
|
|
1568
|
-
|
|
1569
|
-
- [Installation rapide](#installation-rapide)
|
|
1570
|
-
- [Structure d'un projet](#structure-dun-projet)
|
|
1571
|
-
- [Créer une nouvelle application](#créer-une-nouvelle-application)
|
|
1572
|
-
- [Configuration de l'application](#configuration-de-lapplication)
|
|
1573
|
-
- [Générer l'APK](#générer-lapk)
|
|
1574
|
-
- [Exemples](#exemples)
|
|
1575
|
-
- [Dépannage](#dépannage)
|
|
1576
|
-
- [Options avancées](#options-avancées)
|
|
1577
|
-
|
|
1578
|
-
---
|
|
1579
|
-
|
|
1580
|
-
## Installation rapide
|
|
1581
|
-
|
|
1582
|
-
🔝 [Retour en haut](#top)
|
|
1583
|
-
|
|
1584
|
-
### Prérequis
|
|
1585
|
-
|
|
1586
|
-
- **Node.js** (v14 ou supérieur) - [Télécharger](https://nodejs.org)
|
|
1587
|
-
- **PowerShell** (Windows) ou **Bash** (Mac/Linux)
|
|
1588
|
-
- **Python 3** (pour la génération d'icônes) - [Télécharger](https://www.python.org)
|
|
1589
|
-
- **Pillow** (PIL) pour Python : `pip install Pillow`
|
|
1590
|
-
|
|
1591
|
-
### Vérifier l'installation
|
|
1592
|
-
|
|
1593
|
-
```powershell
|
|
1594
|
-
node --version
|
|
1595
|
-
python --version
|
|
1596
|
-
npm --version
|
|
1597
|
-
```
|
|
1598
|
-
|
|
1599
|
-
### Installation via npm (Recommandé)
|
|
1600
|
-
|
|
1601
|
-
Installez metadidomi-builder comme dépendance locale dans votre projet :
|
|
1602
|
-
|
|
1603
|
-
```powershell
|
|
1604
|
-
|
|
1605
|
-
npm install metadidomi-builder
|
|
1606
|
-
```
|
|
1607
|
-
|
|
1608
|
-
Créez un `package.json` à la racine de votre projet :
|
|
1609
|
-
|
|
1610
|
-
```json
|
|
1611
|
-
{
|
|
1612
|
-
"name": "mon-app-android",
|
|
1613
|
-
"version": "1.0.0",
|
|
1614
|
-
"scripts": {
|
|
1615
|
-
"build": "node node_modules/metadidomi-builder/build_tools/build_apk.js .",
|
|
1616
|
-
"build-debug": "node node_modules/metadidomi-builder/build_tools/build_apk.js . --fail-on-missing",
|
|
1617
|
-
"build-restore": "node node_modules/metadidomi-builder/build_tools/build_apk.js . --restore",
|
|
1618
|
-
"build-icons": "node node_modules/metadidomi-builder/build_tools/generate-icons.js ."
|
|
1619
|
-
},
|
|
1620
|
-
"keywords": [
|
|
1621
|
-
"android",
|
|
1622
|
-
"apk",
|
|
1623
|
-
"builder"
|
|
1624
|
-
],
|
|
1625
|
-
"author": "Metadidomi",
|
|
1626
|
-
"license": "MIT",
|
|
1627
|
-
"dependencies": {
|
|
1628
|
-
"metadidomi-builder": "file:../metadidomi-builder",
|
|
1629
|
-
"sharp": "^0.32.0"
|
|
1630
|
-
}
|
|
1631
|
-
}
|
|
1632
|
-
```
|
|
1633
|
-
|
|
1634
|
-
Puis installez et lancez le build :
|
|
1635
|
-
|
|
1636
|
-
```powershell
|
|
1637
|
-
npm install
|
|
1638
|
-
npm run build
|
|
1639
|
-
```
|
|
1640
|
-
|
|
1641
|
-
---
|
|
1642
|
-
|
|
1643
|
-
## Structure d'un projet
|
|
1644
|
-
|
|
1645
|
-
🔝 [Retour en haut](#top)
|
|
1646
|
-
|
|
1647
|
-
Chaque application Android doit suivre cette structure :
|
|
1648
|
-
|
|
1649
|
-
```
|
|
1650
|
-
MonApp/
|
|
1651
|
-
├── app-config.json # Configuration de l'app
|
|
1652
|
-
├── AndroidManifest.xml # Déclaration Android (généré automatiquement)
|
|
1653
|
-
├── src/
|
|
1654
|
-
│ └── com/example/monapp/
|
|
1655
|
-
│ └── MainActivity.java # Code Java principal
|
|
1656
|
-
├── res/
|
|
1657
|
-
│ ├── layout/
|
|
1658
|
-
│ │ └── activity_main.xml # Interface utilisateur
|
|
1659
|
-
│ ├── values/
|
|
1660
|
-
│ │ ├── strings.xml # Textes et traductions
|
|
1661
|
-
│ │ ├── colors.xml # Couleurs
|
|
1662
|
-
│ │ └── styles.xml # Styles et thèmes
|
|
1663
|
-
│ ├── mipmap-hdpi/
|
|
1664
|
-
│ │ └── ic_launcher.png # Icône de l'app (auto-générée)
|
|
1665
|
-
│ └── drawable/ # Images supplémentaires (optionnel)
|
|
1666
|
-
└── build/ # Généré automatiquement (à ignorer)
|
|
1667
|
-
```
|
|
1668
|
-
|
|
1669
|
-
---
|
|
1670
|
-
|
|
1671
|
-
## Créer une nouvelle application
|
|
1672
|
-
|
|
1673
|
-
### Étape 1 : Créer la structure des dossiers
|
|
1674
|
-
|
|
1675
|
-
🔝 [Retour en haut](#top)
|
|
1676
|
-
|
|
1677
|
-
```powershell
|
|
1678
|
-
mkdir MonApp\src\com\example\monapp
|
|
1679
|
-
mkdir MonApp\res\layout
|
|
1680
|
-
mkdir MonApp\res\values
|
|
1681
|
-
mkdir MonApp\res\mipmap-hdpi
|
|
1682
|
-
```
|
|
1683
|
-
|
|
1684
|
-
### Étape 2 : Créer `app-config.json`
|
|
1685
|
-
|
|
1686
|
-
Ce fichier contient toutes les informations de votre application.
|
|
1687
|
-
|
|
1688
|
-
```json
|
|
1689
|
-
{
|
|
1690
|
-
"appName": "MonApp",
|
|
1691
|
-
"appVersion": "1.0.0",
|
|
1692
|
-
"appDescription": "Ma première application Android",
|
|
1693
|
-
"packageName": "com.example.monapp",
|
|
1694
|
-
"minSdkVersion": 21,
|
|
1695
|
-
"targetSdkVersion": 34,
|
|
1696
|
-
"colors": {
|
|
1697
|
-
"primary": "#2196F3",
|
|
1698
|
-
"primaryDark": "#1976D2",
|
|
1699
|
-
"accent": "#FF5722"
|
|
1700
|
-
}
|
|
1701
|
-
}
|
|
1702
|
-
```
|
|
1703
|
-
|
|
1704
|
-
**Explications des paramètres :**
|
|
1705
|
-
- `appName` : Nom affiché de l'application
|
|
1706
|
-
- `appVersion` : Version sémantique (majeur.mineur.patch)
|
|
1707
|
-
- `packageName` : Identifiant unique (format domaine inversé)
|
|
1708
|
-
- `minSdkVersion` : Version Android minimale (21 = Android 5.0)
|
|
1709
|
-
- `targetSdkVersion` : Version Android ciblée (34 = Android 14)
|
|
1710
|
-
- `colors` : Couleurs principales (format hexadécimal)
|
|
1711
|
-
|
|
1712
|
-
### Étape 3 : Créer l'interface (`activity_main.xml`)
|
|
1713
|
-
|
|
1714
|
-
Fichier : `res/layout/activity_main.xml`
|
|
1715
|
-
|
|
1716
|
-
```xml
|
|
1717
|
-
<?xml version="1.0" encoding="utf-8"?>
|
|
1718
|
-
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
1719
|
-
android:orientation="vertical"
|
|
1720
|
-
android:layout_width="match_parent"
|
|
1721
|
-
android:layout_height="match_parent"
|
|
1722
|
-
android:gravity="center"
|
|
1723
|
-
android:padding="16dp">
|
|
1724
|
-
|
|
1725
|
-
<TextView
|
|
1726
|
-
android:id="@+id/titleText"
|
|
1727
|
-
android:layout_width="wrap_content"
|
|
1728
|
-
android:layout_height="wrap_content"
|
|
1729
|
-
android:text="Bienvenue dans MonApp"
|
|
1730
|
-
android:textSize="24sp"
|
|
1731
|
-
android:textStyle="bold" />
|
|
1732
|
-
|
|
1733
|
-
<Button
|
|
1734
|
-
android:id="@+id/myButton"
|
|
1735
|
-
android:layout_width="wrap_content"
|
|
1736
|
-
android:layout_height="wrap_content"
|
|
1737
|
-
android:text="Appuyez-moi"
|
|
1738
|
-
android:layout_marginTop="16dp" />
|
|
1739
|
-
|
|
1740
|
-
</LinearLayout>
|
|
1741
|
-
```
|
|
1742
|
-
|
|
1743
|
-
### Étape 4 : Créer les textes (`strings.xml`)
|
|
1744
|
-
|
|
1745
|
-
Fichier : `res/values/strings.xml`
|
|
1746
|
-
|
|
1747
|
-
```xml
|
|
1748
|
-
<resources>
|
|
1749
|
-
<string name="app_name">MonApp</string>
|
|
1750
|
-
<string name="app_version">1.0.0</string>
|
|
1751
|
-
<string name="app_description">Ma première application</string>
|
|
1752
|
-
<string name="hello_world">Bienvenue</string>
|
|
1753
|
-
<string name="action_settings">Paramètres</string>
|
|
1754
|
-
<string name="back">Retour</string>
|
|
1755
|
-
<string name="forward">Suivant</string>
|
|
1756
|
-
<string name="reload">Recharger</string>
|
|
1757
|
-
</resources>
|
|
1758
|
-
```
|
|
1759
|
-
|
|
1760
|
-
### Étape 5 : Créer le code Java (`MainActivity.java`)
|
|
1761
|
-
|
|
1762
|
-
Fichier : `src/com/example/monapp/MainActivity.java`
|
|
1763
|
-
|
|
1764
|
-
```java
|
|
1765
|
-
package com.example.monapp;
|
|
1766
|
-
|
|
1767
|
-
import android.app.Activity;
|
|
1768
|
-
import android.os.Bundle;
|
|
1769
|
-
import android.widget.Button;
|
|
1770
|
-
import android.widget.Toast;
|
|
1771
|
-
import android.view.View;
|
|
1772
|
-
import android.util.Log;
|
|
1773
|
-
|
|
1774
|
-
public class MainActivity extends Activity {
|
|
1775
|
-
private static final String TAG = "MonApp";
|
|
1776
|
-
|
|
1777
|
-
@Override
|
|
1778
|
-
protected void onCreate(Bundle savedInstanceState) {
|
|
1779
|
-
super.onCreate(savedInstanceState);
|
|
1780
|
-
setContentView(R.layout.activity_main);
|
|
1781
|
-
Log.d(TAG, "MainActivity créée");
|
|
1782
|
-
|
|
1783
|
-
Button myButton = (Button) findViewById(R.id.myButton);
|
|
1784
|
-
myButton.setOnClickListener(new View.OnClickListener() {
|
|
1785
|
-
@Override
|
|
1786
|
-
public void onClick(View v) {
|
|
1787
|
-
Toast.makeText(MainActivity.this, "Bouton cliqué!", Toast.LENGTH_SHORT).show();
|
|
1788
|
-
Log.d(TAG, "Bouton cliqué");
|
|
1789
|
-
}
|
|
1790
|
-
});
|
|
1791
|
-
}
|
|
1792
|
-
}
|
|
1793
|
-
```
|
|
1794
|
-
|
|
1795
|
-
### Étape 6 : Ajouter une icône
|
|
1796
|
-
|
|
1797
|
-
Placez une image PNG (96x96 pixels) dans `res/mipmap/`.
|
|
1798
|
-
|
|
1799
|
-
**Le système générera automatiquement les variantes pour tous les écrans.**
|
|
1800
|
-
|
|
1801
|
-
---
|
|
1802
|
-
|
|
1803
|
-
## Configuration de l'application
|
|
1804
|
-
|
|
1805
|
-
🔝 [Retour en haut](#top)
|
|
1806
|
-
|
|
1807
|
-
### `app-config.json` complet
|
|
1808
|
-
|
|
1809
|
-
```json
|
|
1810
|
-
{
|
|
1811
|
-
"appName": "MonApp",
|
|
1812
|
-
"appVersion": "1.0.0",
|
|
1813
|
-
"appDescription": "Ma première application Android",
|
|
1814
|
-
"packageName": "com.example.monapp",
|
|
1815
|
-
"minSdkVersion": 21,
|
|
1816
|
-
"targetSdkVersion": 34,
|
|
1817
|
-
"colors": {
|
|
1818
|
-
"primary": "#2196F3",
|
|
1819
|
-
"primaryDark": "#1976D2",
|
|
1820
|
-
"accent": "#FF5722"
|
|
1821
|
-
},
|
|
1822
|
-
"minimalRequiredFiles": [
|
|
1823
|
-
"AndroidManifest.xml",
|
|
1824
|
-
"res/values/strings.xml",
|
|
1825
|
-
"res/values/styles.xml",
|
|
1826
|
-
"res/layout/activity_main.xml"
|
|
1827
|
-
]
|
|
1828
|
-
}
|
|
1829
|
-
```
|
|
1830
|
-
|
|
1831
|
-
---
|
|
1832
|
-
|
|
1833
|
-
## Générer l'APK
|
|
1834
|
-
|
|
1835
|
-
🔝 [Retour en haut](#top)
|
|
1836
|
-
|
|
1837
|
-
### Avec npm
|
|
1838
|
-
|
|
1839
|
-
```powershell
|
|
1840
|
-
# Build standard
|
|
1841
|
-
npm run build
|
|
1842
|
-
|
|
1843
|
-
# Build avec vérification stricte
|
|
1844
|
-
npm run build-debug
|
|
1845
|
-
|
|
1846
|
-
# Générer les icônes
|
|
1847
|
-
npm run build-icons
|
|
1848
|
-
```
|
|
1849
|
-
|
|
1850
|
-
### Sans sauvegarde
|
|
1851
|
-
|
|
1852
|
-
```powershell
|
|
1853
|
-
node "metadidomi-builder\build_tools\build_apk.js" "MonApp" --no-backup
|
|
1854
|
-
```
|
|
1855
|
-
|
|
1856
|
-
### Restaurer depuis une sauvegarde
|
|
1857
|
-
|
|
1858
|
-
```powershell
|
|
1859
|
-
node "metadidomi-builder\build_tools\build_apk.js" "MonApp" --restore
|
|
1860
|
-
```
|
|
1861
|
-
|
|
1862
|
-
### Résultat
|
|
1863
|
-
|
|
1864
|
-
Après une génération réussie, vous trouverez :
|
|
1865
|
-
|
|
1866
|
-
```
|
|
1867
|
-
MonApp/
|
|
1868
|
-
└── MonApp.apk ← Votre application, prête à installer!
|
|
1869
|
-
```
|
|
1870
|
-
|
|
1871
|
-
Fichier de sortie : `MonApp/MonApp.apk`
|
|
1872
|
-
|
|
1873
|
-
**Taille typique :** 2-5 MB
|
|
1874
|
-
|
|
1875
|
-
---
|
|
1876
|
-
|
|
1877
|
-
## Exemples
|
|
1878
|
-
|
|
1879
|
-
🔝 [Retour en haut](#top)
|
|
1880
|
-
|
|
1881
|
-
### Exemple 1 : Application Compteur
|
|
1882
|
-
|
|
1883
|
-
Voir le dossier `CounterApp/` pour un exemple complet d'une application de compteur avec :
|
|
1884
|
-
- Boutons d'incrémentation/décrémentation
|
|
1885
|
-
- Affichage d'un compteur
|
|
1886
|
-
- Interface colorée
|
|
1887
|
-
|
|
1888
|
-
### Exemple 2 : Application Simple
|
|
1889
|
-
|
|
1890
|
-
Consultez `MyApp/` pour une application de base.
|
|
1891
|
-
|
|
1892
|
-
### Exemple 3 : Application Avancée
|
|
1893
|
-
|
|
1894
|
-
`MyApp_Advanced/` contient des fonctionnalités plus complexes.
|
|
1895
|
-
|
|
1896
|
-
---
|
|
1897
|
-
|
|
1898
|
-
## Dépannage
|
|
1899
|
-
|
|
1900
|
-
🔝 [Retour en haut](#top)
|
|
1901
|
-
|
|
1902
|
-
### Erreur : "Aucun fichier Java trouvé"
|
|
1903
|
-
|
|
1904
|
-
**Cause** : Le dossier `src/` est vide ou mal structuré.
|
|
1905
|
-
|
|
1906
|
-
**Solution** :
|
|
1907
|
-
1. Vérifiez que `MainActivity.java` existe dans `src/com/example/monapp/`
|
|
1908
|
-
2. Vérifiez le nom du package (doit correspondre à `packageName` dans `app-config.json`)
|
|
1909
|
-
|
|
1910
|
-
```
|
|
1911
|
-
src/
|
|
1912
|
-
└── com/example/monapp/
|
|
1913
|
-
└── MainActivity.java ✓ Correct
|
|
1914
|
-
```
|
|
1915
|
-
|
|
1916
|
-
### Erreur : "resource string/... not found"
|
|
1917
|
-
|
|
1918
|
-
**Cause** : Une chaîne de caractères référencée n'existe pas dans `strings.xml`.
|
|
1919
|
-
|
|
1920
|
-
**Solution** :
|
|
1921
|
-
1. Ouvrez `res/values/strings.xml`
|
|
1922
|
-
2. Ajoutez la chaîne manquante avec son ID correct :
|
|
1923
|
-
```xml
|
|
1924
|
-
<string name="fragment1">Fragments</string>
|
|
1925
|
-
<string name="action_click">Cliquez ici</string>
|
|
1926
|
-
```
|
|
1927
|
-
3. **Assurez-vous que le nom correspond exactement** à celui utilisé dans votre layout XML
|
|
1928
|
-
|
|
1929
|
-
**Exemple d'erreur rencontrée (CounterApp) :**
|
|
1930
|
-
```
|
|
1931
|
-
error: resource string/fragment1 not found
|
|
1932
|
-
```
|
|
1933
|
-
**Correction appliquée :**
|
|
1934
|
-
```xml
|
|
1935
|
-
<!-- res/values/strings.xml -->
|
|
1936
|
-
<resources>
|
|
1937
|
-
<string name="app_name">CounterApp</string>
|
|
1938
|
-
<string name="fragment1">Compteur</string>
|
|
1939
|
-
<string name="increment">Incrémenter</string>
|
|
1940
|
-
<string name="decrement">Décrémenter</string>
|
|
1941
|
-
<string name="reset">Réinitialiser</string>
|
|
1942
|
-
</resources>
|
|
1943
|
-
```
|
|
1944
|
-
|
|
1945
|
-
### Erreur : "cannot find symbol: variable R"
|
|
1946
|
-
|
|
1947
|
-
**Cause** : Les ressources n'ont pas été compilées correctement.
|
|
1948
|
-
|
|
1949
|
-
**Solution** :
|
|
1950
|
-
1. Supprimez le dossier `build/`
|
|
1951
|
-
2. Vérifiez que `res/values/strings.xml` est valide (XML bien formé, pas d'accents mal encodés)
|
|
1952
|
-
3. Relancez la génération complète
|
|
1953
|
-
|
|
1954
|
-
### Erreur : "D8 compilation failed" avec "NullPointerException"
|
|
1955
|
-
|
|
1956
|
-
**Cause** : Classes anonymes mal générées lors de la compilation DEX.
|
|
1957
|
-
|
|
1958
|
-
**Symptômes** :
|
|
1959
|
-
```
|
|
1960
|
-
java.lang.NullPointerException: Cannot invoke "String.length()"
|
|
1961
|
-
Exception in thread "main" java.lang.NullPointerException
|
|
1962
|
-
```
|
|
1963
|
-
|
|
1964
|
-
**Solution - Utilisez `implements View.OnClickListener` au lieu de classes anonymes** :
|
|
1965
|
-
|
|
1966
|
-
❌ **INCORRECT (cause l'erreur D8)** :
|
|
1967
|
-
```java
|
|
1968
|
-
button.setOnClickListener(new View.OnClickListener() {
|
|
1969
|
-
@Override
|
|
1970
|
-
public void onClick(View v) {
|
|
1971
|
-
counter++;
|
|
1972
|
-
updateDisplay();
|
|
1973
|
-
}
|
|
1974
|
-
});
|
|
1975
|
-
```
|
|
1976
|
-
|
|
1977
|
-
✅ **CORRECT** :
|
|
1978
|
-
```java
|
|
1979
|
-
public class MainActivity extends Activity implements View.OnClickListener {
|
|
1980
|
-
private Button incrementBtn, decrementBtn;
|
|
1981
|
-
|
|
1982
|
-
@Override
|
|
1983
|
-
public void onClick(View v) {
|
|
1984
|
-
int id = v.getId();
|
|
1985
|
-
if (id == R.id.incrementBtn) counter++;
|
|
1986
|
-
else if (id == R.id.decrementBtn) counter--;
|
|
1987
|
-
}
|
|
1988
|
-
}
|
|
1989
|
-
```
|
|
1990
|
-
|
|
1991
|
-
**Pourquoi** : D8 (compilateur DEX) a des problèmes avec les classes anonymes imbriquées. Les interfaces nommées sont plus fiables.
|
|
1992
|
-
|
|
1993
|
-
### Erreur : "cannot find symbol: variable helloText" ou autre ID de ressource
|
|
1994
|
-
|
|
1995
|
-
**Cause** : Le code Java référence un ID qui n'existe pas dans le layout XML.
|
|
1996
|
-
|
|
1997
|
-
**Symptôme** :
|
|
1998
|
-
```
|
|
1999
|
-
error: cannot find symbol
|
|
2000
|
-
symbol: variable helloText
|
|
2001
|
-
location: class MainActivity
|
|
2002
|
-
```
|
|
2003
|
-
|
|
2004
|
-
**Solution** :
|
|
2005
|
-
1. Vérifiez que l'ID existe dans `res/layout/activity_main.xml` :
|
|
2006
|
-
```xml
|
|
2007
|
-
<TextView
|
|
2008
|
-
android:id="@+id/helloText"
|
|
2009
|
-
...
|
|
2010
|
-
/>
|
|
2011
|
-
```
|
|
2012
|
-
2. Vérifiez que vous utilisez le bon nom en Java :
|
|
2013
|
-
```java
|
|
2014
|
-
TextView helloText = (TextView) findViewById(R.id.helloText);
|
|
2015
|
-
```
|
|
2016
|
-
3. Assurez-vous que l'ID correspond EXACTEMENT (majuscules/minuscules)
|
|
2017
|
-
|
|
2018
|
-
**Exemple de correction (CounterApp)** :
|
|
2019
|
-
```xml
|
|
2020
|
-
<!-- res/layout/activity_main.xml -->
|
|
2021
|
-
<LinearLayout ...>
|
|
2022
|
-
<TextView
|
|
2023
|
-
android:id="@+id/counterDisplay"
|
|
2024
|
-
android:layout_width="match_parent"
|
|
2025
|
-
android:layout_height="wrap_content"
|
|
2026
|
-
android:text="0"
|
|
2027
|
-
android:textSize="72sp" />
|
|
2028
|
-
|
|
2029
|
-
<Button
|
|
2030
|
-
android:id="@+id/incrementBtn"
|
|
2031
|
-
android:text="Incrémenter" />
|
|
2032
|
-
</LinearLayout>
|
|
2033
|
-
```
|
|
2034
|
-
|
|
2035
|
-
### Erreur : "AndroidManifest.xml not found"
|
|
2036
|
-
|
|
2037
|
-
**Cause** : Fichier de configuration critique manquant ou mal généré.
|
|
2038
|
-
|
|
2039
|
-
**Solution** :
|
|
2040
|
-
1. Vérifiez que `app-config.json` existe à la racine du projet
|
|
2041
|
-
2. Assurez-vous que le JSON est valide (syntaxe correcte, pas de virgules manquantes)
|
|
2042
|
-
3. Relancez le build avec l'option `--fail-on-missing` pour diagnostiquer :
|
|
2043
|
-
```powershell
|
|
2044
|
-
node "metadidomi-builder\build_tools\build_apk.js" "MonApp" --fail-on-missing
|
|
2045
|
-
```
|
|
2046
|
-
|
|
2047
|
-
### Erreur : "Fichiers minimums manquants"
|
|
2048
|
-
|
|
2049
|
-
**Cause** : Des fichiers essentiels n'existent pas.
|
|
2050
|
-
|
|
2051
|
-
**Files requises minimales** :
|
|
2052
|
-
- `app-config.json` → Configuration de l'app
|
|
2053
|
-
- `AndroidManifest.xml` → Descripteur (généré automatiquement)
|
|
2054
|
-
- `res/values/strings.xml` → Textes
|
|
2055
|
-
- `res/values/styles.xml` → Styles (généré automatiquement)
|
|
2056
|
-
- `res/layout/activity_main.xml` → Interface utilisateur
|
|
2057
|
-
- `src/com/example/monapp/MainActivity.java` → Code principal
|
|
2058
|
-
|
|
2059
|
-
**Solution** :
|
|
2060
|
-
```powershell
|
|
2061
|
-
# Mode diagnostique - affiche les fichiers manquants sans échouer
|
|
2062
|
-
node "metadidomi-builder\build_tools\build_apk.js" "MonApp"
|
|
2063
|
-
|
|
2064
|
-
# Mode strict - échoue si des fichiers manquent
|
|
2065
|
-
node "metadidomi-builder\build_tools\build_apk.js" "MonApp" --fail-on-missing
|
|
2066
|
-
```
|
|
2067
|
-
|
|
2068
|
-
### L'APK n'est pas généré
|
|
2069
|
-
|
|
2070
|
-
**Cause** : Erreur lors de la signature ou de l'assemblage final.
|
|
2071
|
-
|
|
2072
|
-
**Solution** :
|
|
2073
|
-
1. Supprimez le fichier `.keystore` dans le dossier du projet :
|
|
2074
|
-
```powershell
|
|
2075
|
-
rm "MonApp\.keystore"
|
|
2076
|
-
```
|
|
2077
|
-
2. Relancez la génération (un nouveau keystore sera créé) :
|
|
2078
|
-
```powershell
|
|
2079
|
-
node "metadidomi-builder\build_tools\build_apk.js" "MonApp"
|
|
2080
|
-
```
|
|
2081
|
-
|
|
2082
|
-
### Erreur : "Invalid app-config.json"
|
|
2083
|
-
|
|
2084
|
-
**Cause** : Fichier de configuration mal formé.
|
|
2085
|
-
|
|
2086
|
-
**Vérifiez** :
|
|
2087
|
-
```json
|
|
2088
|
-
{
|
|
2089
|
-
"appName": "MonApp", // ✓ String valide
|
|
2090
|
-
"appVersion": "1.0.0", // ✓ Format sémantique (majeur.mineur.patch)
|
|
2091
|
-
"packageName": "com.example.monapp", // ✓ Format domaine inversé
|
|
2092
|
-
"minSdkVersion": 21, // ✓ Nombre entier >= 21
|
|
2093
|
-
"targetSdkVersion": 34, // ✓ Nombre entier
|
|
2094
|
-
"colors": {
|
|
2095
|
-
"primary": "#2196F3", // ✓ Couleur hexadécimale valide
|
|
2096
|
-
"primaryDark": "#1976D2",
|
|
2097
|
-
"accent": "#FF5722"
|
|
2098
|
-
}
|
|
2099
|
-
}
|
|
2100
|
-
```
|
|
2101
|
-
|
|
2102
|
-
### Erreur : "Layout XML invalide"
|
|
2103
|
-
|
|
2104
|
-
**Cause** : Syntaxe XML incorrecte dans `activity_main.xml`.
|
|
2105
|
-
|
|
2106
|
-
**Vérifiez** :
|
|
2107
|
-
- Les balises ouvrantes et fermantes correspondent (`<LinearLayout>` ... `</LinearLayout>`)
|
|
2108
|
-
- Les attributs android: sont valides
|
|
2109
|
-
- Les IDs sont uniques et bien formatés (`android:id="@+id/monId"`)
|
|
2110
|
-
- Les textes spéciaux sont échappés (`&`, `<`, `>`)
|
|
2111
|
-
|
|
2112
|
-
**Exemple correct** :
|
|
2113
|
-
```xml
|
|
2114
|
-
<?xml version="1.0" encoding="utf-8"?>
|
|
2115
|
-
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
2116
|
-
android:orientation="vertical"
|
|
2117
|
-
android:layout_width="match_parent"
|
|
2118
|
-
android:layout_height="match_parent">
|
|
2119
|
-
|
|
2120
|
-
<Button
|
|
2121
|
-
android:id="@+id/myButton"
|
|
2122
|
-
android:layout_width="wrap_content"
|
|
2123
|
-
android:layout_height="wrap_content"
|
|
2124
|
-
android:text="Cliquez-moi" />
|
|
2125
|
-
|
|
2126
|
-
</LinearLayout>
|
|
2127
|
-
```
|
|
2128
|
-
|
|
2129
|
-
### Erreur : "Icônes manquantes"
|
|
2130
|
-
|
|
2131
|
-
**Cause** : L'icône n'a pas été générée ou redimensionnée correctement.
|
|
2132
|
-
|
|
2133
|
-
**Solution** :
|
|
2134
|
-
1. Placez une image PNG (96x96 pixels minimum) dans `res/drawable/` ou `res/mipmap/`
|
|
2135
|
-
2. Exécutez le générateur d'icônes :
|
|
2136
|
-
```powershell
|
|
2137
|
-
node "metadidomi-builder\build_tools\generate-icons.js" "MonApp"
|
|
2138
|
-
```
|
|
2139
|
-
3. Vérifiez que tous les dossiers mipmap ont été créés :
|
|
2140
|
-
```
|
|
2141
|
-
res/mipmap-mdpi/ic_launcher.png (48x48)
|
|
2142
|
-
res/mipmap-hdpi/ic_launcher.png (72x72)
|
|
2143
|
-
res/mipmap-xhdpi/ic_launcher.png (96x96)
|
|
2144
|
-
res/mipmap-xxhdpi/ic_launcher.png (144x144)
|
|
2145
|
-
res/mipmap-xxxhdpi/ic_launcher.png (192x192)
|
|
2146
|
-
```
|
|
2147
|
-
|
|
2148
|
-
### Erreur : "Package name already exists"
|
|
2149
|
-
|
|
2150
|
-
**Cause** : Un package Android avec le même nom est déjà installé.
|
|
2151
|
-
|
|
2152
|
-
**Solution** :
|
|
2153
|
-
1. Changez le `packageName` dans `app-config.json` :
|
|
2154
|
-
```json
|
|
2155
|
-
"packageName": "com.example.monapp.v2"
|
|
2156
|
-
```
|
|
2157
|
-
2. Régénérez l'APK
|
|
2158
|
-
3. Ou : désinstallez l'ancienne app avant d'installer la nouvelle
|
|
2159
|
-
|
|
2160
|
-
---
|
|
2161
|
-
|
|
2162
|
-
## Options avancées
|
|
2163
|
-
|
|
2164
|
-
🔝 [Retour en haut](#top)
|
|
2165
|
-
|
|
2166
|
-
### Personnaliser les ressources générées automatiquement
|
|
2167
|
-
|
|
2168
|
-
Par défaut, le système génère :
|
|
2169
|
-
- `AndroidManifest.xml` (descripteur de l'app)
|
|
2170
|
-
- `res/values/colors.xml` (couleurs)
|
|
2171
|
-
- `res/values/styles.xml` (thèmes)
|
|
2172
|
-
|
|
2173
|
-
Ces fichiers sont générés à chaque build. Pour les personnaliser, créez-les manuellement et le système les préservera.
|
|
2174
|
-
|
|
2175
|
-
### Ajouter des ressources personnalisées
|
|
2176
|
-
|
|
2177
|
-
```
|
|
2178
|
-
res/
|
|
2179
|
-
├── drawable/ # Images 1x (160 DPI)
|
|
2180
|
-
├── drawable-hdpi/ # Images 1.5x (240 DPI)
|
|
2181
|
-
├── drawable-xhdpi/ # Images 2x (320 DPI)
|
|
2182
|
-
├── drawable-xxhdpi/ # Images 3x (480 DPI)
|
|
2183
|
-
├── drawable-xxxhdpi/ # Images 4x (640 DPI)
|
|
2184
|
-
├── font/ # Polices personnalisées
|
|
2185
|
-
├── menu/ # Menus
|
|
2186
|
-
├── raw/ # Fichiers non compressés
|
|
2187
|
-
└── anim/ # Animations
|
|
2188
|
-
```
|
|
2189
|
-
|
|
2190
|
-
### Générer les icônes automatiquement
|
|
2191
|
-
|
|
2192
|
-
Placez une image source dans `res/drawable/` ou `res/mipmap/` :
|
|
2193
|
-
|
|
2194
|
-
```powershell
|
|
2195
|
-
node "metadidomi-builder\build_tools\generate-icons.js" "MonApp"
|
|
2196
|
-
```
|
|
2197
|
-
|
|
2198
|
-
Le système créera automatiquement les variantes pour tous les écrans :
|
|
2199
|
-
- `mipmap-mdpi` (48×48)
|
|
2200
|
-
- `mipmap-hdpi` (72×72)
|
|
2201
|
-
- `mipmap-xhdpi` (96×96)
|
|
2202
|
-
- `mipmap-xxhdpi` (144×144)
|
|
2203
|
-
- `mipmap-xxxhdpi` (192×192)
|
|
2204
|
-
|
|
2205
|
-
### Utiliser des variables d'environnement
|
|
2206
|
-
|
|
2207
|
-
```powershell
|
|
2208
|
-
$env:PROJECT_PATH = "C:\MonApp"
|
|
2209
|
-
node "metadidomi-builder\build_tools\build_apk.js"
|
|
2210
|
-
```
|
|
2211
|
-
|
|
2212
|
-
---
|
|
2213
|
-
|
|
2214
|
-
## Architecture du système
|
|
2215
|
-
|
|
2216
|
-
🔝 [Retour en haut](#top)
|
|
2217
|
-
|
|
2218
|
-
```
|
|
2219
|
-
metadidomi-builder/
|
|
2220
|
-
├── build_tools/
|
|
2221
|
-
│ ├── build_apk.js # Orchestration principale
|
|
2222
|
-
│ ├── generate-resources.js # Génération des ressources XML
|
|
2223
|
-
│ ├── generate-icons.js # Redimensionnement des icônes
|
|
2224
|
-
│ ├── backup-manager.js # Gestion des sauvegardes
|
|
2225
|
-
│ └── vendor/ # SDK Android et JDK (inclus)
|
|
2226
|
-
└── build_tools_py/ # Outils Python avancés (optionnel)
|
|
2227
|
-
```
|
|
2228
|
-
|
|
2229
|
-
---
|
|
2230
|
-
|
|
2231
|
-
## Étapes du build expliquées
|
|
2232
|
-
|
|
2233
|
-
🔝 [Retour en haut](#top)
|
|
2234
|
-
|
|
2235
|
-
1. **Génération des ressources** : Crée `AndroidManifest.xml`, couleurs, styles
|
|
2236
|
-
2. **Génération des icônes** : Redimensionne l'icône pour toutes les densités
|
|
2237
|
-
3. **Vérification des fichiers** : Contrôle la présence des fichiers minimums
|
|
2238
|
-
4. **Compilation des ressources** : AAPT2 compile XML et images
|
|
2239
|
-
5. **Liaison des ressources** : Génération de `R.java` avec les IDs de ressources
|
|
2240
|
-
6. **Compilation Java** : Javac compile le code Java
|
|
2241
|
-
7. **Création du JAR** : Empaquetage des classes Java
|
|
2242
|
-
8. **Conversion DEX** : D8 convertit en format Android (DEX)
|
|
2243
|
-
9. **Assemblage APK** : Création de la structure APK
|
|
2244
|
-
10. **Alignement** : Zipalign optimise la structure APK
|
|
2245
|
-
11. **Signature** : Signature numérique de l'APK
|
|
2246
|
-
12. **Résultat** : APK prête à être installée
|
|
2247
|
-
|
|
2248
|
-
---
|
|
2249
|
-
|
|
2250
|
-
## Installation de l'APK sur un téléphone
|
|
2251
|
-
|
|
2252
|
-
🔝 [Retour en haut](#top)
|
|
2253
|
-
|
|
2254
|
-
### Via USB
|
|
2255
|
-
|
|
2256
|
-
```powershell
|
|
2257
|
-
adb install -r "MonApp\MonApp.apk"
|
|
2258
|
-
```
|
|
2259
|
-
|
|
2260
|
-
### Via partage de fichier
|
|
2261
|
-
|
|
2262
|
-
1. Transférez le fichier `.apk` sur votre téléphone
|
|
2263
|
-
2. Ouvrez l'explorateur de fichiers
|
|
2264
|
-
3. Appuyez sur le fichier `.apk`
|
|
2265
|
-
4. Confirmez l'installation
|
|
2266
|
-
|
|
2267
|
-
---
|
|
2268
|
-
|
|
2269
|
-
## Conseils et bonnes pratiques
|
|
2270
|
-
|
|
2271
|
-
🔝 [Retour en haut](#top)
|
|
2272
|
-
|
|
2273
|
-
✅ **À faire :**
|
|
2274
|
-
- Tester l'app fréquemment
|
|
2275
|
-
- Utiliser des noms de ressources explicites
|
|
2276
|
-
- Commenter le code Java
|
|
2277
|
-
- Utiliser `Log.d()` pour déboguer
|
|
2278
|
-
- Versionner votre code (Git)
|
|
2279
|
-
|
|
2280
|
-
❌ **À éviter :**
|
|
2281
|
-
- Charger des images trop volumineuses
|
|
2282
|
-
- Utiliser des classes anonymes complexes
|
|
2283
|
-
- Modifier les fichiers générés automatiquement
|
|
2284
|
-
- Laisser des ressources inutilisées
|
|
2285
|
-
|
|
2286
|
-
---
|
|
2287
|
-
|
|
2288
|
-
## Foire aux questions
|
|
2289
|
-
|
|
2290
|
-
🔝 [Retour en haut](#top)
|
|
2291
|
-
|
|
2292
|
-
**Q : Puis-je créer plusieurs activités ?**
|
|
2293
|
-
A : Oui, ajoutez des classes Java dans `src/` et déclarez-les dans `AndroidManifest.xml`.
|
|
2294
|
-
|
|
2295
|
-
**Q : Comment ajouter des dépendances externes ?**
|
|
2296
|
-
A : Actuellement, seules les APIs Android intégrées sont supportées.
|
|
2297
|
-
|
|
2298
|
-
**Q : L'APK fonctionne-t-il sur tous les téléphones ?**
|
|
2299
|
-
A : Oui, tant qu'ils sont Android 5.0 (API 21) ou supérieur.
|
|
2300
|
-
|
|
2301
|
-
**Q : Puis-je mettre à jour l'APK ?**
|
|
2302
|
-
A : Oui, augmentez `appVersion` dans `app-config.json` et régénérez.
|
|
2303
|
-
|
|
2304
|
-
**Q : Les APK sont-elles vraiment signées ?**
|
|
2305
|
-
A : Oui, automatiquement avec une clé de développement auto-générée.
|
|
2306
|
-
|
|
2307
|
-
---
|
|
2308
|
-
|
|
2309
|
-
## Support
|
|
2310
|
-
|
|
2311
|
-
🔝 [Retour en haut](#top)
|
|
2312
|
-
|
|
2313
|
-
Pour des problèmes ou des questions :
|
|
2314
|
-
|
|
2315
|
-
1. Consultez le dossier `CounterApp/` pour un exemple complet
|
|
2316
|
-
2. Vérifiez les logs du build pour les erreurs
|
|
2317
|
-
3. Assurez-vous que tous les fichiers requis existent
|
|
2318
|
-
|
|
2319
|
-
---
|
|
2320
|
-
|
|
2321
|
-
## Version
|
|
2322
|
-
|
|
2323
|
-
- **Metadidomi Crone** : v1.0.0
|
|
2324
|
-
- **Android SDK** : 34 (Android 14)
|
|
2325
|
-
- **Build Tools** : 34.0.0
|
|
2326
|
-
- **Dernière mise à jour** : Novembre 2025
|
|
2327
|
-
|
|
2328
1737
|
---
|
|
2329
1738
|
|
|
2330
1739
|
### 📞 Support
|