metadidomi-builder 1.6.2812251812 → 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 +68 -774
- package/package.json +4 -6
- 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-1a25871e.key +0 -1
- package/build_tools/certs/cert-1a25871e.pfx +0 -0
- package/build_tools/check-apk.js +0 -211
- 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 -1
- 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/manage-dependencies.js +0 -3
- package/build_tools/process-dependencies.js +0 -203
- package/build_tools/prune_modules.js +0 -147
- package/build_tools/resolve-transitive-deps.js +0 -3
- package/build_tools/restore-resources.js +0 -3
- package/build_tools/setup-androidx.js +0 -131
- package/build_tools/signing.js +0 -20
- package/build_tools/templates/bootstrap.template.js +0 -105
- 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/build_tools/verify-apk-dependencies.js +0 -261
package/README.md
CHANGED
|
@@ -17,19 +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. **[Packaging
|
|
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
24
|
11. **[Comparaison](#-comparaison-avec-electron-builder)** - vs electron-builder
|
|
25
|
-
12. **[Roadmap](#-roadmap)** - Futures versions
|
|
25
|
+
12. **[Roadmap](#-roadmap---vision-multi-plateforme)** - Futures versions
|
|
26
26
|
13. **[Support](#-support-et-contribution)** - Aide et contact
|
|
27
27
|
|
|
28
28
|
---
|
|
29
29
|
|
|
30
30
|
## 💝 À Propos
|
|
31
31
|
|
|
32
|
-
Constructeur **professionnel** pour applications Electron et Python
|
|
32
|
+
Constructeur **professionnel** pour applications Electron et Python :
|
|
33
33
|
- ✅ **Sécurité maximale** - Chiffrement AES-256, bytecode, obfuscation
|
|
34
34
|
- ✅ **Builds reproductibles** - 100% déterministe et offline
|
|
35
35
|
- ✅ **Customisation totale** - Contrôle complet du processus
|
|
@@ -513,6 +513,68 @@ mon-app/
|
|
|
513
513
|
- ✅ **Empaquetage ASAR récursif** - Tous les fichiers inclus à tous les niveaux
|
|
514
514
|
- ✅ **Gestion Python** - Support applications Python standalone
|
|
515
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
|
+
|
|
516
578
|
# 🛡️ Système de Protection Avancé
|
|
517
579
|
|
|
518
580
|
Le builder intègre un **système complet de protection du code** avec obfuscation intelligente, chiffrement multi-couches, et anti-analyse.
|
|
@@ -1672,774 +1734,6 @@ Python Embeddable distribution not found
|
|
|
1672
1734
|
```
|
|
1673
1735
|
**✅ SOLUTION:** Vérifiez le dossier `build_tools/vendor/python_embeddable/`
|
|
1674
1736
|
|
|
1675
|
-
---
|
|
1676
|
-
# Metadidomi Crone - Générateur d'APK Android
|
|
1677
|
-
|
|
1678
|
-
Une solution complète et automatisée pour créer des applications Android (APK) sans besoin de connaissances avancées en Android Studio.
|
|
1679
|
-
|
|
1680
|
-
<a id="top"></a>
|
|
1681
|
-
|
|
1682
|
-
## 📋 Table des matières
|
|
1683
|
-
|
|
1684
|
-
- [Installation rapide](#installation-rapide)
|
|
1685
|
-
- [Structure d'un projet](#structure-dun-projet)
|
|
1686
|
-
- [Créer une nouvelle application](#créer-une-nouvelle-application)
|
|
1687
|
-
- [Configuration de l'application](#configuration-de-lapplication)
|
|
1688
|
-
- [Générer l'APK](#générer-lapk)
|
|
1689
|
-
- [Exemples](#exemples)
|
|
1690
|
-
- [Dépannage](#dépannage)
|
|
1691
|
-
- [Options avancées](#options-avancées)
|
|
1692
|
-
|
|
1693
|
-
---
|
|
1694
|
-
|
|
1695
|
-
## Installation rapide
|
|
1696
|
-
|
|
1697
|
-
🔝 [Retour en haut](#top)
|
|
1698
|
-
|
|
1699
|
-
### Prérequis
|
|
1700
|
-
|
|
1701
|
-
- **Node.js** (v14 ou supérieur) - [Télécharger](https://nodejs.org)
|
|
1702
|
-
- **PowerShell** (Windows) ou **Bash** (Mac/Linux)
|
|
1703
|
-
- **Python 3** (pour la génération d'icônes) - [Télécharger](https://www.python.org)
|
|
1704
|
-
- **Pillow** (PIL) pour Python : `pip install Pillow`
|
|
1705
|
-
|
|
1706
|
-
### Vérifier l'installation
|
|
1707
|
-
|
|
1708
|
-
```powershell
|
|
1709
|
-
node --version
|
|
1710
|
-
python --version
|
|
1711
|
-
npm --version
|
|
1712
|
-
```
|
|
1713
|
-
|
|
1714
|
-
### Installation via npm (Recommandé)
|
|
1715
|
-
|
|
1716
|
-
Installez metadidomi-builder comme dépendance locale dans votre projet :
|
|
1717
|
-
|
|
1718
|
-
```powershell
|
|
1719
|
-
|
|
1720
|
-
npm install metadidomi-builder
|
|
1721
|
-
```
|
|
1722
|
-
|
|
1723
|
-
Créez un `package.json` à la racine de votre projet :
|
|
1724
|
-
|
|
1725
|
-
```json
|
|
1726
|
-
{
|
|
1727
|
-
"name": "mon-app-android",
|
|
1728
|
-
"version": "1.0.0",
|
|
1729
|
-
"scripts": {
|
|
1730
|
-
"build": "node node_modules/metadidomi-builder/build_tools/build_apk.js .",
|
|
1731
|
-
"build-debug": "node node_modules/metadidomi-builder/build_tools/build_apk.js . --fail-on-missing",
|
|
1732
|
-
"build-restore": "node node_modules/metadidomi-builder/build_tools/build_apk.js . --restore",
|
|
1733
|
-
"build-icons": "node node_modules/metadidomi-builder/build_tools/generate-icons.js ."
|
|
1734
|
-
},
|
|
1735
|
-
"keywords": [
|
|
1736
|
-
"android",
|
|
1737
|
-
"apk",
|
|
1738
|
-
"builder"
|
|
1739
|
-
],
|
|
1740
|
-
"author": "Metadidomi",
|
|
1741
|
-
"license": "MIT",
|
|
1742
|
-
"dependencies": {
|
|
1743
|
-
"metadidomi-builder": "file:../metadidomi-builder",
|
|
1744
|
-
"sharp": "^0.32.0"
|
|
1745
|
-
}
|
|
1746
|
-
}
|
|
1747
|
-
```
|
|
1748
|
-
|
|
1749
|
-
Puis installez et lancez le build :
|
|
1750
|
-
|
|
1751
|
-
```powershell
|
|
1752
|
-
npm install
|
|
1753
|
-
npm run build
|
|
1754
|
-
```
|
|
1755
|
-
|
|
1756
|
-
---
|
|
1757
|
-
|
|
1758
|
-
## Structure d'un projet
|
|
1759
|
-
|
|
1760
|
-
🔝 [Retour en haut](#top)
|
|
1761
|
-
|
|
1762
|
-
Chaque application Android doit suivre cette structure :
|
|
1763
|
-
|
|
1764
|
-
```
|
|
1765
|
-
MonApp/
|
|
1766
|
-
├── app-config.json # Configuration de l'app
|
|
1767
|
-
├── AndroidManifest.xml # Déclaration Android (généré automatiquement)
|
|
1768
|
-
├── src/
|
|
1769
|
-
│ └── com/example/monapp/
|
|
1770
|
-
│ └── MainActivity.java # Code Java principal
|
|
1771
|
-
├── res/
|
|
1772
|
-
│ ├── layout/
|
|
1773
|
-
│ │ └── activity_main.xml # Interface utilisateur
|
|
1774
|
-
│ ├── values/
|
|
1775
|
-
│ │ ├── strings.xml # Textes et traductions
|
|
1776
|
-
│ │ ├── colors.xml # Couleurs
|
|
1777
|
-
│ │ └── styles.xml # Styles et thèmes
|
|
1778
|
-
│ ├── mipmap-hdpi/
|
|
1779
|
-
│ │ └── ic_launcher.png # Icône de l'app (auto-générée)
|
|
1780
|
-
│ └── drawable/ # Images supplémentaires (optionnel)
|
|
1781
|
-
└── build/ # Généré automatiquement (à ignorer)
|
|
1782
|
-
```
|
|
1783
|
-
|
|
1784
|
-
---
|
|
1785
|
-
|
|
1786
|
-
## Créer une nouvelle application
|
|
1787
|
-
|
|
1788
|
-
### Étape 1 : Créer la structure des dossiers
|
|
1789
|
-
|
|
1790
|
-
🔝 [Retour en haut](#top)
|
|
1791
|
-
|
|
1792
|
-
```powershell
|
|
1793
|
-
mkdir MonApp\src\com\example\monapp
|
|
1794
|
-
mkdir MonApp\res\layout
|
|
1795
|
-
mkdir MonApp\res\values
|
|
1796
|
-
mkdir MonApp\res\mipmap-hdpi
|
|
1797
|
-
```
|
|
1798
|
-
|
|
1799
|
-
### Étape 2 : Créer `app-config.json`
|
|
1800
|
-
|
|
1801
|
-
Ce fichier contient toutes les informations de votre application.
|
|
1802
|
-
|
|
1803
|
-
```json
|
|
1804
|
-
{
|
|
1805
|
-
"appName": "MonApp",
|
|
1806
|
-
"appVersion": "1.0.0",
|
|
1807
|
-
"appDescription": "Ma première application Android",
|
|
1808
|
-
"packageName": "com.example.monapp",
|
|
1809
|
-
"minSdkVersion": 21,
|
|
1810
|
-
"targetSdkVersion": 34,
|
|
1811
|
-
"colors": {
|
|
1812
|
-
"primary": "#2196F3",
|
|
1813
|
-
"primaryDark": "#1976D2",
|
|
1814
|
-
"accent": "#FF5722"
|
|
1815
|
-
}
|
|
1816
|
-
}
|
|
1817
|
-
```
|
|
1818
|
-
|
|
1819
|
-
**Explications des paramètres :**
|
|
1820
|
-
- `appName` : Nom affiché de l'application
|
|
1821
|
-
- `appVersion` : Version sémantique (majeur.mineur.patch)
|
|
1822
|
-
- `packageName` : Identifiant unique (format domaine inversé)
|
|
1823
|
-
- `minSdkVersion` : Version Android minimale (21 = Android 5.0)
|
|
1824
|
-
- `targetSdkVersion` : Version Android ciblée (34 = Android 14)
|
|
1825
|
-
- `colors` : Couleurs principales (format hexadécimal)
|
|
1826
|
-
|
|
1827
|
-
### Étape 3 : Créer l'interface (`activity_main.xml`)
|
|
1828
|
-
|
|
1829
|
-
Fichier : `res/layout/activity_main.xml`
|
|
1830
|
-
|
|
1831
|
-
```xml
|
|
1832
|
-
<?xml version="1.0" encoding="utf-8"?>
|
|
1833
|
-
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
1834
|
-
android:orientation="vertical"
|
|
1835
|
-
android:layout_width="match_parent"
|
|
1836
|
-
android:layout_height="match_parent"
|
|
1837
|
-
android:gravity="center"
|
|
1838
|
-
android:padding="16dp">
|
|
1839
|
-
|
|
1840
|
-
<TextView
|
|
1841
|
-
android:id="@+id/titleText"
|
|
1842
|
-
android:layout_width="wrap_content"
|
|
1843
|
-
android:layout_height="wrap_content"
|
|
1844
|
-
android:text="Bienvenue dans MonApp"
|
|
1845
|
-
android:textSize="24sp"
|
|
1846
|
-
android:textStyle="bold" />
|
|
1847
|
-
|
|
1848
|
-
<Button
|
|
1849
|
-
android:id="@+id/myButton"
|
|
1850
|
-
android:layout_width="wrap_content"
|
|
1851
|
-
android:layout_height="wrap_content"
|
|
1852
|
-
android:text="Appuyez-moi"
|
|
1853
|
-
android:layout_marginTop="16dp" />
|
|
1854
|
-
|
|
1855
|
-
</LinearLayout>
|
|
1856
|
-
```
|
|
1857
|
-
|
|
1858
|
-
### Étape 4 : Créer les textes (`strings.xml`)
|
|
1859
|
-
|
|
1860
|
-
Fichier : `res/values/strings.xml`
|
|
1861
|
-
|
|
1862
|
-
```xml
|
|
1863
|
-
<resources>
|
|
1864
|
-
<string name="app_name">MonApp</string>
|
|
1865
|
-
<string name="app_version">1.0.0</string>
|
|
1866
|
-
<string name="app_description">Ma première application</string>
|
|
1867
|
-
<string name="hello_world">Bienvenue</string>
|
|
1868
|
-
<string name="action_settings">Paramètres</string>
|
|
1869
|
-
<string name="back">Retour</string>
|
|
1870
|
-
<string name="forward">Suivant</string>
|
|
1871
|
-
<string name="reload">Recharger</string>
|
|
1872
|
-
</resources>
|
|
1873
|
-
```
|
|
1874
|
-
|
|
1875
|
-
### Étape 5 : Créer le code Java (`MainActivity.java`)
|
|
1876
|
-
|
|
1877
|
-
Fichier : `src/com/example/monapp/MainActivity.java`
|
|
1878
|
-
|
|
1879
|
-
```java
|
|
1880
|
-
package com.example.monapp;
|
|
1881
|
-
|
|
1882
|
-
import android.app.Activity;
|
|
1883
|
-
import android.os.Bundle;
|
|
1884
|
-
import android.widget.Button;
|
|
1885
|
-
import android.widget.Toast;
|
|
1886
|
-
import android.view.View;
|
|
1887
|
-
import android.util.Log;
|
|
1888
|
-
|
|
1889
|
-
public class MainActivity extends Activity {
|
|
1890
|
-
private static final String TAG = "MonApp";
|
|
1891
|
-
|
|
1892
|
-
@Override
|
|
1893
|
-
protected void onCreate(Bundle savedInstanceState) {
|
|
1894
|
-
super.onCreate(savedInstanceState);
|
|
1895
|
-
setContentView(R.layout.activity_main);
|
|
1896
|
-
Log.d(TAG, "MainActivity créée");
|
|
1897
|
-
|
|
1898
|
-
Button myButton = (Button) findViewById(R.id.myButton);
|
|
1899
|
-
myButton.setOnClickListener(new View.OnClickListener() {
|
|
1900
|
-
@Override
|
|
1901
|
-
public void onClick(View v) {
|
|
1902
|
-
Toast.makeText(MainActivity.this, "Bouton cliqué!", Toast.LENGTH_SHORT).show();
|
|
1903
|
-
Log.d(TAG, "Bouton cliqué");
|
|
1904
|
-
}
|
|
1905
|
-
});
|
|
1906
|
-
}
|
|
1907
|
-
}
|
|
1908
|
-
```
|
|
1909
|
-
|
|
1910
|
-
### Étape 6 : Ajouter une icône
|
|
1911
|
-
|
|
1912
|
-
Placez une image PNG (96x96 pixels) dans `res/mipmap/`.
|
|
1913
|
-
|
|
1914
|
-
**Le système générera automatiquement les variantes pour tous les écrans.**
|
|
1915
|
-
|
|
1916
|
-
---
|
|
1917
|
-
|
|
1918
|
-
## Configuration de l'application
|
|
1919
|
-
|
|
1920
|
-
🔝 [Retour en haut](#top)
|
|
1921
|
-
|
|
1922
|
-
### `app-config.json` complet
|
|
1923
|
-
|
|
1924
|
-
```json
|
|
1925
|
-
{
|
|
1926
|
-
"appName": "MonApp",
|
|
1927
|
-
"appVersion": "1.0.0",
|
|
1928
|
-
"appDescription": "Ma première application Android",
|
|
1929
|
-
"packageName": "com.example.monapp",
|
|
1930
|
-
"minSdkVersion": 21,
|
|
1931
|
-
"targetSdkVersion": 34,
|
|
1932
|
-
"colors": {
|
|
1933
|
-
"primary": "#2196F3",
|
|
1934
|
-
"primaryDark": "#1976D2",
|
|
1935
|
-
"accent": "#FF5722"
|
|
1936
|
-
},
|
|
1937
|
-
"minimalRequiredFiles": [
|
|
1938
|
-
"AndroidManifest.xml",
|
|
1939
|
-
"res/values/strings.xml",
|
|
1940
|
-
"res/values/styles.xml",
|
|
1941
|
-
"res/layout/activity_main.xml"
|
|
1942
|
-
]
|
|
1943
|
-
}
|
|
1944
|
-
```
|
|
1945
|
-
|
|
1946
|
-
---
|
|
1947
|
-
|
|
1948
|
-
## Générer l'APK
|
|
1949
|
-
|
|
1950
|
-
🔝 [Retour en haut](#top)
|
|
1951
|
-
|
|
1952
|
-
### Avec npm
|
|
1953
|
-
|
|
1954
|
-
```powershell
|
|
1955
|
-
# Build standard
|
|
1956
|
-
npm run build
|
|
1957
|
-
|
|
1958
|
-
# Build avec vérification stricte
|
|
1959
|
-
npm run build-debug
|
|
1960
|
-
|
|
1961
|
-
# Générer les icônes
|
|
1962
|
-
npm run build-icons
|
|
1963
|
-
```
|
|
1964
|
-
|
|
1965
|
-
### Sans sauvegarde
|
|
1966
|
-
|
|
1967
|
-
```powershell
|
|
1968
|
-
node "metadidomi-builder\build_tools\build_apk.js" "MonApp" --no-backup
|
|
1969
|
-
```
|
|
1970
|
-
|
|
1971
|
-
### Restaurer depuis une sauvegarde
|
|
1972
|
-
|
|
1973
|
-
```powershell
|
|
1974
|
-
node "metadidomi-builder\build_tools\build_apk.js" "MonApp" --restore
|
|
1975
|
-
```
|
|
1976
|
-
|
|
1977
|
-
### Résultat
|
|
1978
|
-
|
|
1979
|
-
Après une génération réussie, vous trouverez :
|
|
1980
|
-
|
|
1981
|
-
```
|
|
1982
|
-
MonApp/
|
|
1983
|
-
└── MonApp.apk ← Votre application, prête à installer!
|
|
1984
|
-
```
|
|
1985
|
-
|
|
1986
|
-
Fichier de sortie : `MonApp/MonApp.apk`
|
|
1987
|
-
|
|
1988
|
-
**Taille typique :** 2-5 MB
|
|
1989
|
-
|
|
1990
|
-
---
|
|
1991
|
-
|
|
1992
|
-
## Exemples
|
|
1993
|
-
|
|
1994
|
-
🔝 [Retour en haut](#top)
|
|
1995
|
-
|
|
1996
|
-
### Exemple 1 : Application Compteur
|
|
1997
|
-
|
|
1998
|
-
Voir le dossier `CounterApp/` pour un exemple complet d'une application de compteur avec :
|
|
1999
|
-
- Boutons d'incrémentation/décrémentation
|
|
2000
|
-
- Affichage d'un compteur
|
|
2001
|
-
- Interface colorée
|
|
2002
|
-
|
|
2003
|
-
### Exemple 2 : Application Simple
|
|
2004
|
-
|
|
2005
|
-
Consultez `MyApp/` pour une application de base.
|
|
2006
|
-
|
|
2007
|
-
### Exemple 3 : Application Avancée
|
|
2008
|
-
|
|
2009
|
-
`MyApp_Advanced/` contient des fonctionnalités plus complexes.
|
|
2010
|
-
|
|
2011
|
-
---
|
|
2012
|
-
|
|
2013
|
-
## Dépannage
|
|
2014
|
-
|
|
2015
|
-
🔝 [Retour en haut](#top)
|
|
2016
|
-
|
|
2017
|
-
### Erreur : "Aucun fichier Java trouvé"
|
|
2018
|
-
|
|
2019
|
-
**Cause** : Le dossier `src/` est vide ou mal structuré.
|
|
2020
|
-
|
|
2021
|
-
**Solution** :
|
|
2022
|
-
1. Vérifiez que `MainActivity.java` existe dans `src/com/example/monapp/`
|
|
2023
|
-
2. Vérifiez le nom du package (doit correspondre à `packageName` dans `app-config.json`)
|
|
2024
|
-
|
|
2025
|
-
```
|
|
2026
|
-
src/
|
|
2027
|
-
└── com/example/monapp/
|
|
2028
|
-
└── MainActivity.java ✓ Correct
|
|
2029
|
-
```
|
|
2030
|
-
|
|
2031
|
-
### Erreur : "resource string/... not found"
|
|
2032
|
-
|
|
2033
|
-
**Cause** : Une chaîne de caractères référencée n'existe pas dans `strings.xml`.
|
|
2034
|
-
|
|
2035
|
-
**Solution** :
|
|
2036
|
-
1. Ouvrez `res/values/strings.xml`
|
|
2037
|
-
2. Ajoutez la chaîne manquante avec son ID correct :
|
|
2038
|
-
```xml
|
|
2039
|
-
<string name="fragment1">Fragments</string>
|
|
2040
|
-
<string name="action_click">Cliquez ici</string>
|
|
2041
|
-
```
|
|
2042
|
-
3. **Assurez-vous que le nom correspond exactement** à celui utilisé dans votre layout XML
|
|
2043
|
-
|
|
2044
|
-
**Exemple d'erreur rencontrée (CounterApp) :**
|
|
2045
|
-
```
|
|
2046
|
-
error: resource string/fragment1 not found
|
|
2047
|
-
```
|
|
2048
|
-
**Correction appliquée :**
|
|
2049
|
-
```xml
|
|
2050
|
-
<!-- res/values/strings.xml -->
|
|
2051
|
-
<resources>
|
|
2052
|
-
<string name="app_name">CounterApp</string>
|
|
2053
|
-
<string name="fragment1">Compteur</string>
|
|
2054
|
-
<string name="increment">Incrémenter</string>
|
|
2055
|
-
<string name="decrement">Décrémenter</string>
|
|
2056
|
-
<string name="reset">Réinitialiser</string>
|
|
2057
|
-
</resources>
|
|
2058
|
-
```
|
|
2059
|
-
|
|
2060
|
-
### Erreur : "cannot find symbol: variable R"
|
|
2061
|
-
|
|
2062
|
-
**Cause** : Les ressources n'ont pas été compilées correctement.
|
|
2063
|
-
|
|
2064
|
-
**Solution** :
|
|
2065
|
-
1. Supprimez le dossier `build/`
|
|
2066
|
-
2. Vérifiez que `res/values/strings.xml` est valide (XML bien formé, pas d'accents mal encodés)
|
|
2067
|
-
3. Relancez la génération complète
|
|
2068
|
-
|
|
2069
|
-
### Erreur : "D8 compilation failed" avec "NullPointerException"
|
|
2070
|
-
|
|
2071
|
-
**Cause** : Classes anonymes mal générées lors de la compilation DEX.
|
|
2072
|
-
|
|
2073
|
-
**Symptômes** :
|
|
2074
|
-
```
|
|
2075
|
-
java.lang.NullPointerException: Cannot invoke "String.length()"
|
|
2076
|
-
Exception in thread "main" java.lang.NullPointerException
|
|
2077
|
-
```
|
|
2078
|
-
|
|
2079
|
-
**Solution - Utilisez `implements View.OnClickListener` au lieu de classes anonymes** :
|
|
2080
|
-
|
|
2081
|
-
❌ **INCORRECT (cause l'erreur D8)** :
|
|
2082
|
-
```java
|
|
2083
|
-
button.setOnClickListener(new View.OnClickListener() {
|
|
2084
|
-
@Override
|
|
2085
|
-
public void onClick(View v) {
|
|
2086
|
-
counter++;
|
|
2087
|
-
updateDisplay();
|
|
2088
|
-
}
|
|
2089
|
-
});
|
|
2090
|
-
```
|
|
2091
|
-
|
|
2092
|
-
✅ **CORRECT** :
|
|
2093
|
-
```java
|
|
2094
|
-
public class MainActivity extends Activity implements View.OnClickListener {
|
|
2095
|
-
private Button incrementBtn, decrementBtn;
|
|
2096
|
-
|
|
2097
|
-
@Override
|
|
2098
|
-
public void onClick(View v) {
|
|
2099
|
-
int id = v.getId();
|
|
2100
|
-
if (id == R.id.incrementBtn) counter++;
|
|
2101
|
-
else if (id == R.id.decrementBtn) counter--;
|
|
2102
|
-
}
|
|
2103
|
-
}
|
|
2104
|
-
```
|
|
2105
|
-
|
|
2106
|
-
**Pourquoi** : D8 (compilateur DEX) a des problèmes avec les classes anonymes imbriquées. Les interfaces nommées sont plus fiables.
|
|
2107
|
-
|
|
2108
|
-
### Erreur : "cannot find symbol: variable helloText" ou autre ID de ressource
|
|
2109
|
-
|
|
2110
|
-
**Cause** : Le code Java référence un ID qui n'existe pas dans le layout XML.
|
|
2111
|
-
|
|
2112
|
-
**Symptôme** :
|
|
2113
|
-
```
|
|
2114
|
-
error: cannot find symbol
|
|
2115
|
-
symbol: variable helloText
|
|
2116
|
-
location: class MainActivity
|
|
2117
|
-
```
|
|
2118
|
-
|
|
2119
|
-
**Solution** :
|
|
2120
|
-
1. Vérifiez que l'ID existe dans `res/layout/activity_main.xml` :
|
|
2121
|
-
```xml
|
|
2122
|
-
<TextView
|
|
2123
|
-
android:id="@+id/helloText"
|
|
2124
|
-
...
|
|
2125
|
-
/>
|
|
2126
|
-
```
|
|
2127
|
-
2. Vérifiez que vous utilisez le bon nom en Java :
|
|
2128
|
-
```java
|
|
2129
|
-
TextView helloText = (TextView) findViewById(R.id.helloText);
|
|
2130
|
-
```
|
|
2131
|
-
3. Assurez-vous que l'ID correspond EXACTEMENT (majuscules/minuscules)
|
|
2132
|
-
|
|
2133
|
-
**Exemple de correction (CounterApp)** :
|
|
2134
|
-
```xml
|
|
2135
|
-
<!-- res/layout/activity_main.xml -->
|
|
2136
|
-
<LinearLayout ...>
|
|
2137
|
-
<TextView
|
|
2138
|
-
android:id="@+id/counterDisplay"
|
|
2139
|
-
android:layout_width="match_parent"
|
|
2140
|
-
android:layout_height="wrap_content"
|
|
2141
|
-
android:text="0"
|
|
2142
|
-
android:textSize="72sp" />
|
|
2143
|
-
|
|
2144
|
-
<Button
|
|
2145
|
-
android:id="@+id/incrementBtn"
|
|
2146
|
-
android:text="Incrémenter" />
|
|
2147
|
-
</LinearLayout>
|
|
2148
|
-
```
|
|
2149
|
-
|
|
2150
|
-
### Erreur : "AndroidManifest.xml not found"
|
|
2151
|
-
|
|
2152
|
-
**Cause** : Fichier de configuration critique manquant ou mal généré.
|
|
2153
|
-
|
|
2154
|
-
**Solution** :
|
|
2155
|
-
1. Vérifiez que `app-config.json` existe à la racine du projet
|
|
2156
|
-
2. Assurez-vous que le JSON est valide (syntaxe correcte, pas de virgules manquantes)
|
|
2157
|
-
3. Relancez le build avec l'option `--fail-on-missing` pour diagnostiquer :
|
|
2158
|
-
```powershell
|
|
2159
|
-
node "metadidomi-builder\build_tools\build_apk.js" "MonApp" --fail-on-missing
|
|
2160
|
-
```
|
|
2161
|
-
|
|
2162
|
-
### Erreur : "Fichiers minimums manquants"
|
|
2163
|
-
|
|
2164
|
-
**Cause** : Des fichiers essentiels n'existent pas.
|
|
2165
|
-
|
|
2166
|
-
**Files requises minimales** :
|
|
2167
|
-
- `app-config.json` → Configuration de l'app
|
|
2168
|
-
- `AndroidManifest.xml` → Descripteur (généré automatiquement)
|
|
2169
|
-
- `res/values/strings.xml` → Textes
|
|
2170
|
-
- `res/values/styles.xml` → Styles (généré automatiquement)
|
|
2171
|
-
- `res/layout/activity_main.xml` → Interface utilisateur
|
|
2172
|
-
- `src/com/example/monapp/MainActivity.java` → Code principal
|
|
2173
|
-
|
|
2174
|
-
**Solution** :
|
|
2175
|
-
```powershell
|
|
2176
|
-
# Mode diagnostique - affiche les fichiers manquants sans échouer
|
|
2177
|
-
node "metadidomi-builder\build_tools\build_apk.js" "MonApp"
|
|
2178
|
-
|
|
2179
|
-
# Mode strict - échoue si des fichiers manquent
|
|
2180
|
-
node "metadidomi-builder\build_tools\build_apk.js" "MonApp" --fail-on-missing
|
|
2181
|
-
```
|
|
2182
|
-
|
|
2183
|
-
### L'APK n'est pas généré
|
|
2184
|
-
|
|
2185
|
-
**Cause** : Erreur lors de la signature ou de l'assemblage final.
|
|
2186
|
-
|
|
2187
|
-
**Solution** :
|
|
2188
|
-
1. Supprimez le fichier `.keystore` dans le dossier du projet :
|
|
2189
|
-
```powershell
|
|
2190
|
-
rm "MonApp\.keystore"
|
|
2191
|
-
```
|
|
2192
|
-
2. Relancez la génération (un nouveau keystore sera créé) :
|
|
2193
|
-
```powershell
|
|
2194
|
-
node "metadidomi-builder\build_tools\build_apk.js" "MonApp"
|
|
2195
|
-
```
|
|
2196
|
-
|
|
2197
|
-
### Erreur : "Invalid app-config.json"
|
|
2198
|
-
|
|
2199
|
-
**Cause** : Fichier de configuration mal formé.
|
|
2200
|
-
|
|
2201
|
-
**Vérifiez** :
|
|
2202
|
-
```json
|
|
2203
|
-
{
|
|
2204
|
-
"appName": "MonApp", // ✓ String valide
|
|
2205
|
-
"appVersion": "1.0.0", // ✓ Format sémantique (majeur.mineur.patch)
|
|
2206
|
-
"packageName": "com.example.monapp", // ✓ Format domaine inversé
|
|
2207
|
-
"minSdkVersion": 21, // ✓ Nombre entier >= 21
|
|
2208
|
-
"targetSdkVersion": 34, // ✓ Nombre entier
|
|
2209
|
-
"colors": {
|
|
2210
|
-
"primary": "#2196F3", // ✓ Couleur hexadécimale valide
|
|
2211
|
-
"primaryDark": "#1976D2",
|
|
2212
|
-
"accent": "#FF5722"
|
|
2213
|
-
}
|
|
2214
|
-
}
|
|
2215
|
-
```
|
|
2216
|
-
|
|
2217
|
-
### Erreur : "Layout XML invalide"
|
|
2218
|
-
|
|
2219
|
-
**Cause** : Syntaxe XML incorrecte dans `activity_main.xml`.
|
|
2220
|
-
|
|
2221
|
-
**Vérifiez** :
|
|
2222
|
-
- Les balises ouvrantes et fermantes correspondent (`<LinearLayout>` ... `</LinearLayout>`)
|
|
2223
|
-
- Les attributs android: sont valides
|
|
2224
|
-
- Les IDs sont uniques et bien formatés (`android:id="@+id/monId"`)
|
|
2225
|
-
- Les textes spéciaux sont échappés (`&`, `<`, `>`)
|
|
2226
|
-
|
|
2227
|
-
**Exemple correct** :
|
|
2228
|
-
```xml
|
|
2229
|
-
<?xml version="1.0" encoding="utf-8"?>
|
|
2230
|
-
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
2231
|
-
android:orientation="vertical"
|
|
2232
|
-
android:layout_width="match_parent"
|
|
2233
|
-
android:layout_height="match_parent">
|
|
2234
|
-
|
|
2235
|
-
<Button
|
|
2236
|
-
android:id="@+id/myButton"
|
|
2237
|
-
android:layout_width="wrap_content"
|
|
2238
|
-
android:layout_height="wrap_content"
|
|
2239
|
-
android:text="Cliquez-moi" />
|
|
2240
|
-
|
|
2241
|
-
</LinearLayout>
|
|
2242
|
-
```
|
|
2243
|
-
|
|
2244
|
-
### Erreur : "Icônes manquantes"
|
|
2245
|
-
|
|
2246
|
-
**Cause** : L'icône n'a pas été générée ou redimensionnée correctement.
|
|
2247
|
-
|
|
2248
|
-
**Solution** :
|
|
2249
|
-
1. Placez une image PNG (96x96 pixels minimum) dans `res/drawable/` ou `res/mipmap/`
|
|
2250
|
-
2. Exécutez le générateur d'icônes :
|
|
2251
|
-
```powershell
|
|
2252
|
-
node "metadidomi-builder\build_tools\generate-icons.js" "MonApp"
|
|
2253
|
-
```
|
|
2254
|
-
3. Vérifiez que tous les dossiers mipmap ont été créés :
|
|
2255
|
-
```
|
|
2256
|
-
res/mipmap-mdpi/ic_launcher.png (48x48)
|
|
2257
|
-
res/mipmap-hdpi/ic_launcher.png (72x72)
|
|
2258
|
-
res/mipmap-xhdpi/ic_launcher.png (96x96)
|
|
2259
|
-
res/mipmap-xxhdpi/ic_launcher.png (144x144)
|
|
2260
|
-
res/mipmap-xxxhdpi/ic_launcher.png (192x192)
|
|
2261
|
-
```
|
|
2262
|
-
|
|
2263
|
-
### Erreur : "Package name already exists"
|
|
2264
|
-
|
|
2265
|
-
**Cause** : Un package Android avec le même nom est déjà installé.
|
|
2266
|
-
|
|
2267
|
-
**Solution** :
|
|
2268
|
-
1. Changez le `packageName` dans `app-config.json` :
|
|
2269
|
-
```json
|
|
2270
|
-
"packageName": "com.example.monapp.v2"
|
|
2271
|
-
```
|
|
2272
|
-
2. Régénérez l'APK
|
|
2273
|
-
3. Ou : désinstallez l'ancienne app avant d'installer la nouvelle
|
|
2274
|
-
|
|
2275
|
-
---
|
|
2276
|
-
|
|
2277
|
-
## Options avancées
|
|
2278
|
-
|
|
2279
|
-
🔝 [Retour en haut](#top)
|
|
2280
|
-
|
|
2281
|
-
### Personnaliser les ressources générées automatiquement
|
|
2282
|
-
|
|
2283
|
-
Par défaut, le système génère :
|
|
2284
|
-
- `AndroidManifest.xml` (descripteur de l'app)
|
|
2285
|
-
- `res/values/colors.xml` (couleurs)
|
|
2286
|
-
- `res/values/styles.xml` (thèmes)
|
|
2287
|
-
|
|
2288
|
-
Ces fichiers sont générés à chaque build. Pour les personnaliser, créez-les manuellement et le système les préservera.
|
|
2289
|
-
|
|
2290
|
-
### Ajouter des ressources personnalisées
|
|
2291
|
-
|
|
2292
|
-
```
|
|
2293
|
-
res/
|
|
2294
|
-
├── drawable/ # Images 1x (160 DPI)
|
|
2295
|
-
├── drawable-hdpi/ # Images 1.5x (240 DPI)
|
|
2296
|
-
├── drawable-xhdpi/ # Images 2x (320 DPI)
|
|
2297
|
-
├── drawable-xxhdpi/ # Images 3x (480 DPI)
|
|
2298
|
-
├── drawable-xxxhdpi/ # Images 4x (640 DPI)
|
|
2299
|
-
├── font/ # Polices personnalisées
|
|
2300
|
-
├── menu/ # Menus
|
|
2301
|
-
├── raw/ # Fichiers non compressés
|
|
2302
|
-
└── anim/ # Animations
|
|
2303
|
-
```
|
|
2304
|
-
|
|
2305
|
-
### Générer les icônes automatiquement
|
|
2306
|
-
|
|
2307
|
-
Placez une image source dans `res/drawable/` ou `res/mipmap/` :
|
|
2308
|
-
|
|
2309
|
-
```powershell
|
|
2310
|
-
node "metadidomi-builder\build_tools\generate-icons.js" "MonApp"
|
|
2311
|
-
```
|
|
2312
|
-
|
|
2313
|
-
Le système créera automatiquement les variantes pour tous les écrans :
|
|
2314
|
-
- `mipmap-mdpi` (48×48)
|
|
2315
|
-
- `mipmap-hdpi` (72×72)
|
|
2316
|
-
- `mipmap-xhdpi` (96×96)
|
|
2317
|
-
- `mipmap-xxhdpi` (144×144)
|
|
2318
|
-
- `mipmap-xxxhdpi` (192×192)
|
|
2319
|
-
|
|
2320
|
-
### Utiliser des variables d'environnement
|
|
2321
|
-
|
|
2322
|
-
```powershell
|
|
2323
|
-
$env:PROJECT_PATH = "C:\MonApp"
|
|
2324
|
-
node "metadidomi-builder\build_tools\build_apk.js"
|
|
2325
|
-
```
|
|
2326
|
-
|
|
2327
|
-
---
|
|
2328
|
-
|
|
2329
|
-
## Architecture du système
|
|
2330
|
-
|
|
2331
|
-
🔝 [Retour en haut](#top)
|
|
2332
|
-
|
|
2333
|
-
```
|
|
2334
|
-
metadidomi-builder/
|
|
2335
|
-
├── build_tools/
|
|
2336
|
-
│ ├── build_apk.js # Orchestration principale
|
|
2337
|
-
│ ├── generate-resources.js # Génération des ressources XML
|
|
2338
|
-
│ ├── generate-icons.js # Redimensionnement des icônes
|
|
2339
|
-
│ ├── backup-manager.js # Gestion des sauvegardes
|
|
2340
|
-
│ └── vendor/ # SDK Android et JDK (inclus)
|
|
2341
|
-
└── build_tools_py/ # Outils Python avancés (optionnel)
|
|
2342
|
-
```
|
|
2343
|
-
|
|
2344
|
-
---
|
|
2345
|
-
|
|
2346
|
-
## Étapes du build expliquées
|
|
2347
|
-
|
|
2348
|
-
🔝 [Retour en haut](#top)
|
|
2349
|
-
|
|
2350
|
-
1. **Génération des ressources** : Crée `AndroidManifest.xml`, couleurs, styles
|
|
2351
|
-
2. **Génération des icônes** : Redimensionne l'icône pour toutes les densités
|
|
2352
|
-
3. **Vérification des fichiers** : Contrôle la présence des fichiers minimums
|
|
2353
|
-
4. **Compilation des ressources** : AAPT2 compile XML et images
|
|
2354
|
-
5. **Liaison des ressources** : Génération de `R.java` avec les IDs de ressources
|
|
2355
|
-
6. **Compilation Java** : Javac compile le code Java
|
|
2356
|
-
7. **Création du JAR** : Empaquetage des classes Java
|
|
2357
|
-
8. **Conversion DEX** : D8 convertit en format Android (DEX)
|
|
2358
|
-
9. **Assemblage APK** : Création de la structure APK
|
|
2359
|
-
10. **Alignement** : Zipalign optimise la structure APK
|
|
2360
|
-
11. **Signature** : Signature numérique de l'APK
|
|
2361
|
-
12. **Résultat** : APK prête à être installée
|
|
2362
|
-
|
|
2363
|
-
---
|
|
2364
|
-
|
|
2365
|
-
## Installation de l'APK sur un téléphone
|
|
2366
|
-
|
|
2367
|
-
🔝 [Retour en haut](#top)
|
|
2368
|
-
|
|
2369
|
-
### Via USB
|
|
2370
|
-
|
|
2371
|
-
```powershell
|
|
2372
|
-
adb install -r "MonApp\MonApp.apk"
|
|
2373
|
-
```
|
|
2374
|
-
|
|
2375
|
-
### Via partage de fichier
|
|
2376
|
-
|
|
2377
|
-
1. Transférez le fichier `.apk` sur votre téléphone
|
|
2378
|
-
2. Ouvrez l'explorateur de fichiers
|
|
2379
|
-
3. Appuyez sur le fichier `.apk`
|
|
2380
|
-
4. Confirmez l'installation
|
|
2381
|
-
|
|
2382
|
-
---
|
|
2383
|
-
|
|
2384
|
-
## Conseils et bonnes pratiques
|
|
2385
|
-
|
|
2386
|
-
🔝 [Retour en haut](#top)
|
|
2387
|
-
|
|
2388
|
-
✅ **À faire :**
|
|
2389
|
-
- Tester l'app fréquemment
|
|
2390
|
-
- Utiliser des noms de ressources explicites
|
|
2391
|
-
- Commenter le code Java
|
|
2392
|
-
- Utiliser `Log.d()` pour déboguer
|
|
2393
|
-
- Versionner votre code (Git)
|
|
2394
|
-
|
|
2395
|
-
❌ **À éviter :**
|
|
2396
|
-
- Charger des images trop volumineuses
|
|
2397
|
-
- Utiliser des classes anonymes complexes
|
|
2398
|
-
- Modifier les fichiers générés automatiquement
|
|
2399
|
-
- Laisser des ressources inutilisées
|
|
2400
|
-
|
|
2401
|
-
---
|
|
2402
|
-
|
|
2403
|
-
## Foire aux questions
|
|
2404
|
-
|
|
2405
|
-
🔝 [Retour en haut](#top)
|
|
2406
|
-
|
|
2407
|
-
**Q : Puis-je créer plusieurs activités ?**
|
|
2408
|
-
A : Oui, ajoutez des classes Java dans `src/` et déclarez-les dans `AndroidManifest.xml`.
|
|
2409
|
-
|
|
2410
|
-
**Q : Comment ajouter des dépendances externes ?**
|
|
2411
|
-
A : Actuellement, seules les APIs Android intégrées sont supportées.
|
|
2412
|
-
|
|
2413
|
-
**Q : L'APK fonctionne-t-il sur tous les téléphones ?**
|
|
2414
|
-
A : Oui, tant qu'ils sont Android 5.0 (API 21) ou supérieur.
|
|
2415
|
-
|
|
2416
|
-
**Q : Puis-je mettre à jour l'APK ?**
|
|
2417
|
-
A : Oui, augmentez `appVersion` dans `app-config.json` et régénérez.
|
|
2418
|
-
|
|
2419
|
-
**Q : Les APK sont-elles vraiment signées ?**
|
|
2420
|
-
A : Oui, automatiquement avec une clé de développement auto-générée.
|
|
2421
|
-
|
|
2422
|
-
---
|
|
2423
|
-
|
|
2424
|
-
## Support
|
|
2425
|
-
|
|
2426
|
-
🔝 [Retour en haut](#top)
|
|
2427
|
-
|
|
2428
|
-
Pour des problèmes ou des questions :
|
|
2429
|
-
|
|
2430
|
-
1. Consultez le dossier `CounterApp/` pour un exemple complet
|
|
2431
|
-
2. Vérifiez les logs du build pour les erreurs
|
|
2432
|
-
3. Assurez-vous que tous les fichiers requis existent
|
|
2433
|
-
|
|
2434
|
-
---
|
|
2435
|
-
|
|
2436
|
-
## Version
|
|
2437
|
-
|
|
2438
|
-
- **Metadidomi Crone** : v1.0.0
|
|
2439
|
-
- **Android SDK** : 34 (Android 14)
|
|
2440
|
-
- **Build Tools** : 34.0.0
|
|
2441
|
-
- **Dernière mise à jour** : Novembre 2025
|
|
2442
|
-
|
|
2443
1737
|
---
|
|
2444
1738
|
|
|
2445
1739
|
### 📞 Support
|