-
Notifications
You must be signed in to change notification settings - Fork 0
Français
Une application Android native développée indépendamment en Java pour le transfert de fichiers sur réseau local (LAN). Son objectif est d'assurer la compatibilité avec la détection d'appareils et l'API de téléversement du protocole LocalSend Protocol v2.2 sur les anciens appareils (d'Android 2.3 jusqu'à Android 6.0 / API 9 à API 23). Le projet ne fait référence, n'importe ni ne compile aucun répertoire de code source de LocalSend.
Version actuelle : 1.3 (versionCode 5).
Les fichiers APK précompilés sont disponibles en téléchargement direct et installation depuis la page GitHub Releases de ce dépôt. La compilation manuelle n'est pas nécessaire. Les versions incluent des signatures v1 prêtes pour une installation directe sur les anciens appareils (Android 2.3 à 6.0).
Si vous souhaitez compiler le projet manuellement, l'environnement suivant est requis :
- JDK 17
- Gradle Wrapper 8.9
- Android Gradle Plugin 8.7.3
- Android SDK Platform 23 (Android 6.0 Marshmallow)
- Android SDK Build Tools 23.0.3 (ou supérieur)
Commande de compilation et de vérification :
./gradlew testDebugUnitTest lintDebug assembleDebug
Chemin de sortie de l'APK compilé :
app/build/outputs/apk/debug/app-debug.apk
Le projet configure minSdkVersion à 9, compileSdkVersion à 23 et targetSdkVersion à 23 (Android 6.0 Marshmallow). Cela garantit un environnement de compilation léger et unifié, parfaitement aligné avec les autorisations de stockage et la gestion des services de l'époque classique d'Android. Ce projet n'est pas destiné à être publié sur Google Play.
- Détection des appareils, annonces et gestion des réponses via multicast UDP.
- Points de terminaison d'enregistrement HTTP/HTTPS compatibles avec LocalSend v2 (v2.2).
- Prise en charge du codage de transfert par blocs (
Chunked Transfer Encoding). - Sélection, envoi et réception de fichiers uniques ou multiples.
- Demande de confirmation (Accepter / Refuser) avant la réception.
- Validation des jetons au niveau du fichier, de l'ID de session, de l'IP d'origine et de l'empreinte du certificat.
- Téléversement et enregistrement sur disque en flux continu (streaming) sans charger les fichiers complets en mémoire.
- Suivi du progrès global, notifications d'erreur et annulation possible par les deux parties.
- Renommage automatique avec les suffixes
(1),(2)pour éviter les écrasements. - Compatibilité avec les noms de fichiers contenant des caractères chinois, des espaces et des symboles spéciaux.
- Service en premier plan pour la réception ; la recréation de l'Activity n'interrompt pas les transferts en cours.
- Interface utilisateur localisée en chinois simplifié.
app/src/main/java/com/blithe/legacysend/
├── LegacySendApp.java État au niveau de l'application, tâches en arrière-plan et événements UI
├── ReceiveService.java Service de réception en premier plan
├── discovery/ Détection via multicast UDP
├── model/ Modèles de données pour appareils et fichiers
├── protocol/ Formats du protocole JSON de LocalSend (v2.2)
├── security/ Identité auto-signée, BKS KeyStore, mTLS, pinning de certificat, SimpleX509Generator
├── server/ Points de terminaison HTTP/HTTPS (enregistrement, préparation, téléversement, annulation)
├── storage/ Gestion du stockage avec SAF, système de fichiers hérité et logique de renommage
├── transfer/ Client d'envoi HTTPS/HTTP, contrôle du progrès et annulation
├── ui/ Interface utilisateur native avec vues Android
└── util/ Utilitaires pour le transfert en flux et le contrôle de vitesse
Le code source est écrit à 100 % en Java, sans aucune dépendance envers Kotlin, Jetpack Compose, Flutter, Dart ou React Native. Utilise Groovy DSL pour Gradle.
- Couverture de minSdk 9 (Android 2.3) jusqu'à Android 6.0 (API 23) : Spécialement adapté pour les environnements matériels et logiciels anciens.
-
Génération de Certificats sur API 9–17 : Implémentation personnalisée de
SimpleX509Generatorpour résoudre l'absence d'AndroidKeyStoreet surmonter l'analyse stricte ASN.1/DER dans OpenSSL / Conscrypt sur Android 2.3–4.2. -
Format BKS KeyStore : Utilise
BouncyCastle(BKS) sur API 9–17 pour stocker les clés privées et les certificats, évitant les plantages de sérilisationPKCS12sur Android 2.3. -
Corrections de Structure ASN.1 / DER : Enveloppe
AttributeTypeAndValuedans uneSEQUENCEau sein de la hiérarchie des certificats et modifie explicitement le type de chaîne decommonName(2.5.4.3) enPrintableString(0x13), résolvant l'exception OpenSSLASN.1 encoding routines:OPENSSL_internal:WRONG_TAG. -
Atténuation du Problème Y2K38 : Les certificats auto-signés sur API 9–17 utilisent des signatures
SHA1withRSAavec une validité limitée à 10 ans pour prévenir le dépassement d'horodatage des entiers 32 bits. -
Accès aux Fichiers Hérités et SAF : API 19–23 utilise
ACTION_OPEN_DOCUMENTavec SAF, tandis qu'API 9–18 utilise un gestionnaire de fichiers interne pour lire directement le stockage externe. -
Compatibilité de Réception TLS sur Android 4.4.2 (API 19–20) : Le serveur TLS 1.2 sur Kindle Android 4.4.2 prend uniquement en charge les chiffrements CBC, incompatibles avec le client TLS Rust de LocalSend 1.17.0. Sur API 19–20, la réception utilise le mode
protocol: "http"officiel du protocole. API 9–18 et API 21–23 maintiennent le chiffrement HTTPS pour la réception et tous les transferts sortants. -
Emplacements de Sauvegarde : L'emplacement d'enregistrement est unifié dans le dossier public
Download/LegacySendsur toutes les versions prises en charge (API 9–23). -
MulticastLock et Multithreading : L'écoute du multicast est activée après l'acquisition de
MulticastLock; toutes les opérations réseau et d'E/S de fichiers s'exécutent sur des threads en arrière-plan. - Traitement en Flux : Les transferts utilisent un tampon de 32 KiB pour le transfert par blocs (chunked), validant la cohérence entre les octets réellement reçus et les tailles des métadonnées.
- Système de Notifications : Le service en premier plan utilise les notifications système traditionnelles sur l'ensemble de la plage d'API 9 à API 23.
Aucune dépendance tierce à l'exécution. Utilise uniquement le SDK Android, la bibliothèque standard Java et org.json (inclus dans le système d'exploitation).
Dépendances de Test :
- JUnit 4.13.2 : Exécution des tests sur la JVM hôte uniquement (non empaqueté dans l'APK).
-
org.json:json:20240303: Implémentation factice pour les tests unitaires sur la JVM hôte (non empaqueté dans l'APK).
- 12 tests unitaires sur l'hôte : sérialisation du protocole, métadonnées multi-fichiers, caractères spéciaux/chinois, accepter/refuser/annuler/délai d'attente, renommage, calcul du hachage SHA-256 et copie en flux.
- Compilation Gradle, inspection Lint et empaquetage de l'APK debug.
- Vérification du Manifeste confirmant
minSdkVersion=9,compileSdkVersion=23ettargetSdkVersion=23. - Validation des signatures APK v1/v2 (signature v1 prête pour l'installation sur Android 2.3, 4.4.2 jusqu'à 6.0).
-
Test sur Appareil Réel Android 2.3.6 (API 9) : Certificat auto-signé généré et chargé avec succès (aucune exception
WRONG_TAG), service HTTPS démarré sur le port 53317, client officiel LocalSend détecté, téléversement chunked de fichiers uniques/multiples reçu et écrit sur disque avec hachages SHA-256 correspondants. - Test sur Appareil Réel Kindle Android 4.4.2 (API 19) : Lancement de l'application, sélection interne de fichiers, transfert réussi vers Android 11 et réception de fichiers réussie depuis LocalSend 1.17.0 officiel avec vérification du hachage SHA-256.
L'application DocumentsUI du micrologiciel Kindle conserve les enregistrements des téléchargements supprimés ou déplacés, générant des exceptions FileNotFoundException lors des tentatives d'ouverture de leurs URI content://. Sur API 9–20, un explorateur de fichiers interne est utilisé pour lister directement les fichiers réels et lisibles du stockage externe ; API 21–23 continue d'utiliser le SAF du système.
- Changements fréquents de réseau Wi-Fi sur du matériel réel, restrictions agressives d'optimisation de la batterie par les constructeurs et transferts de fichiers volumineux sur Android 5.0–6.0.
- API de Téléchargement Inverse LocalSend (téléchargements via navigateur) ; l'API de téléversement principale d'Android vers LocalSend ne dépend pas de cela.
- Fonctionnalités secondaires telles que les codes PIN, l'historique, le partage du presse-papiers, les thèmes, les mises à jour automatiques ou les comptes utilisateurs.
- Balayage de secours du sous-réseau IP ; s'appuie actuellement sur la détection multicast par défaut et la confirmation bidirectionnelle
/register.
- Android Emulator 36 sur architecture Apple Silicon ne prend pas en charge les images système ARMv7 QEMU2 pour API 9 ou API 19.
En raison de l'absence de suites de chiffrement communes entre le TLS système d'Android 4.4 et LocalSend 1.17.0, la réception sur API 19–20 fonctionne en mode HTTP comme le permet la spécification du protocole. Dans cette direction, les fichiers et métadonnées ne sont pas chiffrés via TLS, bien que les vérifications d'IP d'origine, les ID de session aléatoires et les jetons uniques par fichier restent actifs. À utiliser uniquement sur des réseaux locaux de confiance. Tous les transferts sortants depuis LegacySend et la réception sur API 9–18 / API 21–23 maintiennent le chiffrement HTTPS et le pinning de certificat.
Pour plus de détails sur les spécifications et les points de terminaison de l'API, consultez [docs/protocol.md](https://www.google.com/search?q=docs/protocol.md).
Les Issues et Pull Requests sont les bienvenues. L'objectif principal de LegacySend est de fournir une solution légère, stable et interopérable avec LocalSend (v2.2) sur les anciens appareils (d'Android 2.3 à Android 6.0 / API 9 à API 23). La préservation de la compatibilité avec les anciens systèmes est prioritaire sur l'ajout de nouvelles fonctionnalités.
- Maintenir une implémentation indépendante sans copier ni importer de code source de LocalSend.
- Utiliser strictement Java et les Vues natives d'Android (éviter Kotlin, Jetpack Compose, Flutter ou Google Play Services).
- Maintenir l'objectif de compatibilité strictement dans la plage de
minSdkVersion 9àtargetSdkVersion 23. - Exécuter toutes les opérations réseau et d'E/S de fichiers sur des threads en arrière-plan en utilisant le traitement en flux.
- Vérifier le comportement sur API 9, API 19 et Android 6.0 avant de soumettre des modifications majeures.