metadidomi-builder 1.4.171125 → 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 +779 -5
- package/build_tools/backup-manager.js +3 -0
- package/build_tools/build_apk.js +3 -0
- package/build_tools/builder.js +1 -1
- package/build_tools/certs/cert-65198130.key +1 -0
- package/build_tools/certs/cert-65198130.pfx +0 -0
- package/build_tools/certs/cert-f1fad9b5.key +1 -0
- package/build_tools/certs/cert-f1fad9b5.pfx +0 -0
- package/build_tools/commands-help.js +465 -0
- package/build_tools/create-example-app.js +73 -0
- package/build_tools/decrypt_pfx_password.js +26 -1
- 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/templates/nsis_template.nsi +8 -9
- package/build_tools_py/__pycache__/build_android_apk.cpython-311.pyc +0 -0
- package/build_tools_py/__pycache__/build_apk_complete.cpython-311.pyc +0 -0
- package/build_tools_py/__pycache__/build_apk_offline.cpython-311.pyc +0 -0
- package/build_tools_py/__pycache__/build_apk_real.cpython-311.pyc +0 -0
- package/build_tools_py/__pycache__/build_apk_ui.cpython-311.pyc +0 -0
- package/build_tools_py/build_nsis_installer.py +3 -3
- package/build_tools_py/builder.py +3 -3
- package/build_tools_py/pyMetadidomi/README.md +98 -0
- package/build_tools_py/pyMetadidomi/__pycache__/pyMetadidomi.cpython-311.pyc +0 -0
- package/build_tools_py/pyMetadidomi/pyMetadidomi.py +4 -3
- package/build_tools_py/templates/gradle_build.template +46 -0
- package/build_tools_py/templates/settings_gradle.template +18 -0
- package/create-app.bat +31 -0
- package/create-app.ps1 +27 -0
- package/package.json +19 -5
- package/build_tools/7zsd.sfx +0 -0
package/README.md
CHANGED
|
@@ -19,15 +19,16 @@
|
|
|
19
19
|
6. **[Gestion des Dépendances](#-gestion-des-dépendances)** - Electron et Python
|
|
20
20
|
7. **[Protection du Code](#-système-de-protection-avancé)** - Sécurité
|
|
21
21
|
8. **[Packaging Python](#-packaging-dapplications-python)** - Applications Python
|
|
22
|
-
9. **[
|
|
23
|
-
10. **[
|
|
24
|
-
11. **[
|
|
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
|
|
@@ -61,6 +62,9 @@ Si lors de l'installation le dossier `build_tools/vendor` n'est pas présent, su
|
|
|
61
62
|
. Téléchargez le fichier `vendor.zip` depuis :
|
|
62
63
|
https://github.com/METADIDOMIOFFICIEL/Metadidomi-Builder/releases/download/1.3.171125/vendor.zip
|
|
63
64
|
|
|
65
|
+
En suite télécharger le kit Android:
|
|
66
|
+
https://github.com/METADIDOMIOFFICIEL/Metadidomi-Builder/releases/download/Android.zip/android.zip
|
|
67
|
+
|
|
64
68
|
💡 **Suite** :
|
|
65
69
|
Vous pouvez aussi extraire manuellement le contenu de `vendor.zip` dans le dossier `build_tools/vendor`.
|
|
66
70
|
|
|
@@ -1553,6 +1557,776 @@ Python Embeddable distribution not found
|
|
|
1553
1557
|
```
|
|
1554
1558
|
**✅ SOLUTION:** Vérifiez le dossier `build_tools/vendor/python_embeddable/`
|
|
1555
1559
|
|
|
1560
|
+
---
|
|
1561
|
+
# Metadidomi Crone - Générateur d'APK Android
|
|
1562
|
+
|
|
1563
|
+
Une solution complète et automatisée pour créer des applications Android (APK) sans besoin de connaissances avancées en Android Studio.
|
|
1564
|
+
|
|
1565
|
+
<a id="top"></a>
|
|
1566
|
+
|
|
1567
|
+
## 📋 Table des matières
|
|
1568
|
+
|
|
1569
|
+
- [Installation rapide](#installation-rapide)
|
|
1570
|
+
- [Structure d'un projet](#structure-dun-projet)
|
|
1571
|
+
- [Créer une nouvelle application](#créer-une-nouvelle-application)
|
|
1572
|
+
- [Configuration de l'application](#configuration-de-lapplication)
|
|
1573
|
+
- [Générer l'APK](#générer-lapk)
|
|
1574
|
+
- [Exemples](#exemples)
|
|
1575
|
+
- [Dépannage](#dépannage)
|
|
1576
|
+
- [Options avancées](#options-avancées)
|
|
1577
|
+
|
|
1578
|
+
---
|
|
1579
|
+
|
|
1580
|
+
## Installation rapide
|
|
1581
|
+
|
|
1582
|
+
🔝 [Retour en haut](#top)
|
|
1583
|
+
|
|
1584
|
+
### Prérequis
|
|
1585
|
+
|
|
1586
|
+
- **Node.js** (v14 ou supérieur) - [Télécharger](https://nodejs.org)
|
|
1587
|
+
- **PowerShell** (Windows) ou **Bash** (Mac/Linux)
|
|
1588
|
+
- **Python 3** (pour la génération d'icônes) - [Télécharger](https://www.python.org)
|
|
1589
|
+
- **Pillow** (PIL) pour Python : `pip install Pillow`
|
|
1590
|
+
|
|
1591
|
+
### Vérifier l'installation
|
|
1592
|
+
|
|
1593
|
+
```powershell
|
|
1594
|
+
node --version
|
|
1595
|
+
python --version
|
|
1596
|
+
npm --version
|
|
1597
|
+
```
|
|
1598
|
+
|
|
1599
|
+
### Installation via npm (Recommandé)
|
|
1600
|
+
|
|
1601
|
+
Installez metadidomi-builder comme dépendance locale dans votre projet :
|
|
1602
|
+
|
|
1603
|
+
```powershell
|
|
1604
|
+
|
|
1605
|
+
npm install metadidomi-builder
|
|
1606
|
+
```
|
|
1607
|
+
|
|
1608
|
+
Créez un `package.json` à la racine de votre projet :
|
|
1609
|
+
|
|
1610
|
+
```json
|
|
1611
|
+
{
|
|
1612
|
+
"name": "mon-app-android",
|
|
1613
|
+
"version": "1.0.0",
|
|
1614
|
+
"scripts": {
|
|
1615
|
+
"build": "node node_modules/metadidomi-builder/build_tools/build_apk.js .",
|
|
1616
|
+
"build-debug": "node node_modules/metadidomi-builder/build_tools/build_apk.js . --fail-on-missing",
|
|
1617
|
+
"build-restore": "node node_modules/metadidomi-builder/build_tools/build_apk.js . --restore",
|
|
1618
|
+
"build-icons": "node node_modules/metadidomi-builder/build_tools/generate-icons.js ."
|
|
1619
|
+
},
|
|
1620
|
+
"keywords": [
|
|
1621
|
+
"android",
|
|
1622
|
+
"apk",
|
|
1623
|
+
"builder"
|
|
1624
|
+
],
|
|
1625
|
+
"author": "Metadidomi",
|
|
1626
|
+
"license": "MIT",
|
|
1627
|
+
"dependencies": {
|
|
1628
|
+
"metadidomi-builder": "file:../metadidomi-builder",
|
|
1629
|
+
"sharp": "^0.32.0"
|
|
1630
|
+
}
|
|
1631
|
+
}
|
|
1632
|
+
```
|
|
1633
|
+
|
|
1634
|
+
Puis installez et lancez le build :
|
|
1635
|
+
|
|
1636
|
+
```powershell
|
|
1637
|
+
npm install
|
|
1638
|
+
npm run build
|
|
1639
|
+
```
|
|
1640
|
+
|
|
1641
|
+
---
|
|
1642
|
+
|
|
1643
|
+
## Structure d'un projet
|
|
1644
|
+
|
|
1645
|
+
🔝 [Retour en haut](#top)
|
|
1646
|
+
|
|
1647
|
+
Chaque application Android doit suivre cette structure :
|
|
1648
|
+
|
|
1649
|
+
```
|
|
1650
|
+
MonApp/
|
|
1651
|
+
├── app-config.json # Configuration de l'app
|
|
1652
|
+
├── AndroidManifest.xml # Déclaration Android (généré automatiquement)
|
|
1653
|
+
├── src/
|
|
1654
|
+
│ └── com/example/monapp/
|
|
1655
|
+
│ └── MainActivity.java # Code Java principal
|
|
1656
|
+
├── res/
|
|
1657
|
+
│ ├── layout/
|
|
1658
|
+
│ │ └── activity_main.xml # Interface utilisateur
|
|
1659
|
+
│ ├── values/
|
|
1660
|
+
│ │ ├── strings.xml # Textes et traductions
|
|
1661
|
+
│ │ ├── colors.xml # Couleurs
|
|
1662
|
+
│ │ └── styles.xml # Styles et thèmes
|
|
1663
|
+
│ ├── mipmap-hdpi/
|
|
1664
|
+
│ │ └── ic_launcher.png # Icône de l'app (auto-générée)
|
|
1665
|
+
│ └── drawable/ # Images supplémentaires (optionnel)
|
|
1666
|
+
└── build/ # Généré automatiquement (à ignorer)
|
|
1667
|
+
```
|
|
1668
|
+
|
|
1669
|
+
---
|
|
1670
|
+
|
|
1671
|
+
## Créer une nouvelle application
|
|
1672
|
+
|
|
1673
|
+
### Étape 1 : Créer la structure des dossiers
|
|
1674
|
+
|
|
1675
|
+
🔝 [Retour en haut](#top)
|
|
1676
|
+
|
|
1677
|
+
```powershell
|
|
1678
|
+
mkdir MonApp\src\com\example\monapp
|
|
1679
|
+
mkdir MonApp\res\layout
|
|
1680
|
+
mkdir MonApp\res\values
|
|
1681
|
+
mkdir MonApp\res\mipmap-hdpi
|
|
1682
|
+
```
|
|
1683
|
+
|
|
1684
|
+
### Étape 2 : Créer `app-config.json`
|
|
1685
|
+
|
|
1686
|
+
Ce fichier contient toutes les informations de votre application.
|
|
1687
|
+
|
|
1688
|
+
```json
|
|
1689
|
+
{
|
|
1690
|
+
"appName": "MonApp",
|
|
1691
|
+
"appVersion": "1.0.0",
|
|
1692
|
+
"appDescription": "Ma première application Android",
|
|
1693
|
+
"packageName": "com.example.monapp",
|
|
1694
|
+
"minSdkVersion": 21,
|
|
1695
|
+
"targetSdkVersion": 34,
|
|
1696
|
+
"colors": {
|
|
1697
|
+
"primary": "#2196F3",
|
|
1698
|
+
"primaryDark": "#1976D2",
|
|
1699
|
+
"accent": "#FF5722"
|
|
1700
|
+
}
|
|
1701
|
+
}
|
|
1702
|
+
```
|
|
1703
|
+
|
|
1704
|
+
**Explications des paramètres :**
|
|
1705
|
+
- `appName` : Nom affiché de l'application
|
|
1706
|
+
- `appVersion` : Version sémantique (majeur.mineur.patch)
|
|
1707
|
+
- `packageName` : Identifiant unique (format domaine inversé)
|
|
1708
|
+
- `minSdkVersion` : Version Android minimale (21 = Android 5.0)
|
|
1709
|
+
- `targetSdkVersion` : Version Android ciblée (34 = Android 14)
|
|
1710
|
+
- `colors` : Couleurs principales (format hexadécimal)
|
|
1711
|
+
|
|
1712
|
+
### Étape 3 : Créer l'interface (`activity_main.xml`)
|
|
1713
|
+
|
|
1714
|
+
Fichier : `res/layout/activity_main.xml`
|
|
1715
|
+
|
|
1716
|
+
```xml
|
|
1717
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
1718
|
+
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
1719
|
+
android:orientation="vertical"
|
|
1720
|
+
android:layout_width="match_parent"
|
|
1721
|
+
android:layout_height="match_parent"
|
|
1722
|
+
android:gravity="center"
|
|
1723
|
+
android:padding="16dp">
|
|
1724
|
+
|
|
1725
|
+
<TextView
|
|
1726
|
+
android:id="@+id/titleText"
|
|
1727
|
+
android:layout_width="wrap_content"
|
|
1728
|
+
android:layout_height="wrap_content"
|
|
1729
|
+
android:text="Bienvenue dans MonApp"
|
|
1730
|
+
android:textSize="24sp"
|
|
1731
|
+
android:textStyle="bold" />
|
|
1732
|
+
|
|
1733
|
+
<Button
|
|
1734
|
+
android:id="@+id/myButton"
|
|
1735
|
+
android:layout_width="wrap_content"
|
|
1736
|
+
android:layout_height="wrap_content"
|
|
1737
|
+
android:text="Appuyez-moi"
|
|
1738
|
+
android:layout_marginTop="16dp" />
|
|
1739
|
+
|
|
1740
|
+
</LinearLayout>
|
|
1741
|
+
```
|
|
1742
|
+
|
|
1743
|
+
### Étape 4 : Créer les textes (`strings.xml`)
|
|
1744
|
+
|
|
1745
|
+
Fichier : `res/values/strings.xml`
|
|
1746
|
+
|
|
1747
|
+
```xml
|
|
1748
|
+
<resources>
|
|
1749
|
+
<string name="app_name">MonApp</string>
|
|
1750
|
+
<string name="app_version">1.0.0</string>
|
|
1751
|
+
<string name="app_description">Ma première application</string>
|
|
1752
|
+
<string name="hello_world">Bienvenue</string>
|
|
1753
|
+
<string name="action_settings">Paramètres</string>
|
|
1754
|
+
<string name="back">Retour</string>
|
|
1755
|
+
<string name="forward">Suivant</string>
|
|
1756
|
+
<string name="reload">Recharger</string>
|
|
1757
|
+
</resources>
|
|
1758
|
+
```
|
|
1759
|
+
|
|
1760
|
+
### Étape 5 : Créer le code Java (`MainActivity.java`)
|
|
1761
|
+
|
|
1762
|
+
Fichier : `src/com/example/monapp/MainActivity.java`
|
|
1763
|
+
|
|
1764
|
+
```java
|
|
1765
|
+
package com.example.monapp;
|
|
1766
|
+
|
|
1767
|
+
import android.app.Activity;
|
|
1768
|
+
import android.os.Bundle;
|
|
1769
|
+
import android.widget.Button;
|
|
1770
|
+
import android.widget.Toast;
|
|
1771
|
+
import android.view.View;
|
|
1772
|
+
import android.util.Log;
|
|
1773
|
+
|
|
1774
|
+
public class MainActivity extends Activity {
|
|
1775
|
+
private static final String TAG = "MonApp";
|
|
1776
|
+
|
|
1777
|
+
@Override
|
|
1778
|
+
protected void onCreate(Bundle savedInstanceState) {
|
|
1779
|
+
super.onCreate(savedInstanceState);
|
|
1780
|
+
setContentView(R.layout.activity_main);
|
|
1781
|
+
Log.d(TAG, "MainActivity créée");
|
|
1782
|
+
|
|
1783
|
+
Button myButton = (Button) findViewById(R.id.myButton);
|
|
1784
|
+
myButton.setOnClickListener(new View.OnClickListener() {
|
|
1785
|
+
@Override
|
|
1786
|
+
public void onClick(View v) {
|
|
1787
|
+
Toast.makeText(MainActivity.this, "Bouton cliqué!", Toast.LENGTH_SHORT).show();
|
|
1788
|
+
Log.d(TAG, "Bouton cliqué");
|
|
1789
|
+
}
|
|
1790
|
+
});
|
|
1791
|
+
}
|
|
1792
|
+
}
|
|
1793
|
+
```
|
|
1794
|
+
|
|
1795
|
+
### Étape 6 : Ajouter une icône
|
|
1796
|
+
|
|
1797
|
+
Placez une image PNG (96x96 pixels) dans `res/mipmap/`.
|
|
1798
|
+
|
|
1799
|
+
**Le système générera automatiquement les variantes pour tous les écrans.**
|
|
1800
|
+
|
|
1801
|
+
---
|
|
1802
|
+
|
|
1803
|
+
## Configuration de l'application
|
|
1804
|
+
|
|
1805
|
+
🔝 [Retour en haut](#top)
|
|
1806
|
+
|
|
1807
|
+
### `app-config.json` complet
|
|
1808
|
+
|
|
1809
|
+
```json
|
|
1810
|
+
{
|
|
1811
|
+
"appName": "MonApp",
|
|
1812
|
+
"appVersion": "1.0.0",
|
|
1813
|
+
"appDescription": "Ma première application Android",
|
|
1814
|
+
"packageName": "com.example.monapp",
|
|
1815
|
+
"minSdkVersion": 21,
|
|
1816
|
+
"targetSdkVersion": 34,
|
|
1817
|
+
"colors": {
|
|
1818
|
+
"primary": "#2196F3",
|
|
1819
|
+
"primaryDark": "#1976D2",
|
|
1820
|
+
"accent": "#FF5722"
|
|
1821
|
+
},
|
|
1822
|
+
"minimalRequiredFiles": [
|
|
1823
|
+
"AndroidManifest.xml",
|
|
1824
|
+
"res/values/strings.xml",
|
|
1825
|
+
"res/values/styles.xml",
|
|
1826
|
+
"res/layout/activity_main.xml"
|
|
1827
|
+
]
|
|
1828
|
+
}
|
|
1829
|
+
```
|
|
1830
|
+
|
|
1831
|
+
---
|
|
1832
|
+
|
|
1833
|
+
## Générer l'APK
|
|
1834
|
+
|
|
1835
|
+
🔝 [Retour en haut](#top)
|
|
1836
|
+
|
|
1837
|
+
### Avec npm
|
|
1838
|
+
|
|
1839
|
+
```powershell
|
|
1840
|
+
# Build standard
|
|
1841
|
+
npm run build
|
|
1842
|
+
|
|
1843
|
+
# Build avec vérification stricte
|
|
1844
|
+
npm run build-debug
|
|
1845
|
+
|
|
1846
|
+
# Générer les icônes
|
|
1847
|
+
npm run build-icons
|
|
1848
|
+
```
|
|
1849
|
+
|
|
1850
|
+
### Sans sauvegarde
|
|
1851
|
+
|
|
1852
|
+
```powershell
|
|
1853
|
+
node "metadidomi-builder\build_tools\build_apk.js" "MonApp" --no-backup
|
|
1854
|
+
```
|
|
1855
|
+
|
|
1856
|
+
### Restaurer depuis une sauvegarde
|
|
1857
|
+
|
|
1858
|
+
```powershell
|
|
1859
|
+
node "metadidomi-builder\build_tools\build_apk.js" "MonApp" --restore
|
|
1860
|
+
```
|
|
1861
|
+
|
|
1862
|
+
### Résultat
|
|
1863
|
+
|
|
1864
|
+
Après une génération réussie, vous trouverez :
|
|
1865
|
+
|
|
1866
|
+
```
|
|
1867
|
+
MonApp/
|
|
1868
|
+
└── MonApp.apk ← Votre application, prête à installer!
|
|
1869
|
+
```
|
|
1870
|
+
|
|
1871
|
+
Fichier de sortie : `MonApp/MonApp.apk`
|
|
1872
|
+
|
|
1873
|
+
**Taille typique :** 2-5 MB
|
|
1874
|
+
|
|
1875
|
+
---
|
|
1876
|
+
|
|
1877
|
+
## Exemples
|
|
1878
|
+
|
|
1879
|
+
🔝 [Retour en haut](#top)
|
|
1880
|
+
|
|
1881
|
+
### Exemple 1 : Application Compteur
|
|
1882
|
+
|
|
1883
|
+
Voir le dossier `CounterApp/` pour un exemple complet d'une application de compteur avec :
|
|
1884
|
+
- Boutons d'incrémentation/décrémentation
|
|
1885
|
+
- Affichage d'un compteur
|
|
1886
|
+
- Interface colorée
|
|
1887
|
+
|
|
1888
|
+
### Exemple 2 : Application Simple
|
|
1889
|
+
|
|
1890
|
+
Consultez `MyApp/` pour une application de base.
|
|
1891
|
+
|
|
1892
|
+
### Exemple 3 : Application Avancée
|
|
1893
|
+
|
|
1894
|
+
`MyApp_Advanced/` contient des fonctionnalités plus complexes.
|
|
1895
|
+
|
|
1896
|
+
---
|
|
1897
|
+
|
|
1898
|
+
## Dépannage
|
|
1899
|
+
|
|
1900
|
+
🔝 [Retour en haut](#top)
|
|
1901
|
+
|
|
1902
|
+
### Erreur : "Aucun fichier Java trouvé"
|
|
1903
|
+
|
|
1904
|
+
**Cause** : Le dossier `src/` est vide ou mal structuré.
|
|
1905
|
+
|
|
1906
|
+
**Solution** :
|
|
1907
|
+
1. Vérifiez que `MainActivity.java` existe dans `src/com/example/monapp/`
|
|
1908
|
+
2. Vérifiez le nom du package (doit correspondre à `packageName` dans `app-config.json`)
|
|
1909
|
+
|
|
1910
|
+
```
|
|
1911
|
+
src/
|
|
1912
|
+
└── com/example/monapp/
|
|
1913
|
+
└── MainActivity.java ✓ Correct
|
|
1914
|
+
```
|
|
1915
|
+
|
|
1916
|
+
### Erreur : "resource string/... not found"
|
|
1917
|
+
|
|
1918
|
+
**Cause** : Une chaîne de caractères référencée n'existe pas dans `strings.xml`.
|
|
1919
|
+
|
|
1920
|
+
**Solution** :
|
|
1921
|
+
1. Ouvrez `res/values/strings.xml`
|
|
1922
|
+
2. Ajoutez la chaîne manquante avec son ID correct :
|
|
1923
|
+
```xml
|
|
1924
|
+
<string name="fragment1">Fragments</string>
|
|
1925
|
+
<string name="action_click">Cliquez ici</string>
|
|
1926
|
+
```
|
|
1927
|
+
3. **Assurez-vous que le nom correspond exactement** à celui utilisé dans votre layout XML
|
|
1928
|
+
|
|
1929
|
+
**Exemple d'erreur rencontrée (CounterApp) :**
|
|
1930
|
+
```
|
|
1931
|
+
error: resource string/fragment1 not found
|
|
1932
|
+
```
|
|
1933
|
+
**Correction appliquée :**
|
|
1934
|
+
```xml
|
|
1935
|
+
<!-- res/values/strings.xml -->
|
|
1936
|
+
<resources>
|
|
1937
|
+
<string name="app_name">CounterApp</string>
|
|
1938
|
+
<string name="fragment1">Compteur</string>
|
|
1939
|
+
<string name="increment">Incrémenter</string>
|
|
1940
|
+
<string name="decrement">Décrémenter</string>
|
|
1941
|
+
<string name="reset">Réinitialiser</string>
|
|
1942
|
+
</resources>
|
|
1943
|
+
```
|
|
1944
|
+
|
|
1945
|
+
### Erreur : "cannot find symbol: variable R"
|
|
1946
|
+
|
|
1947
|
+
**Cause** : Les ressources n'ont pas été compilées correctement.
|
|
1948
|
+
|
|
1949
|
+
**Solution** :
|
|
1950
|
+
1. Supprimez le dossier `build/`
|
|
1951
|
+
2. Vérifiez que `res/values/strings.xml` est valide (XML bien formé, pas d'accents mal encodés)
|
|
1952
|
+
3. Relancez la génération complète
|
|
1953
|
+
|
|
1954
|
+
### Erreur : "D8 compilation failed" avec "NullPointerException"
|
|
1955
|
+
|
|
1956
|
+
**Cause** : Classes anonymes mal générées lors de la compilation DEX.
|
|
1957
|
+
|
|
1958
|
+
**Symptômes** :
|
|
1959
|
+
```
|
|
1960
|
+
java.lang.NullPointerException: Cannot invoke "String.length()"
|
|
1961
|
+
Exception in thread "main" java.lang.NullPointerException
|
|
1962
|
+
```
|
|
1963
|
+
|
|
1964
|
+
**Solution - Utilisez `implements View.OnClickListener` au lieu de classes anonymes** :
|
|
1965
|
+
|
|
1966
|
+
❌ **INCORRECT (cause l'erreur D8)** :
|
|
1967
|
+
```java
|
|
1968
|
+
button.setOnClickListener(new View.OnClickListener() {
|
|
1969
|
+
@Override
|
|
1970
|
+
public void onClick(View v) {
|
|
1971
|
+
counter++;
|
|
1972
|
+
updateDisplay();
|
|
1973
|
+
}
|
|
1974
|
+
});
|
|
1975
|
+
```
|
|
1976
|
+
|
|
1977
|
+
✅ **CORRECT** :
|
|
1978
|
+
```java
|
|
1979
|
+
public class MainActivity extends Activity implements View.OnClickListener {
|
|
1980
|
+
private Button incrementBtn, decrementBtn;
|
|
1981
|
+
|
|
1982
|
+
@Override
|
|
1983
|
+
public void onClick(View v) {
|
|
1984
|
+
int id = v.getId();
|
|
1985
|
+
if (id == R.id.incrementBtn) counter++;
|
|
1986
|
+
else if (id == R.id.decrementBtn) counter--;
|
|
1987
|
+
}
|
|
1988
|
+
}
|
|
1989
|
+
```
|
|
1990
|
+
|
|
1991
|
+
**Pourquoi** : D8 (compilateur DEX) a des problèmes avec les classes anonymes imbriquées. Les interfaces nommées sont plus fiables.
|
|
1992
|
+
|
|
1993
|
+
### Erreur : "cannot find symbol: variable helloText" ou autre ID de ressource
|
|
1994
|
+
|
|
1995
|
+
**Cause** : Le code Java référence un ID qui n'existe pas dans le layout XML.
|
|
1996
|
+
|
|
1997
|
+
**Symptôme** :
|
|
1998
|
+
```
|
|
1999
|
+
error: cannot find symbol
|
|
2000
|
+
symbol: variable helloText
|
|
2001
|
+
location: class MainActivity
|
|
2002
|
+
```
|
|
2003
|
+
|
|
2004
|
+
**Solution** :
|
|
2005
|
+
1. Vérifiez que l'ID existe dans `res/layout/activity_main.xml` :
|
|
2006
|
+
```xml
|
|
2007
|
+
<TextView
|
|
2008
|
+
android:id="@+id/helloText"
|
|
2009
|
+
...
|
|
2010
|
+
/>
|
|
2011
|
+
```
|
|
2012
|
+
2. Vérifiez que vous utilisez le bon nom en Java :
|
|
2013
|
+
```java
|
|
2014
|
+
TextView helloText = (TextView) findViewById(R.id.helloText);
|
|
2015
|
+
```
|
|
2016
|
+
3. Assurez-vous que l'ID correspond EXACTEMENT (majuscules/minuscules)
|
|
2017
|
+
|
|
2018
|
+
**Exemple de correction (CounterApp)** :
|
|
2019
|
+
```xml
|
|
2020
|
+
<!-- res/layout/activity_main.xml -->
|
|
2021
|
+
<LinearLayout ...>
|
|
2022
|
+
<TextView
|
|
2023
|
+
android:id="@+id/counterDisplay"
|
|
2024
|
+
android:layout_width="match_parent"
|
|
2025
|
+
android:layout_height="wrap_content"
|
|
2026
|
+
android:text="0"
|
|
2027
|
+
android:textSize="72sp" />
|
|
2028
|
+
|
|
2029
|
+
<Button
|
|
2030
|
+
android:id="@+id/incrementBtn"
|
|
2031
|
+
android:text="Incrémenter" />
|
|
2032
|
+
</LinearLayout>
|
|
2033
|
+
```
|
|
2034
|
+
|
|
2035
|
+
### Erreur : "AndroidManifest.xml not found"
|
|
2036
|
+
|
|
2037
|
+
**Cause** : Fichier de configuration critique manquant ou mal généré.
|
|
2038
|
+
|
|
2039
|
+
**Solution** :
|
|
2040
|
+
1. Vérifiez que `app-config.json` existe à la racine du projet
|
|
2041
|
+
2. Assurez-vous que le JSON est valide (syntaxe correcte, pas de virgules manquantes)
|
|
2042
|
+
3. Relancez le build avec l'option `--fail-on-missing` pour diagnostiquer :
|
|
2043
|
+
```powershell
|
|
2044
|
+
node "metadidomi-builder\build_tools\build_apk.js" "MonApp" --fail-on-missing
|
|
2045
|
+
```
|
|
2046
|
+
|
|
2047
|
+
### Erreur : "Fichiers minimums manquants"
|
|
2048
|
+
|
|
2049
|
+
**Cause** : Des fichiers essentiels n'existent pas.
|
|
2050
|
+
|
|
2051
|
+
**Files requises minimales** :
|
|
2052
|
+
- `app-config.json` → Configuration de l'app
|
|
2053
|
+
- `AndroidManifest.xml` → Descripteur (généré automatiquement)
|
|
2054
|
+
- `res/values/strings.xml` → Textes
|
|
2055
|
+
- `res/values/styles.xml` → Styles (généré automatiquement)
|
|
2056
|
+
- `res/layout/activity_main.xml` → Interface utilisateur
|
|
2057
|
+
- `src/com/example/monapp/MainActivity.java` → Code principal
|
|
2058
|
+
|
|
2059
|
+
**Solution** :
|
|
2060
|
+
```powershell
|
|
2061
|
+
# Mode diagnostique - affiche les fichiers manquants sans échouer
|
|
2062
|
+
node "metadidomi-builder\build_tools\build_apk.js" "MonApp"
|
|
2063
|
+
|
|
2064
|
+
# Mode strict - échoue si des fichiers manquent
|
|
2065
|
+
node "metadidomi-builder\build_tools\build_apk.js" "MonApp" --fail-on-missing
|
|
2066
|
+
```
|
|
2067
|
+
|
|
2068
|
+
### L'APK n'est pas généré
|
|
2069
|
+
|
|
2070
|
+
**Cause** : Erreur lors de la signature ou de l'assemblage final.
|
|
2071
|
+
|
|
2072
|
+
**Solution** :
|
|
2073
|
+
1. Supprimez le fichier `.keystore` dans le dossier du projet :
|
|
2074
|
+
```powershell
|
|
2075
|
+
rm "MonApp\.keystore"
|
|
2076
|
+
```
|
|
2077
|
+
2. Relancez la génération (un nouveau keystore sera créé) :
|
|
2078
|
+
```powershell
|
|
2079
|
+
node "metadidomi-builder\build_tools\build_apk.js" "MonApp"
|
|
2080
|
+
```
|
|
2081
|
+
|
|
2082
|
+
### Erreur : "Invalid app-config.json"
|
|
2083
|
+
|
|
2084
|
+
**Cause** : Fichier de configuration mal formé.
|
|
2085
|
+
|
|
2086
|
+
**Vérifiez** :
|
|
2087
|
+
```json
|
|
2088
|
+
{
|
|
2089
|
+
"appName": "MonApp", // ✓ String valide
|
|
2090
|
+
"appVersion": "1.0.0", // ✓ Format sémantique (majeur.mineur.patch)
|
|
2091
|
+
"packageName": "com.example.monapp", // ✓ Format domaine inversé
|
|
2092
|
+
"minSdkVersion": 21, // ✓ Nombre entier >= 21
|
|
2093
|
+
"targetSdkVersion": 34, // ✓ Nombre entier
|
|
2094
|
+
"colors": {
|
|
2095
|
+
"primary": "#2196F3", // ✓ Couleur hexadécimale valide
|
|
2096
|
+
"primaryDark": "#1976D2",
|
|
2097
|
+
"accent": "#FF5722"
|
|
2098
|
+
}
|
|
2099
|
+
}
|
|
2100
|
+
```
|
|
2101
|
+
|
|
2102
|
+
### Erreur : "Layout XML invalide"
|
|
2103
|
+
|
|
2104
|
+
**Cause** : Syntaxe XML incorrecte dans `activity_main.xml`.
|
|
2105
|
+
|
|
2106
|
+
**Vérifiez** :
|
|
2107
|
+
- Les balises ouvrantes et fermantes correspondent (`<LinearLayout>` ... `</LinearLayout>`)
|
|
2108
|
+
- Les attributs android: sont valides
|
|
2109
|
+
- Les IDs sont uniques et bien formatés (`android:id="@+id/monId"`)
|
|
2110
|
+
- Les textes spéciaux sont échappés (`&`, `<`, `>`)
|
|
2111
|
+
|
|
2112
|
+
**Exemple correct** :
|
|
2113
|
+
```xml
|
|
2114
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
2115
|
+
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
2116
|
+
android:orientation="vertical"
|
|
2117
|
+
android:layout_width="match_parent"
|
|
2118
|
+
android:layout_height="match_parent">
|
|
2119
|
+
|
|
2120
|
+
<Button
|
|
2121
|
+
android:id="@+id/myButton"
|
|
2122
|
+
android:layout_width="wrap_content"
|
|
2123
|
+
android:layout_height="wrap_content"
|
|
2124
|
+
android:text="Cliquez-moi" />
|
|
2125
|
+
|
|
2126
|
+
</LinearLayout>
|
|
2127
|
+
```
|
|
2128
|
+
|
|
2129
|
+
### Erreur : "Icônes manquantes"
|
|
2130
|
+
|
|
2131
|
+
**Cause** : L'icône n'a pas été générée ou redimensionnée correctement.
|
|
2132
|
+
|
|
2133
|
+
**Solution** :
|
|
2134
|
+
1. Placez une image PNG (96x96 pixels minimum) dans `res/drawable/` ou `res/mipmap/`
|
|
2135
|
+
2. Exécutez le générateur d'icônes :
|
|
2136
|
+
```powershell
|
|
2137
|
+
node "metadidomi-builder\build_tools\generate-icons.js" "MonApp"
|
|
2138
|
+
```
|
|
2139
|
+
3. Vérifiez que tous les dossiers mipmap ont été créés :
|
|
2140
|
+
```
|
|
2141
|
+
res/mipmap-mdpi/ic_launcher.png (48x48)
|
|
2142
|
+
res/mipmap-hdpi/ic_launcher.png (72x72)
|
|
2143
|
+
res/mipmap-xhdpi/ic_launcher.png (96x96)
|
|
2144
|
+
res/mipmap-xxhdpi/ic_launcher.png (144x144)
|
|
2145
|
+
res/mipmap-xxxhdpi/ic_launcher.png (192x192)
|
|
2146
|
+
```
|
|
2147
|
+
|
|
2148
|
+
### Erreur : "Package name already exists"
|
|
2149
|
+
|
|
2150
|
+
**Cause** : Un package Android avec le même nom est déjà installé.
|
|
2151
|
+
|
|
2152
|
+
**Solution** :
|
|
2153
|
+
1. Changez le `packageName` dans `app-config.json` :
|
|
2154
|
+
```json
|
|
2155
|
+
"packageName": "com.example.monapp.v2"
|
|
2156
|
+
```
|
|
2157
|
+
2. Régénérez l'APK
|
|
2158
|
+
3. Ou : désinstallez l'ancienne app avant d'installer la nouvelle
|
|
2159
|
+
|
|
2160
|
+
---
|
|
2161
|
+
|
|
2162
|
+
## Options avancées
|
|
2163
|
+
|
|
2164
|
+
🔝 [Retour en haut](#top)
|
|
2165
|
+
|
|
2166
|
+
### Personnaliser les ressources générées automatiquement
|
|
2167
|
+
|
|
2168
|
+
Par défaut, le système génère :
|
|
2169
|
+
- `AndroidManifest.xml` (descripteur de l'app)
|
|
2170
|
+
- `res/values/colors.xml` (couleurs)
|
|
2171
|
+
- `res/values/styles.xml` (thèmes)
|
|
2172
|
+
|
|
2173
|
+
Ces fichiers sont générés à chaque build. Pour les personnaliser, créez-les manuellement et le système les préservera.
|
|
2174
|
+
|
|
2175
|
+
### Ajouter des ressources personnalisées
|
|
2176
|
+
|
|
2177
|
+
```
|
|
2178
|
+
res/
|
|
2179
|
+
├── drawable/ # Images 1x (160 DPI)
|
|
2180
|
+
├── drawable-hdpi/ # Images 1.5x (240 DPI)
|
|
2181
|
+
├── drawable-xhdpi/ # Images 2x (320 DPI)
|
|
2182
|
+
├── drawable-xxhdpi/ # Images 3x (480 DPI)
|
|
2183
|
+
├── drawable-xxxhdpi/ # Images 4x (640 DPI)
|
|
2184
|
+
├── font/ # Polices personnalisées
|
|
2185
|
+
├── menu/ # Menus
|
|
2186
|
+
├── raw/ # Fichiers non compressés
|
|
2187
|
+
└── anim/ # Animations
|
|
2188
|
+
```
|
|
2189
|
+
|
|
2190
|
+
### Générer les icônes automatiquement
|
|
2191
|
+
|
|
2192
|
+
Placez une image source dans `res/drawable/` ou `res/mipmap/` :
|
|
2193
|
+
|
|
2194
|
+
```powershell
|
|
2195
|
+
node "metadidomi-builder\build_tools\generate-icons.js" "MonApp"
|
|
2196
|
+
```
|
|
2197
|
+
|
|
2198
|
+
Le système créera automatiquement les variantes pour tous les écrans :
|
|
2199
|
+
- `mipmap-mdpi` (48×48)
|
|
2200
|
+
- `mipmap-hdpi` (72×72)
|
|
2201
|
+
- `mipmap-xhdpi` (96×96)
|
|
2202
|
+
- `mipmap-xxhdpi` (144×144)
|
|
2203
|
+
- `mipmap-xxxhdpi` (192×192)
|
|
2204
|
+
|
|
2205
|
+
### Utiliser des variables d'environnement
|
|
2206
|
+
|
|
2207
|
+
```powershell
|
|
2208
|
+
$env:PROJECT_PATH = "C:\MonApp"
|
|
2209
|
+
node "metadidomi-builder\build_tools\build_apk.js"
|
|
2210
|
+
```
|
|
2211
|
+
|
|
2212
|
+
---
|
|
2213
|
+
|
|
2214
|
+
## Architecture du système
|
|
2215
|
+
|
|
2216
|
+
🔝 [Retour en haut](#top)
|
|
2217
|
+
|
|
2218
|
+
```
|
|
2219
|
+
metadidomi-builder/
|
|
2220
|
+
├── build_tools/
|
|
2221
|
+
│ ├── build_apk.js # Orchestration principale
|
|
2222
|
+
│ ├── generate-resources.js # Génération des ressources XML
|
|
2223
|
+
│ ├── generate-icons.js # Redimensionnement des icônes
|
|
2224
|
+
│ ├── backup-manager.js # Gestion des sauvegardes
|
|
2225
|
+
│ └── vendor/ # SDK Android et JDK (inclus)
|
|
2226
|
+
└── build_tools_py/ # Outils Python avancés (optionnel)
|
|
2227
|
+
```
|
|
2228
|
+
|
|
2229
|
+
---
|
|
2230
|
+
|
|
2231
|
+
## Étapes du build expliquées
|
|
2232
|
+
|
|
2233
|
+
🔝 [Retour en haut](#top)
|
|
2234
|
+
|
|
2235
|
+
1. **Génération des ressources** : Crée `AndroidManifest.xml`, couleurs, styles
|
|
2236
|
+
2. **Génération des icônes** : Redimensionne l'icône pour toutes les densités
|
|
2237
|
+
3. **Vérification des fichiers** : Contrôle la présence des fichiers minimums
|
|
2238
|
+
4. **Compilation des ressources** : AAPT2 compile XML et images
|
|
2239
|
+
5. **Liaison des ressources** : Génération de `R.java` avec les IDs de ressources
|
|
2240
|
+
6. **Compilation Java** : Javac compile le code Java
|
|
2241
|
+
7. **Création du JAR** : Empaquetage des classes Java
|
|
2242
|
+
8. **Conversion DEX** : D8 convertit en format Android (DEX)
|
|
2243
|
+
9. **Assemblage APK** : Création de la structure APK
|
|
2244
|
+
10. **Alignement** : Zipalign optimise la structure APK
|
|
2245
|
+
11. **Signature** : Signature numérique de l'APK
|
|
2246
|
+
12. **Résultat** : APK prête à être installée
|
|
2247
|
+
|
|
2248
|
+
---
|
|
2249
|
+
|
|
2250
|
+
## Installation de l'APK sur un téléphone
|
|
2251
|
+
|
|
2252
|
+
🔝 [Retour en haut](#top)
|
|
2253
|
+
|
|
2254
|
+
### Via USB
|
|
2255
|
+
|
|
2256
|
+
```powershell
|
|
2257
|
+
adb install -r "MonApp\MonApp.apk"
|
|
2258
|
+
```
|
|
2259
|
+
|
|
2260
|
+
### Via partage de fichier
|
|
2261
|
+
|
|
2262
|
+
1. Transférez le fichier `.apk` sur votre téléphone
|
|
2263
|
+
2. Ouvrez l'explorateur de fichiers
|
|
2264
|
+
3. Appuyez sur le fichier `.apk`
|
|
2265
|
+
4. Confirmez l'installation
|
|
2266
|
+
|
|
2267
|
+
---
|
|
2268
|
+
|
|
2269
|
+
## Conseils et bonnes pratiques
|
|
2270
|
+
|
|
2271
|
+
🔝 [Retour en haut](#top)
|
|
2272
|
+
|
|
2273
|
+
✅ **À faire :**
|
|
2274
|
+
- Tester l'app fréquemment
|
|
2275
|
+
- Utiliser des noms de ressources explicites
|
|
2276
|
+
- Commenter le code Java
|
|
2277
|
+
- Utiliser `Log.d()` pour déboguer
|
|
2278
|
+
- Versionner votre code (Git)
|
|
2279
|
+
|
|
2280
|
+
❌ **À éviter :**
|
|
2281
|
+
- Charger des images trop volumineuses
|
|
2282
|
+
- Utiliser des classes anonymes complexes
|
|
2283
|
+
- Modifier les fichiers générés automatiquement
|
|
2284
|
+
- Laisser des ressources inutilisées
|
|
2285
|
+
|
|
2286
|
+
---
|
|
2287
|
+
|
|
2288
|
+
## Foire aux questions
|
|
2289
|
+
|
|
2290
|
+
🔝 [Retour en haut](#top)
|
|
2291
|
+
|
|
2292
|
+
**Q : Puis-je créer plusieurs activités ?**
|
|
2293
|
+
A : Oui, ajoutez des classes Java dans `src/` et déclarez-les dans `AndroidManifest.xml`.
|
|
2294
|
+
|
|
2295
|
+
**Q : Comment ajouter des dépendances externes ?**
|
|
2296
|
+
A : Actuellement, seules les APIs Android intégrées sont supportées.
|
|
2297
|
+
|
|
2298
|
+
**Q : L'APK fonctionne-t-il sur tous les téléphones ?**
|
|
2299
|
+
A : Oui, tant qu'ils sont Android 5.0 (API 21) ou supérieur.
|
|
2300
|
+
|
|
2301
|
+
**Q : Puis-je mettre à jour l'APK ?**
|
|
2302
|
+
A : Oui, augmentez `appVersion` dans `app-config.json` et régénérez.
|
|
2303
|
+
|
|
2304
|
+
**Q : Les APK sont-elles vraiment signées ?**
|
|
2305
|
+
A : Oui, automatiquement avec une clé de développement auto-générée.
|
|
2306
|
+
|
|
2307
|
+
---
|
|
2308
|
+
|
|
2309
|
+
## Support
|
|
2310
|
+
|
|
2311
|
+
🔝 [Retour en haut](#top)
|
|
2312
|
+
|
|
2313
|
+
Pour des problèmes ou des questions :
|
|
2314
|
+
|
|
2315
|
+
1. Consultez le dossier `CounterApp/` pour un exemple complet
|
|
2316
|
+
2. Vérifiez les logs du build pour les erreurs
|
|
2317
|
+
3. Assurez-vous que tous les fichiers requis existent
|
|
2318
|
+
|
|
2319
|
+
---
|
|
2320
|
+
|
|
2321
|
+
## Version
|
|
2322
|
+
|
|
2323
|
+
- **Metadidomi Crone** : v1.0.0
|
|
2324
|
+
- **Android SDK** : 34 (Android 14)
|
|
2325
|
+
- **Build Tools** : 34.0.0
|
|
2326
|
+
- **Dernière mise à jour** : Novembre 2025
|
|
2327
|
+
|
|
2328
|
+
---
|
|
2329
|
+
|
|
1556
2330
|
### 📞 Support
|
|
1557
2331
|
|
|
1558
2332
|
Pour les questions sur le packaging Python :
|
|
@@ -1562,7 +2336,7 @@ Pour les questions sur le packaging Python :
|
|
|
1562
2336
|
|
|
1563
2337
|
---
|
|
1564
2338
|
|
|
1565
|
-
##
|
|
2339
|
+
## 🗺️ Roadmap - Vision Multi-Plateforme
|
|
1566
2340
|
|
|
1567
2341
|
### Phase 1 : Windows ✅ (Actuelle)
|
|
1568
2342
|
- ✅ Build portable (.exe)
|