metadidomi-builder 1.4.201125 → 1.5.2411250404
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 +916 -571
- package/build_tools/backup-manager.js +3 -0
- package/build_tools/build_apk.js +3 -0
- package/build_tools/create-example-app.js +73 -0
- package/build_tools/diagnose-apk.js +61 -0
- package/build_tools/generate-icons.js +3 -0
- package/build_tools/generate-resources.js +3 -0
- package/build_tools/restore-resources.js +3 -0
- package/build_tools_py/pyMetadidomi/README.md +98 -0
- package/build_tools_py/pyMetadidomi/pyMetadidomi.py +16 -1675
- package/create-app.bat +31 -0
- package/create-app.ps1 +27 -0
- package/package.json +4 -2
- package/build_tools_py/pyMetadidomi/pyMetadidomi-obf.py +0 -19
package/README.md
CHANGED
|
@@ -6,7 +6,6 @@
|
|
|
6
6
|
[](https://pay.lygosapp.com/$etsmeta)
|
|
7
7
|

|
|
8
8
|

|
|
9
|
-

|
|
10
9
|
|
|
11
10
|
---
|
|
12
11
|
|
|
@@ -14,20 +13,22 @@
|
|
|
14
13
|
|
|
15
14
|
1. **[À Propos](#-à-propos)** - Présentation générale
|
|
16
15
|
2. **[Installation](#-installation)** - Mise en place
|
|
17
|
-
3. **[
|
|
18
|
-
4. **[
|
|
19
|
-
5. **[Modes de Construction](#-modes-de-construction)** - Options de build
|
|
20
|
-
6. **[
|
|
21
|
-
7. **[
|
|
22
|
-
8. **[
|
|
23
|
-
9. **[
|
|
24
|
-
10. **[
|
|
16
|
+
3. **[Démarrage Rapide](#-démarrage-rapide)** - Premiers pas
|
|
17
|
+
4. **[Configuration](#-configuration)** - Personnalisation
|
|
18
|
+
5. **[Modes de Construction](#-modes-de-construction)** - Options de build
|
|
19
|
+
6. **[Gestion des Dépendances](#-gestion-des-dépendances)** - Electron et Python
|
|
20
|
+
7. **[Protection du Code](#-système-de-protection-avancé)** - Sécurité
|
|
21
|
+
8. **[Packaging Python](#-packaging-dapplications-python)** - Applications Python
|
|
22
|
+
9. **[Packaging Android](#-packaging-dapplications-android)** - Applications Android APK
|
|
23
|
+
10. **[Comparaison](#-comparaison-avec-electron-builder)** - vs electron-builder
|
|
24
|
+
11. **[Roadmap](#-roadmap)** - Futures versions
|
|
25
|
+
12. **[Support](#-support-et-contribution)** - Aide et contact
|
|
25
26
|
|
|
26
27
|
---
|
|
27
28
|
|
|
28
29
|
## 💝 À Propos
|
|
29
30
|
|
|
30
|
-
Constructeur **professionnel** pour applications Electron et Python exigeant :
|
|
31
|
+
Constructeur **professionnel** pour applications Electron et Python, Android exigeant :
|
|
31
32
|
- ✅ **Sécurité maximale** - Chiffrement AES-256, bytecode, obfuscation
|
|
32
33
|
- ✅ **Builds reproductibles** - 100% déterministe et offline
|
|
33
34
|
- ✅ **Customisation totale** - Contrôle complet du processus
|
|
@@ -47,134 +48,32 @@ Votre soutien permet de :
|
|
|
47
48
|
|
|
48
49
|
## 🚀 Installation
|
|
49
50
|
|
|
50
|
-
###
|
|
51
|
+
### Dépendances Minimales
|
|
51
52
|
|
|
52
53
|
**Pour le développement :** Seuls `electron@^39.1.1` et Python 3.11+ sont requis.
|
|
53
|
-
[]
|
|
54
54
|
|
|
55
|
-
### Afficher toutes les commandes disponibles
|
|
56
|
-
|
|
57
|
-
> **Important :** Avant d'utiliser ces commandes, ajoutez les scripts suivants dans la section `scripts` de votre `package.json` :
|
|
58
|
-
>
|
|
59
|
-
> ```json
|
|
60
|
-
> "help": "node node_modules/metadidomi-builder/build_tools/commands-help.js",
|
|
61
|
-
> "help:electron": "node node_modules/metadidomi-builder/build_tools/commands-help.js --type=electron",
|
|
62
|
-
> "help:python": "node node_modules/metadidomi-builder/build_tools/commands-help.js --type=python",
|
|
63
|
-
> "help:all": "node node_modules/metadidomi-builder/build_tools/commands-help.js --all"
|
|
64
|
-
> ```
|
|
65
|
-
|
|
66
|
-
Pour voir toutes les commandes adaptées à votre projet (Electron ou Python), utilisez la commande d'aide interactive :
|
|
67
|
-
|
|
68
|
-
```powershell
|
|
69
|
-
npm run help # Affiche toutes les commandes disponibles
|
|
70
|
-
npm run help:electron # Affiche uniquement les commandes Electron
|
|
71
|
-
npm run help:python # Affiche uniquement les commandes Python
|
|
72
|
-
npm run help:all # Affiche tout (mode universel)
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
**Exemple d'affichage** :
|
|
76
|
-
```
|
|
77
|
-
> npm run help
|
|
78
|
-
|
|
79
|
-
─────────────────────────────
|
|
80
|
-
METADIDOMI BUILDER - COMMANDES DISPONIBLES
|
|
81
|
-
─────────────────────────────
|
|
82
|
-
|
|
83
|
-
1. BUILD
|
|
84
|
-
Crée un installateur Windows NSIS professionnel
|
|
85
|
-
Commande: npm run build
|
|
86
|
-
Alternatives: npx metadidomi-builder
|
|
87
|
-
Sortie: ./dist/MonApp-Setup-1.0.0.exe
|
|
88
|
-
|
|
89
|
-
2. BUILD:PYTHON
|
|
90
|
-
Build d'application Python en mode console
|
|
91
|
-
Commande: npm run build:python
|
|
92
|
-
Alternatives: npx metadidomi-builder-python
|
|
93
|
-
Sortie: ./dist/MonApp-Setup-1.0.0.exe
|
|
94
|
-
|
|
95
|
-
...etc
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
La commande détecte automatiquement le type de projet et affiche les commandes adaptées, avec explications et exemples.
|
|
99
|
-
|
|
100
|
-
Pour plus d'exemples, consultez la section "Exemples Pratiques" plus bas.
|
|
101
|
-
|
|
102
|
-
#### Option 1 : Installation dans votre projet
|
|
103
|
-
|
|
104
|
-
```powershell
|
|
105
|
-
# Installez le builder comme dépendance de développement
|
|
106
|
-
npm install --save-dev metadidomi-builder
|
|
107
|
-
|
|
108
|
-
# Ajoutez des scripts dans votre package.json
|
|
109
|
-
# "scripts": {
|
|
110
|
-
# "build": "metadidomi-builder",
|
|
111
|
-
# "build:lite": "set LITE_BUILD=true && metadidomi-builder",
|
|
112
|
-
# "build:portable": "set CREATE_PORTABLE_EXE=true && metadidomi-builder",
|
|
113
|
-
# "build:python": "node node_modules/metadidomi-builder/build_tools_py/builder.py",
|
|
114
|
-
# "build:python:gui": "node node_modules/metadidomi-builder/build_tools_py/builder.py --gui"
|
|
115
|
-
# }
|
|
116
|
-
|
|
117
|
-
# Puis lancez avec :
|
|
118
|
-
npm run build # Build Electron standard
|
|
119
|
-
# ou
|
|
120
|
-
npm run build:lite # Build Electron optimisé
|
|
121
|
-
npm run build:portable # Exécutable portable
|
|
122
|
-
npm run build:python # Build Python (console)
|
|
123
|
-
npm run build:python:gui # Build Python (GUI)
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
#### Option 2 : Utilisation directe avec npx
|
|
127
|
-
|
|
128
|
-
```powershell
|
|
129
|
-
# Lancez directement sans installation
|
|
130
|
-
npx metadidomi-builder
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
#### Option 3 : Installation Globale
|
|
134
|
-
|
|
135
|
-
```powershell
|
|
136
|
-
# Installez globalement
|
|
137
|
-
npm install -g metadidomi-builder
|
|
138
|
-
|
|
139
|
-
# Lancez depuis n'importe où
|
|
140
|
-
metadidomi-builder
|
|
141
|
-
```
|
|
142
|
-
|
|
143
|
-
### Installation Manuelle (Avancé)
|
|
144
|
-
|
|
145
|
-
Si vous préférez installer manuellement :
|
|
146
|
-
|
|
147
|
-
1. **Clonez le repository**
|
|
148
|
-
```powershell
|
|
149
|
-
git clone https://github.com/METADIDOMIOFFICIEL/Metadidomi-Builder.git
|
|
150
|
-
cd metadidomi-builder
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
2. **Installez les dépendances**
|
|
154
55
|
```powershell
|
|
155
56
|
npm install
|
|
156
57
|
```
|
|
58
|
+
# � INSTALLATION DES DÉPENDANCES VENDOR
|
|
157
59
|
|
|
158
|
-
|
|
159
|
-
- Téléchargez `vendor.zip` depuis :
|
|
160
|
-
https://github.com/METADIDOMIOFFICIEL/Metadidomi-Builder/releases/download/1.3.171125/vendor.zip
|
|
161
|
-
- Extrayez dans `build_tools/vendor/`
|
|
60
|
+
Si lors de l'installation le dossier `build_tools/vendor` n'est pas présent, suivez ces instructions :
|
|
162
61
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
# Depuis le dossier d'installation
|
|
166
|
-
node build_tools/builder.js
|
|
62
|
+
. Téléchargez le fichier `vendor.zip` depuis :
|
|
63
|
+
https://github.com/METADIDOMIOFFICIEL/Metadidomi-Builder/releases/download/1.3.171125/vendor.zip
|
|
167
64
|
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
65
|
+
En suite télécharger le kit Android:
|
|
66
|
+
https://github.com/METADIDOMIOFFICIEL/Metadidomi-Builder/releases/download/Android.zip/android.zip
|
|
67
|
+
|
|
68
|
+
💡 **Suite** :
|
|
69
|
+
Vous pouvez aussi extraire manuellement le contenu de `vendor.zip` dans le dossier `build_tools/vendor`.
|
|
171
70
|
|
|
172
71
|
### Modules Embarqués - 100% Offline
|
|
173
72
|
|
|
174
|
-
Toutes les dépendances essentielles sont incluses dans `
|
|
73
|
+
Toutes les dépendances essentielles sont incluses dans `build_tools/vendor/` :
|
|
175
74
|
|
|
176
75
|
```
|
|
177
|
-
build_tools/vendor/
|
|
76
|
+
build_tools/vendor/
|
|
178
77
|
├── asar/ # Packaging et archivage
|
|
179
78
|
├── bytenode/ # Compilation JavaScript → bytecode V8
|
|
180
79
|
├── electron-asar/ # ASAR officiel Electron
|
|
@@ -202,26 +101,22 @@ Le builder intègre un **système automatique de signature** avec deux modes :
|
|
|
202
101
|
|
|
203
102
|
#### Mode 1 : Auto-signé (Défaut - Développement)
|
|
204
103
|
- ✅ Généré automatiquement lors du premier build
|
|
205
|
-
- 📁 Stocké dans `
|
|
206
|
-
- 🔑 Mot de passe dans `cert-[hash].key`
|
|
104
|
+
- 📁 Stocké dans `build_tools/certs/cert-[hash].pfx`
|
|
105
|
+
- 🔑 Mot de passe dans `build_tools/certs/cert-[hash].key`
|
|
207
106
|
- ⚡ Aucune configuration requise
|
|
208
107
|
|
|
209
108
|
#### Mode 2 : Certificat Personnalisé (Production)
|
|
210
109
|
|
|
211
110
|
```powershell
|
|
212
111
|
# Option 1 : Fichier dans le dossier par défaut
|
|
213
|
-
#
|
|
214
|
-
# Manuel: Placer dans build_tools/certs/signing.pfx
|
|
112
|
+
# Placer: build_tools/certs/signing.pfx
|
|
215
113
|
|
|
216
114
|
# Option 2 : Variables d'environnement
|
|
217
115
|
$env:PFX_PATH="chemin/vers/certificat.pfx"
|
|
218
116
|
$env:PFX_PASS="mot-de-passe-certificat"
|
|
219
117
|
|
|
220
|
-
# Lancer le build
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
# Ou avec npx
|
|
224
|
-
npx metadidomi-builder
|
|
118
|
+
# Lancer le build
|
|
119
|
+
node build_tools/builder.js
|
|
225
120
|
```
|
|
226
121
|
|
|
227
122
|
**Priorité de signature :**
|
|
@@ -232,46 +127,16 @@ npx metadidomi-builder
|
|
|
232
127
|
|
|
233
128
|
---
|
|
234
129
|
|
|
235
|
-
[⬆️ Retour en haut](#-multi-builder-premium)
|
|
236
|
-
|
|
237
130
|
## ⚡ Démarrage Rapide
|
|
238
131
|
|
|
239
|
-
### Pour les Pressés (< 5 min)
|
|
240
|
-
|
|
241
|
-
```powershell
|
|
242
|
-
# 1. Installez le builder
|
|
243
|
-
npm i metadidomi-builder
|
|
244
|
-
|
|
245
|
-
# 2. Lancez le builder
|
|
246
|
-
npm run build
|
|
247
|
-
|
|
248
|
-
# 3. C'est tout ! ✅
|
|
249
|
-
# Résultat: ./dist/MonApp-Setup-1.0.0.exe
|
|
250
|
-
```
|
|
251
|
-
|
|
252
|
-
**OU directement avec npx :**
|
|
253
|
-
|
|
254
|
-
```powershell
|
|
255
|
-
# 1. Allez dans votre dossier d'application
|
|
256
|
-
cd D:\mon-app
|
|
257
|
-
|
|
258
|
-
# 2. Lancez le builder directement
|
|
259
|
-
npx metadidomi-builder
|
|
260
|
-
|
|
261
|
-
> **À savoir :**
|
|
262
|
-
|
|
263
|
-
# 3. C'est tout ! ✅
|
|
264
|
-
# Résultat: ./dist/MonApp-Setup-1.0.0.exe
|
|
265
|
-
```
|
|
266
|
-
|
|
267
|
-
### Alternative : Installation Manuelle
|
|
132
|
+
### Pour les Pressés (< 5 min)
|
|
268
133
|
|
|
269
134
|
```powershell
|
|
270
135
|
# 1. Allez dans votre dossier d'application
|
|
271
136
|
cd D:\mon-app
|
|
272
137
|
|
|
273
|
-
# 2. Lancez le builder
|
|
274
|
-
node
|
|
138
|
+
# 2. Lancez le builder
|
|
139
|
+
node D:\chemin-vers\metadidomi-builder\build_tools\builder.js
|
|
275
140
|
|
|
276
141
|
# 3. C'est tout ! ✅
|
|
277
142
|
# Résultat: ./dist/MonApp-Setup-1.0.0.exe
|
|
@@ -288,94 +153,6 @@ mon-app/
|
|
|
288
153
|
|
|
289
154
|
**Si aucun fichier n'existe, le builder génère une application de démo complète et fonctionnelle !** 🎉
|
|
290
155
|
|
|
291
|
-
### ⚠️ Éviter les Boucles Infinies de Build
|
|
292
|
-
|
|
293
|
-
**IMPORTANT :** Configurez correctement votre `package.json` pour éviter que le builder relance indéfiniment des builds.
|
|
294
|
-
|
|
295
|
-
#### ❌ MAUVAIS - Créé une boucle infinie
|
|
296
|
-
|
|
297
|
-
```json
|
|
298
|
-
{
|
|
299
|
-
"name": "mon-app",
|
|
300
|
-
"version": "1.0.0",
|
|
301
|
-
"scripts": {
|
|
302
|
-
"start": "npm run build",
|
|
303
|
-
"build": "metadidomi-builder"
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
```
|
|
307
|
-
|
|
308
|
-
**Problème :** `npm run build` → `metadidomi-builder` → (re)crée `package.json` → retrigger scripts → boucle infinie ❌
|
|
309
|
-
|
|
310
|
-
#### ✅ BON - Structure Correcte
|
|
311
|
-
|
|
312
|
-
```json
|
|
313
|
-
{
|
|
314
|
-
"name": "mon-app",
|
|
315
|
-
"version": "1.0.0",
|
|
316
|
-
"main": "main.js",
|
|
317
|
-
"scripts": {
|
|
318
|
-
"start": "electron .",
|
|
319
|
-
"dev": "electron .",
|
|
320
|
-
"build": "metadidomi-builder",
|
|
321
|
-
"build:lite": "set LITE_BUILD=true && metadidomi-builder",
|
|
322
|
-
"build:portable": "set CREATE_PORTABLE_EXE=true && metadidomi-builder"
|
|
323
|
-
},
|
|
324
|
-
"dependencies": {
|
|
325
|
-
"electron": "^31.0.0"
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
```
|
|
329
|
-
|
|
330
|
-
**Points clés :**
|
|
331
|
-
- ✅ `"start"` lance **Electron**, pas le builder
|
|
332
|
-
- ✅ `"build"` lance **SEULEMENT** le builder
|
|
333
|
-
- ✅ Les scripts ne s'appellent pas mutuellement
|
|
334
|
-
- ✅ Pas de hook `prestart` ou `postinstall` qui relancerait build
|
|
335
|
-
- ✅ Le builder ne modifie PAS le package.json existant
|
|
336
|
-
|
|
337
|
-
#### 🛡️ Règles de Sécurité pour npm scripts
|
|
338
|
-
|
|
339
|
-
| Script | Doit faire | Doit PAS faire |
|
|
340
|
-
|--------|-----------|---|
|
|
341
|
-
| `start` | Lancer Electron ou l'app | Lancer le builder |
|
|
342
|
-
| `build` | Lancer le builder | Lancer d'autres scripts |
|
|
343
|
-
| `dev` | Mode développement Electron | Lancer le builder |
|
|
344
|
-
| `test` | Exécuter les tests | Lancer le builder |
|
|
345
|
-
|
|
346
|
-
#### 🔒 Protéger votre package.json
|
|
347
|
-
|
|
348
|
-
**Ne pas ajouter ces hooks dangereux :**
|
|
349
|
-
|
|
350
|
-
```json
|
|
351
|
-
{
|
|
352
|
-
"scripts": {
|
|
353
|
-
"prestart": "npm run build", // ❌ DANGER: boucle
|
|
354
|
-
"postinstall": "npm run build", // ❌ DANGER: boucle
|
|
355
|
-
"prepare": "npm run build" // ❌ DANGER: boucle
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
```
|
|
359
|
-
|
|
360
|
-
#### ✅ Alternative Sûre : Scripts Séparés
|
|
361
|
-
|
|
362
|
-
Si vous voulez build ET lancer, créez deux scripts distincts :
|
|
363
|
-
|
|
364
|
-
```json
|
|
365
|
-
{
|
|
366
|
-
"scripts": {
|
|
367
|
-
"build": "metadidomi-builder",
|
|
368
|
-
"start": "electron .",
|
|
369
|
-
"build-and-run": "npm run build && npm start"
|
|
370
|
-
}
|
|
371
|
-
}
|
|
372
|
-
```
|
|
373
|
-
|
|
374
|
-
**Utilisation :**
|
|
375
|
-
```powershell
|
|
376
|
-
npm run build-and-run # ✅ Build PUIS lance l'app (une fois seulement)
|
|
377
|
-
```
|
|
378
|
-
|
|
379
156
|
---
|
|
380
157
|
|
|
381
158
|
## 📦 Gestion des Dépendances - Installation et Utilisation
|
|
@@ -511,11 +288,7 @@ axios.get('https://api.example.com/data')
|
|
|
511
288
|
|
|
512
289
|
### 2. Tester Localement Avant de Packager
|
|
513
290
|
```powershell
|
|
514
|
-
# Python
|
|
515
|
-
.\node_modules\metadidomi-builder\build_tools\vendor\python_embeddable\python.exe -m pip install -r requirements.txt
|
|
516
|
-
python __main__.py
|
|
517
|
-
|
|
518
|
-
# Python - Installation manuelle
|
|
291
|
+
# Python
|
|
519
292
|
.\build_tools\vendor\python_embeddable\python.exe -m pip install -r requirements.txt
|
|
520
293
|
python __main__.py
|
|
521
294
|
|
|
@@ -551,19 +324,6 @@ import numpy as np
|
|
|
551
324
|
|
|
552
325
|
### Python
|
|
553
326
|
|
|
554
|
-
**Installation npm :**
|
|
555
|
-
```powershell
|
|
556
|
-
# Voir les dépendances qui peuvent être mises à jour
|
|
557
|
-
.\node_modules\metadidomi-builder\build_tools\vendor\python_embeddable\python.exe -m pip list --outdated
|
|
558
|
-
|
|
559
|
-
# Mettre à jour une dépendance
|
|
560
|
-
.\node_modules\metadidomi-builder\build_tools\vendor\python_embeddable\python.exe -m pip install --upgrade requests
|
|
561
|
-
|
|
562
|
-
# Mettre à jour tous les packages
|
|
563
|
-
.\node_modules\metadidomi-builder\build_tools\vendor\python_embeddable\python.exe -m pip install --upgrade -r requirements.txt
|
|
564
|
-
```
|
|
565
|
-
|
|
566
|
-
**Installation manuelle :**
|
|
567
327
|
```powershell
|
|
568
328
|
# Voir les dépendances qui peuvent être mises à jour
|
|
569
329
|
.\build_tools\vendor\python_embeddable\python.exe -m pip list --outdated
|
|
@@ -596,21 +356,8 @@ npm update
|
|
|
596
356
|
|
|
597
357
|
#### ⭐ Standard (Défaut) - Installateur NSIS
|
|
598
358
|
|
|
599
|
-
**Avec npm :**
|
|
600
|
-
```powershell
|
|
601
|
-
npm run build
|
|
602
|
-
# Résultat: ./dist/MonApp-Setup-1.0.0.exe
|
|
603
|
-
```
|
|
604
|
-
|
|
605
|
-
**Avec npx :**
|
|
606
|
-
```powershell
|
|
607
|
-
npx metadidomi-builder
|
|
608
|
-
# Résultat: ./dist/MonApp-Setup-1.0.0.exe
|
|
609
|
-
```
|
|
610
|
-
|
|
611
|
-
**Manuel :**
|
|
612
359
|
```powershell
|
|
613
|
-
node
|
|
360
|
+
node build_tools/builder.js
|
|
614
361
|
# Résultat: ./dist/MonApp-Setup-1.0.0.exe
|
|
615
362
|
```
|
|
616
363
|
|
|
@@ -618,15 +365,9 @@ Crée un **installateur professionnel** avec options d'installation, raccourcis,
|
|
|
618
365
|
|
|
619
366
|
#### 💾 Portable - Exécutable Autonome
|
|
620
367
|
|
|
621
|
-
**Avec npm :**
|
|
622
|
-
```powershell
|
|
623
|
-
$env:CREATE_PORTABLE_EXE="true"; npm run build
|
|
624
|
-
# Résultat: ./dist/MonApp.exe (portable, ~130MB)
|
|
625
|
-
```
|
|
626
|
-
|
|
627
|
-
**Avec npx :**
|
|
628
368
|
```powershell
|
|
629
|
-
$env:CREATE_PORTABLE_EXE="true"
|
|
369
|
+
$env:CREATE_PORTABLE_EXE="true"
|
|
370
|
+
node build_tools/builder.js
|
|
630
371
|
# Résultat: ./dist/MonApp.exe (portable, ~130MB)
|
|
631
372
|
```
|
|
632
373
|
|
|
@@ -634,9 +375,9 @@ Exécutable indépendant sans installation requise.
|
|
|
634
375
|
|
|
635
376
|
#### ⚡ LITE - Mode Optimisé
|
|
636
377
|
|
|
637
|
-
**Avec npm :**
|
|
638
378
|
```powershell
|
|
639
|
-
$env:LITE_BUILD="true"
|
|
379
|
+
$env:LITE_BUILD="true"
|
|
380
|
+
node build_tools/builder.js
|
|
640
381
|
# Résultat: ./dist/MonApp-Setup-1.0.0.exe (optimisé)
|
|
641
382
|
# Rapport: electron-lite-deps-report.txt
|
|
642
383
|
```
|
|
@@ -645,52 +386,46 @@ Analyse et exclut automatiquement les modules inutiles. Génère un rapport dét
|
|
|
645
386
|
|
|
646
387
|
#### 🚫 Sans Installateur
|
|
647
388
|
|
|
648
|
-
**Avec npm :**
|
|
649
389
|
```powershell
|
|
650
|
-
$env:SKIP_INSTALLER="true"
|
|
390
|
+
$env:SKIP_INSTALLER="true"
|
|
391
|
+
node build_tools/builder.js
|
|
651
392
|
# Résultat: Ressources de base seulement
|
|
652
393
|
```
|
|
653
394
|
|
|
654
395
|
#### 🔐 Avec Chiffrement
|
|
655
396
|
|
|
656
|
-
**Avec npm :**
|
|
657
|
-
```powershell
|
|
658
|
-
$env:KEY="votre-clé-secrète"; npm run build
|
|
659
|
-
```
|
|
660
|
-
|
|
661
|
-
**Avec npx :**
|
|
662
397
|
```powershell
|
|
663
|
-
$env:KEY="votre-clé-secrète"
|
|
398
|
+
$env:KEY="votre-clé-secrète"
|
|
399
|
+
node build_tools/builder.js
|
|
664
400
|
```
|
|
665
401
|
|
|
666
402
|
#### ⚙️ Compression UPX (Optionnelle)
|
|
667
403
|
|
|
668
|
-
**Mode rapide (recommandé) :**
|
|
669
404
|
```powershell
|
|
670
|
-
|
|
671
|
-
|
|
405
|
+
# Mode rapide (recommandé)
|
|
406
|
+
$env:USE_UPX="true"
|
|
407
|
+
node build_tools/builder.js
|
|
672
408
|
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
$env:
|
|
409
|
+
# Mode ultra-brute (très lent, gain maximal)
|
|
410
|
+
$env:USE_UPX="true"
|
|
411
|
+
$env:UPX_ULTRA_BRUTE="true"
|
|
412
|
+
node build_tools/builder.js
|
|
676
413
|
```
|
|
677
414
|
|
|
678
415
|
#### 🔗 Combinaisons Utiles
|
|
679
416
|
|
|
680
|
-
**Portable + LITE + Chiffrement :**
|
|
681
417
|
```powershell
|
|
418
|
+
# Portable + LITE + Chiffrement
|
|
682
419
|
$env:CREATE_PORTABLE_EXE="true"
|
|
683
420
|
$env:LITE_BUILD="true"
|
|
684
421
|
$env:KEY="clé-secrète"
|
|
685
|
-
|
|
686
|
-
```
|
|
422
|
+
node build_tools/builder.js
|
|
687
423
|
|
|
688
|
-
|
|
689
|
-
```powershell
|
|
424
|
+
# Avec UPX + Signature personnalisée
|
|
690
425
|
$env:USE_UPX="true"
|
|
691
426
|
$env:PFX_PATH="cert.pfx"
|
|
692
427
|
$env:PFX_PASS="mot-de-passe"
|
|
693
|
-
|
|
428
|
+
node build_tools/builder.js
|
|
694
429
|
```
|
|
695
430
|
|
|
696
431
|
### Paramètres Avancés
|
|
@@ -781,25 +516,37 @@ mon-app/
|
|
|
781
516
|
|
|
782
517
|
Le builder intègre un **système complet de protection du code** avec obfuscation intelligente, chiffrement multi-couches, et anti-analyse.
|
|
783
518
|
|
|
784
|
-
###
|
|
519
|
+
### Deux Modes de Protection
|
|
785
520
|
|
|
786
|
-
**
|
|
521
|
+
**Mode Interactif** - Questions guidées pour chaque protection
|
|
787
522
|
```powershell
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
npm run build -- --heavy-protection
|
|
523
|
+
cd metadidomi-builder/build_tools_py/pyMetadidomi
|
|
524
|
+
python pyMetadidomi.py
|
|
791
525
|
```
|
|
792
526
|
|
|
793
|
-
**
|
|
527
|
+
**Mode CLI** - Automatisé avec arguments
|
|
794
528
|
```powershell
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
529
|
+
# Presets rapides
|
|
530
|
+
python pyMetadidomi.py script.py --light-protection # Léger
|
|
531
|
+
python pyMetadidomi.py script.py --medium-protection # Moyen
|
|
532
|
+
python pyMetadidomi.py script.py --heavy-protection # Maximal
|
|
533
|
+
|
|
534
|
+
# Options individuelles
|
|
535
|
+
python pyMetadidomi.py script.py --carbon # Obfuscation
|
|
536
|
+
python pyMetadidomi.py script.py --junk # Code parasite
|
|
537
|
+
python pyMetadidomi.py script.py --anti-vm # Anti-VM
|
|
538
|
+
python pyMetadidomi.py script.py --multi-encrypt # Chiffrement multi-couches
|
|
798
539
|
```
|
|
799
540
|
|
|
800
|
-
|
|
541
|
+
### Protection pour Electron
|
|
542
|
+
|
|
543
|
+
```powershell
|
|
544
|
+
node build_tools/builder.js --light-protection
|
|
545
|
+
node build_tools/builder.js --medium-protection
|
|
546
|
+
node build_tools/builder.js --heavy-protection
|
|
547
|
+
```
|
|
801
548
|
|
|
802
|
-
👉 **[📖 Documentation complète des protections →](
|
|
549
|
+
👉 **[📖 Documentation complète des protections →](build_tools_py/PROTECTION_COMMANDS.md)**
|
|
803
550
|
|
|
804
551
|
## Construction LITE (optimisation)
|
|
805
552
|
```powershell
|
|
@@ -811,22 +558,20 @@ Génère un rapport `electron-lite-deps-report.txt` avec les modules analysés.
|
|
|
811
558
|
## Clé de Chiffrement Personnalisée
|
|
812
559
|
```powershell
|
|
813
560
|
$env:KEY="votre-clé-secrète"
|
|
814
|
-
|
|
561
|
+
node build_tools/builder.js
|
|
815
562
|
```
|
|
816
563
|
Si non défini, une clé est générée automatiquement.
|
|
817
564
|
|
|
818
565
|
## Compression UPX
|
|
819
|
-
**Mode rapide (défaut) :**
|
|
820
566
|
```powershell
|
|
567
|
+
# Mode rapide (défaut)
|
|
821
568
|
$env:USE_UPX="true"
|
|
822
|
-
|
|
823
|
-
```
|
|
569
|
+
node build_tools/builder.js
|
|
824
570
|
|
|
825
|
-
|
|
826
|
-
```powershell
|
|
571
|
+
# Mode ultra-brute (très lent)
|
|
827
572
|
$env:USE_UPX="true"
|
|
828
573
|
$env:UPX_ULTRA_BRUTE="true"
|
|
829
|
-
|
|
574
|
+
node build_tools/builder.js
|
|
830
575
|
```
|
|
831
576
|
|
|
832
577
|
---
|
|
@@ -871,83 +616,19 @@ Builder (compile, chiffre, empaque, signe)
|
|
|
871
616
|
|
|
872
617
|
## 📝 Exemples Pratiques
|
|
873
618
|
|
|
874
|
-
### Installation npm + Utilisation - Electron
|
|
875
|
-
|
|
876
|
-
**Exemple 1 : Setup complet avec tous les scripts npm**
|
|
877
|
-
|
|
878
|
-
```powershell
|
|
879
|
-
# Installez le builder
|
|
880
|
-
npm i metadidomi-builder
|
|
881
|
-
|
|
882
|
-
# Ajoutez les scripts à votre package.json:
|
|
883
|
-
# "scripts": {
|
|
884
|
-
# "start": "electron .",
|
|
885
|
-
# "dev": "electron .",
|
|
886
|
-
# "build": "metadidomi-builder",
|
|
887
|
-
# "build:lite": "set LITE_BUILD=true && metadidomi-builder",
|
|
888
|
-
# "build:portable": "set CREATE_PORTABLE_EXE=true && metadidomi-builder",
|
|
889
|
-
# "build:encrypted": "set KEY=ma-cle-secrete && metadidomi-builder",
|
|
890
|
-
# "build-and-run": "npm run build && echo Build complete!"
|
|
891
|
-
# }
|
|
892
|
-
|
|
893
|
-
# Puis lancez avec :
|
|
894
|
-
npm run build # Build standard → ./dist/MonApp-Setup-1.0.0.exe
|
|
895
|
-
npm run build:lite # Build optimisé → ./dist/MonApp-Setup-1.0.0.exe
|
|
896
|
-
npm run build:portable # Exécutable portable → ./dist/MonApp.exe
|
|
897
|
-
npm run build:encrypted # Avec clé → ./dist/MonApp-Setup-1.0.0.exe (chiffré)
|
|
898
|
-
npm run build-and-run # Build puis message
|
|
899
|
-
```
|
|
900
|
-
|
|
901
|
-
**Exemple 2 : Avec options avancées dans package.json**
|
|
902
|
-
|
|
903
|
-
```json
|
|
904
|
-
{
|
|
905
|
-
"name": "mon-app-electron",
|
|
906
|
-
"version": "1.0.0",
|
|
907
|
-
"main": "main.js",
|
|
908
|
-
"scripts": {
|
|
909
|
-
"start": "electron .",
|
|
910
|
-
"dev": "electron .",
|
|
911
|
-
"build": "metadidomi-builder",
|
|
912
|
-
"build:lite": "set LITE_BUILD=true && metadidomi-builder",
|
|
913
|
-
"build:portable": "set CREATE_PORTABLE_EXE=true && metadidomi-builder",
|
|
914
|
-
"build:upx": "set USE_UPX=true && metadidomi-builder",
|
|
915
|
-
"build:full": "set CREATE_PORTABLE_EXE=true && set LITE_BUILD=true && set USE_UPX=true && metadidomi-builder",
|
|
916
|
-
"build:protected": "set LITE_BUILD=true && metadidomi-builder --medium-protection"
|
|
917
|
-
},
|
|
918
|
-
"dependencies": {
|
|
919
|
-
"electron": "^31.0.0"
|
|
920
|
-
}
|
|
921
|
-
}
|
|
922
|
-
```
|
|
923
|
-
|
|
924
|
-
**Exemple 3 : Avec npx (sans installation)**
|
|
925
|
-
|
|
926
619
|
```powershell
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
```
|
|
931
|
-
|
|
932
|
-
npm run build
|
|
933
|
-
# Résultat: ./dist/MonApp-Setup-1.0.0.exe
|
|
934
|
-
```
|
|
620
|
+
# Mode simple (depuis votre app)
|
|
621
|
+
cd D:\MonApp
|
|
622
|
+
node C:\metadidomi-builder\build_tools\builder.js
|
|
935
623
|
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
npx metadidomi-builder
|
|
939
|
-
# Résultat: ./dist/MonApp-Setup-1.0.0.exe
|
|
940
|
-
```
|
|
624
|
+
# Avec source et sortie personnalisées
|
|
625
|
+
node build_tools/builder.js --app-src D:\mon-app --output D:\dist
|
|
941
626
|
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
# Ou
|
|
946
|
-
$env:KEY="ma-clé-secrète"; npm run build
|
|
947
|
-
```
|
|
627
|
+
# Avec chiffrement
|
|
628
|
+
$env:KEY="ma-clé-secrète"
|
|
629
|
+
node build_tools/builder.js --app-src C:\MonApp
|
|
948
630
|
|
|
949
|
-
|
|
950
|
-
```powershell
|
|
631
|
+
# Portable + LITE + UPX
|
|
951
632
|
$env:CREATE_PORTABLE_EXE="true"
|
|
952
633
|
$env:LITE_BUILD="true"
|
|
953
634
|
$env:USE_UPX="true"
|
|
@@ -1014,6 +695,11 @@ L'injection ajoute automatiquement :
|
|
|
1014
695
|
|
|
1015
696
|
---
|
|
1016
697
|
|
|
698
|
+
## 📊 Comparaison avec electron-builder
|
|
699
|
+
- Options d'obfuscation sûres et compatibles
|
|
700
|
+
- Pas de transformation agressive du code
|
|
701
|
+
- Préserve la stabilité de l'application
|
|
702
|
+
|
|
1017
703
|
### 📊 Protection multiniveau
|
|
1018
704
|
Cette approche assure :
|
|
1019
705
|
- ✅ **Sécurité maximale** : Protection forte contre l'analyse statique
|
|
@@ -1402,105 +1088,43 @@ L'empaquetage récursif est optimisé pour :
|
|
|
1402
1088
|
| **Chiffrement ressources** | ✅ AES-256 intégré | ❌ Addon requis |
|
|
1403
1089
|
| **Bytecode protection** | ✅ bytenode natif | ❌ Non |
|
|
1404
1090
|
| **Mode LITE** | ✅ Analyse dépendances | ❌ Non |
|
|
1405
|
-
| **Build reproducible** | ✅
|
|
1406
|
-
| **Packaging Python** | ✅ Oui (NSIS + obfuscation) | ❌ Non |
|
|
1407
|
-
| **Protection code Python** | ✅ pyMetadidomi (light/medium/heavy) | ❌ Non |
|
|
1408
|
-
| **Multi-plateforme** | ⏳ Q1-2026 (macOS/Linux) | ✅ Windows/macOS/Linux |
|
|
1409
|
-
| **Communauté** | 🆕 En croissance | ✅ Très large |
|
|
1410
|
-
| **Support commercial** | ✅ Direct (ETS METADIDOMI) | ✅ Communauté + sponsors |
|
|
1411
|
-
|
|
1412
|
-
### 🎯 Tableau Récapitulatif
|
|
1413
|
-
|
|
1414
|
-
**metadidomi-builder** :
|
|
1415
|
-
- ✅ **Sécurité maximale** - AES-256, bytecode, obfuscation pyMetadidomi
|
|
1416
|
-
- ✅ **100% offline** - Zéro dépendance externe, tous les outils embarqués
|
|
1417
|
-
- ✅ **Builds reproductibles** - Déterministe et versionnable
|
|
1418
|
-
- ✅ **Python support** - Applications Python complètes avec installateurs NSIS
|
|
1419
|
-
- ⏳ **Multi-plateforme** - Windows maintenant, macOS/Linux 2026
|
|
1420
|
-
|
|
1421
|
-
**electron-builder** :
|
|
1422
|
-
- ✅ **Multi-plateforme établi** - Windows, macOS, Linux, AppImage, Snap
|
|
1423
|
-
- ✅ **Configuration simple** - Template facile à adapter
|
|
1424
|
-
- ✅ **Communauté large** - Nombreuses extensions et plugins
|
|
1425
|
-
- ⚠️ **Dépendances réseau** - Nécessite téléchargements externe
|
|
1426
|
-
- ❌ **Python non supporté** - Electron uniquement
|
|
1427
|
-
|
|
1428
|
-
### 💡 Comment Choisir?
|
|
1429
|
-
|
|
1430
|
-
**Utilisez metadidomi-builder si vous avez besoin de :**
|
|
1431
|
-
- 🔐 Sécurité critique (finance, santé, militaire)
|
|
1432
|
-
- 📦 Packaging Python standalone avec installateur professionnel
|
|
1433
|
-
- 🔒 Obfuscation et protection du code (anti-reverse engineering)
|
|
1434
|
-
- 🚫 Environnement complètement offline
|
|
1435
|
-
- ⚙️ Contrôle total sur le processus de build
|
|
1436
|
-
|
|
1437
|
-
**Utilisez electron-builder si vous avez besoin de :**
|
|
1438
|
-
- 🖥️ Multi-plateforme stable et mature
|
|
1439
|
-
- 🚀 Setup rapide et facile (peu de configuration)
|
|
1440
|
-
- 👥 Accès à une large communauté et d'extensions
|
|
1441
|
-
- 📱 Support macOS/Linux dès maintenant
|
|
1442
|
-
- 🔄 Updates automatiques intégrées
|
|
1091
|
+
| **Build reproducible** | ✅ Oui | ⚠️ Partiel |
|
|
1443
1092
|
|
|
1444
|
-
|
|
1093
|
+
**metadidomi-builder** : Optimal pour sécurité maximale, 100% offline, protection bytecode
|
|
1094
|
+
**electron-builder** : Optimal pour multi-plateforme, configuration simple, communauté large
|
|
1095
|
+
|
|
1096
|
+
👉 **Choisir metadidomi-builder si** : sécurité critique, environnement offline, control total
|
|
1097
|
+
👉 **Choisir electron-builder si** : multi-plateforme, setup simple, app standard
|
|
1445
1098
|
|
|
1446
|
-
|
|
1099
|
+
---
|
|
1447
1100
|
|
|
1448
1101
|
## � Packaging d'Applications Python
|
|
1449
1102
|
|
|
1450
1103
|
Le builder inclut aussi un **système complet de packaging Python** via `builder.py` pour créer des applications Windows standalone avec installateurs NSIS professionnels.
|
|
1451
1104
|
|
|
1452
|
-
|
|
1453
1105
|
### 🚀 Démarrage Rapide - Applications Python
|
|
1454
1106
|
|
|
1455
|
-
**
|
|
1107
|
+
**Le plus simple** - Exécutez le builder Python depuis votre dossier d'application :
|
|
1456
1108
|
|
|
1457
1109
|
```powershell
|
|
1458
|
-
#
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
# Ajoutez des scripts dans votre package.json
|
|
1462
|
-
# "scripts": {
|
|
1463
|
-
# "build:python": "python node_modules\\metadidomi-builder\\build_tools_py\\builder.py --app-src ./src",
|
|
1464
|
-
# "build:python:gui": "python node_modules\\metadidomi-builder\\build_tools_py\\builder.py --gui --app-src ./src"
|
|
1465
|
-
# }
|
|
1466
|
-
|
|
1467
|
-
# Puis lancez avec :
|
|
1468
|
-
npm run build:python # Mode console (par défaut)
|
|
1469
|
-
# Résultat: ./dist/MonApp-Setup-1.0.0.exe
|
|
1470
|
-
|
|
1471
|
-
# OU
|
|
1472
|
-
npm run build:python:gui # Mode GUI (sans console)
|
|
1473
|
-
# Résultat: ./dist/MonApp-Setup-1.0.0.exe
|
|
1474
|
-
```
|
|
1475
|
-
|
|
1476
|
-
> **Astuce :** Placez toujours vos sources Python dans un dossier `src/` et ajoutez l’option `--app-src ./src` à vos scripts dans le `package.json`. Cela évite les erreurs de scan des dossiers `node_modules` et `vendor` (chemins trop longs ou fichiers manquants).
|
|
1477
|
-
> Placez vos fichiers sources Python (`config.py`, `__main__.py`, etc.) dans un dossier séparé (ex : `src/`).
|
|
1478
|
-
> Puis lancez le build en précisant le chemin source :
|
|
1479
|
-
> ```powershell
|
|
1480
|
-
> npm run build:python -- --app-src ./src
|
|
1481
|
-
> ```
|
|
1482
|
-
> Cela évite que le builder scanne le dossier `node_modules` et les vendors, et prévient les erreurs de chemin trop long ou manquant.
|
|
1483
|
-
|
|
1484
|
-
**Option 2 : Avec npx (sans installation)**
|
|
1110
|
+
# Depuis votre répertoire d'application Python
|
|
1111
|
+
cd D:\mon-app-python
|
|
1112
|
+
python D:\chemin-vers\metadidomi-builder\build_tools_py\builder.py
|
|
1485
1113
|
|
|
1486
|
-
```powershell
|
|
1487
|
-
npx metadidomi-builder-python
|
|
1488
1114
|
# Résultat: ./dist/MonApp-Setup-1.0.0.exe
|
|
1489
1115
|
```
|
|
1490
1116
|
|
|
1491
|
-
**
|
|
1117
|
+
**Ou avec options personnalisées :**
|
|
1492
1118
|
|
|
1493
1119
|
```powershell
|
|
1494
|
-
#
|
|
1495
|
-
|
|
1496
|
-
# Résultat: ./dist/MonApp-Setup-1.0.0.exe
|
|
1120
|
+
# Source et sortie personnalisées
|
|
1121
|
+
python builder.py --app-src D:\mon-app --output D:\dist
|
|
1497
1122
|
|
|
1498
1123
|
# Mode GUI (sans fenêtre console)
|
|
1499
|
-
|
|
1500
|
-
# Résultat: ./dist/MonApp-Setup-1.0.0.exe
|
|
1124
|
+
python builder.py --gui
|
|
1501
1125
|
|
|
1502
|
-
#
|
|
1503
|
-
|
|
1126
|
+
# Combiné
|
|
1127
|
+
python builder.py --app-src D:\mon-app --output D:\dist --gui
|
|
1504
1128
|
```
|
|
1505
1129
|
|
|
1506
1130
|
### 📋 Structure Minimale d'une Application Python
|
|
@@ -1720,9 +1344,7 @@ Le builder utilise **Python Embeddable** pour les utilisateurs finaux :
|
|
|
1720
1344
|
- ✅ Distribution portable
|
|
1721
1345
|
- ✅ Inclus dans l'installateur NSIS
|
|
1722
1346
|
|
|
1723
|
-
**Localisation :**
|
|
1724
|
-
- Installation npm : `node_modules/metadidomi-builder/build_tools/vendor/python_embeddable/`
|
|
1725
|
-
- Installation manuelle : `build_tools/vendor/python_embeddable/`
|
|
1347
|
+
**Localisation :** `build_tools/vendor/python_embeddable/`
|
|
1726
1348
|
|
|
1727
1349
|
### 🔐 Protection du Code Python
|
|
1728
1350
|
|
|
@@ -1745,24 +1367,6 @@ Le builder utilise **Python Embeddable** pour les utilisateurs finaux :
|
|
|
1745
1367
|
- Code Python injecté dynamiquement
|
|
1746
1368
|
- Exécution directe sans interpréteur externe
|
|
1747
1369
|
|
|
1748
|
-
#### Niveaux de protection du code Python
|
|
1749
|
-
|
|
1750
|
-
Vous pouvez protéger votre code Python lors du build avec différents niveaux de protection :
|
|
1751
|
-
|
|
1752
|
-
```powershell
|
|
1753
|
-
npm run build:python -- --app-src ./src --light-protection
|
|
1754
|
-
npm run build:python:gui -- --app-src ./src --medium-protection
|
|
1755
|
-
npm run build:python -- --app-src ./src --heavy-protection
|
|
1756
|
-
```
|
|
1757
|
-
|
|
1758
|
-
**Options de protection :**
|
|
1759
|
-
|
|
1760
|
-
- `--light-protection` : Obfuscation légère (carbon + junk)
|
|
1761
|
-
- `--medium-protection` : Obfuscation moyenne (carbon + junk + bugs + dead-code)
|
|
1762
|
-
- `--heavy-protection` : Protection maximale (toutes les options)
|
|
1763
|
-
|
|
1764
|
-
**Remarque :** Ces options ne concernent que les projets Python. Pour Electron, voir la section correspondante.
|
|
1765
|
-
|
|
1766
1370
|
### 📊 Fichiers Générés
|
|
1767
1371
|
|
|
1768
1372
|
```
|
|
@@ -1781,59 +1385,54 @@ dist/
|
|
|
1781
1385
|
|
|
1782
1386
|
#### Exemple 1 : Application Console Simple
|
|
1783
1387
|
|
|
1784
|
-
**Avec npm :**
|
|
1785
1388
|
```powershell
|
|
1786
1389
|
# Structure
|
|
1787
1390
|
mon-app/
|
|
1788
|
-
|
|
1789
|
-
|
|
1790
|
-
__main__.py
|
|
1391
|
+
config.py
|
|
1392
|
+
__main__.py
|
|
1791
1393
|
|
|
1792
1394
|
# Build
|
|
1793
1395
|
cd mon-app
|
|
1794
|
-
|
|
1396
|
+
python ..\builder.py
|
|
1795
1397
|
# Résultat: ./dist/MonApp-Setup-1.0.0.exe
|
|
1796
1398
|
```
|
|
1797
1399
|
|
|
1798
1400
|
#### Exemple 2 : Application Tkinter GUI
|
|
1799
1401
|
|
|
1800
|
-
**Avec npm :**
|
|
1801
1402
|
```powershell
|
|
1802
1403
|
# Structure
|
|
1803
1404
|
mon-app-gui/
|
|
1804
|
-
|
|
1805
|
-
|
|
1806
|
-
|
|
1807
|
-
|
|
1808
|
-
icon.ico
|
|
1405
|
+
config.py
|
|
1406
|
+
__main__.py ← Interface Tkinter
|
|
1407
|
+
assets/
|
|
1408
|
+
icon.ico
|
|
1809
1409
|
|
|
1810
1410
|
# Build (mode GUI pour éviter console)
|
|
1811
|
-
|
|
1411
|
+
cd mon-app-gui
|
|
1412
|
+
python ..\..\builder.py --gui
|
|
1812
1413
|
# Résultat: ./dist/MonApp-Setup-1.0.0.exe (pas de console)
|
|
1813
1414
|
```
|
|
1814
1415
|
|
|
1815
1416
|
#### Exemple 3 : Application Complexe Multi-Fichiers
|
|
1816
1417
|
|
|
1817
|
-
**Avec npm :**
|
|
1818
1418
|
```powershell
|
|
1819
1419
|
# Structure complexe
|
|
1820
1420
|
mon-app/
|
|
1821
|
-
|
|
1822
|
-
|
|
1823
|
-
|
|
1824
|
-
|
|
1825
|
-
|
|
1826
|
-
|
|
1827
|
-
|
|
1828
|
-
|
|
1829
|
-
|
|
1830
|
-
|
|
1831
|
-
|
|
1832
|
-
|
|
1833
|
-
data.json
|
|
1421
|
+
config.py
|
|
1422
|
+
__main__.py
|
|
1423
|
+
utils/
|
|
1424
|
+
helpers.py
|
|
1425
|
+
validators.py
|
|
1426
|
+
lib/
|
|
1427
|
+
core.py
|
|
1428
|
+
handlers/
|
|
1429
|
+
events.py
|
|
1430
|
+
assets/
|
|
1431
|
+
icon.ico
|
|
1432
|
+
data.json
|
|
1834
1433
|
|
|
1835
|
-
# Build
|
|
1836
|
-
|
|
1434
|
+
# Build avec sortie personnalisée
|
|
1435
|
+
python builder.py --app-src D:\mon-app --output D:\dist
|
|
1837
1436
|
# TOUS les fichiers récursivement inclus ✅
|
|
1838
1437
|
```
|
|
1839
1438
|
|
|
@@ -1841,52 +1440,30 @@ npm run build:python -- --app-src ./src
|
|
|
1841
1440
|
|
|
1842
1441
|
#### Avec Clé de Chiffrement Personnalisée
|
|
1843
1442
|
|
|
1844
|
-
**Avec npm :**
|
|
1845
|
-
```powershell
|
|
1846
|
-
# Via variable d'environnement
|
|
1847
|
-
$env:KEY = "ma-clé-secrète-32-caractères"
|
|
1848
|
-
npm run build:python -- --app-src ./src
|
|
1849
|
-
```
|
|
1850
|
-
|
|
1851
|
-
**Manuel :**
|
|
1852
1443
|
```powershell
|
|
1853
1444
|
# Option 1: Via argument
|
|
1854
|
-
|
|
1445
|
+
python builder.py --key "ma-clé-secrète-32-caractères"
|
|
1855
1446
|
|
|
1856
1447
|
# Option 2: Via variable d'environnement
|
|
1857
1448
|
$env:KEY = "ma-clé-secrète-32-caractères"
|
|
1858
|
-
|
|
1449
|
+
python builder.py
|
|
1859
1450
|
```
|
|
1860
1451
|
|
|
1861
1452
|
#### Sans Compilation .pyc
|
|
1862
1453
|
|
|
1863
|
-
**Avec npm :**
|
|
1864
|
-
|
|
1865
1454
|
```powershell
|
|
1866
|
-
|
|
1867
|
-
```
|
|
1868
|
-
|
|
1869
|
-
**Manuel :**
|
|
1870
|
-
```powershell
|
|
1871
|
-
node build_tools_py/builder.py --app-src ./src --no-pyc
|
|
1455
|
+
python builder.py --no-pyc
|
|
1872
1456
|
# Les .py restent non compilés (plus rapide au build)
|
|
1873
1457
|
```
|
|
1874
1458
|
|
|
1875
1459
|
#### Combinaisons
|
|
1876
1460
|
|
|
1877
|
-
**Avec npm :**
|
|
1878
|
-
```powershell
|
|
1879
|
-
# GUI + clé custom
|
|
1880
|
-
$env:KEY = "clé-secrète"; npm run build:python:gui -- --app-src ./src
|
|
1881
|
-
```
|
|
1882
|
-
|
|
1883
|
-
**Manuel :**
|
|
1884
1461
|
```powershell
|
|
1885
|
-
# GUI + clé custom
|
|
1886
|
-
|
|
1462
|
+
# GUI + sortie personnalisée + clé custom
|
|
1463
|
+
python builder.py --gui --output D:\dist --key "clé-secrète"
|
|
1887
1464
|
|
|
1888
1465
|
# Source custom + GUI + sans .pyc
|
|
1889
|
-
|
|
1466
|
+
python builder.py --app-src D:\mon-app --gui --no-pyc
|
|
1890
1467
|
```
|
|
1891
1468
|
|
|
1892
1469
|
### 🔍 Dépistage et Débogage
|
|
@@ -1980,18 +1557,786 @@ Python Embeddable distribution not found
|
|
|
1980
1557
|
```
|
|
1981
1558
|
**✅ SOLUTION:** Vérifiez le dossier `build_tools/vendor/python_embeddable/`
|
|
1982
1559
|
|
|
1983
|
-
|
|
1560
|
+
---
|
|
1561
|
+
# Metadidomi Crone - Générateur d'APK Android
|
|
1984
1562
|
|
|
1985
|
-
|
|
1986
|
-
|
|
1987
|
-
|
|
1988
|
-
|
|
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)
|
|
1989
1577
|
|
|
1990
1578
|
---
|
|
1991
1579
|
|
|
1992
|
-
|
|
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
|
+
---
|
|
2329
|
+
|
|
2330
|
+
### 📞 Support
|
|
2331
|
+
|
|
2332
|
+
Pour les questions sur le packaging Python :
|
|
2333
|
+
- 📖 Consultez ce README
|
|
2334
|
+
- 🐛 Vérifiez les logs du builder
|
|
2335
|
+
- 💬 Contactez ETS METADIDOMI
|
|
2336
|
+
|
|
2337
|
+
---
|
|
1993
2338
|
|
|
1994
|
-
##
|
|
2339
|
+
## 🗺️ Roadmap - Vision Multi-Plateforme
|
|
1995
2340
|
|
|
1996
2341
|
### Phase 1 : Windows ✅ (Actuelle)
|
|
1997
2342
|
- ✅ Build portable (.exe)
|