-
Notifications
You must be signed in to change notification settings - Fork 0
Italiano
Un'applicazione Android nativa sviluppata in Java in modo indipendente per il trasferimento di file all'interno della rete locale (LAN). Il suo obiettivo è offrire compatibilità con il rilevamento dei dispositivi e le API di caricamento del protocollo LocalSend Protocol v2.2 su dispositivi datati (da Android 2.3 fino ad Android 6.0 / da API 9 ad API 23). Il progetto non fa riferimento, non importa e non compila directory di codice sorgente di LocalSend.
Versione attuale: 1.3 (versionCode 5).
I file APK precompilati sono disponibili per il download diretto e l'installazione dalla pagina GitHub Releases di questo repository. Non è necessario compilare manualmente. I rilasci includono firme v1 pronte per l'installazione diretta su dispositivi datati (da Android 2.3 a 6.0).
Se desideri compilare il progetto manualmente, è richiesto il seguente ambiente di sviluppo:
- 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 (o superiore)
Comando di compilazione e verifica:
./gradlew testDebugUnitTest lintDebug assembleDebug
Percorso di output dell'APK compilato:
app/build/outputs/apk/debug/app-debug.apk
Il progetto configura minSdkVersion 9, compileSdkVersion 23 e targetSdkVersion 23 (Android 6.0 Marshmallow). Questo garantisce un ambiente di compilazione leggero e unificato, perfettamente allineato con i permessi di archiviazione e le dinamiche dei servizi dell'era classica di Android. Questo progetto non è destinato alla pubblicazione su Google Play.
- Rilevamento dei dispositivi, annunci e gestione delle risposte tramite multicast UDP.
- Endpoint di registrazione HTTP/HTTPS compatibili con LocalSend v2 (v2.2).
- Supporto per la codifica del trasferimento a blocchi (
Chunked Transfer Encoding). - Selezione, invio e ricezione di file singoli e multipli.
- Richiesta di conferma (Accetta / Rifiuta) prima della ricezione.
- Validazione dei token a livello di file, ID di sessione, IP di origine e impronta digitale del certificato.
- Caricamento e salvataggio su disco in streaming senza caricare interi file in memoria.
- Monitoraggio del progresso generale, notifiche di errore e supporto all'annullamento da entrambe le parti.
- Rinomina automatica con suffissi
(1),(2)per evitare sovrascritture. - Compatibilità con nomi di file contenenti caratteri cinesi, spazi e simboli speciali.
- Servizio in foreground per la ricezione; la ricreazione dell'Activity non interrompe i trasferimenti in corso.
- Interfaccia utente localizzata in cinese semplificato.
app/src/main/java/com/blithe/legacysend/
├── LegacySendApp.java Stato a livello di applicazione, attività in background ed eventi UI
├── ReceiveService.java Servizio di ricezione in foreground
├── discovery/ Rilevamento tramite multicast UDP
├── model/ Modelli di dati per dispositivi e file
├── protocol/ Formati del protocollo JSON di LocalSend (v2.2)
├── security/ Identità autofirmata, BKS KeyStore, mTLS, certificate pinning, SimpleX509Generator
├── server/ Endpoint HTTP/HTTPS (registrazione, preparazione, caricamento, annullamento)
├── storage/ Gestione dell'archiviazione con SAF, file system legacy e logica di rinomina
├── transfer/ Client di invio HTTPS/HTTP, controllo del progresso e annullamento
├── ui/ Interfaccia utente nativa con Views di Android
└── util/ Utility per il trasferimento in streaming e controllo della velocità
Il codice sorgente è scritto al 100% in Java, senza alcuna dipendenza da Kotlin, Jetpack Compose, Flutter, Dart o React Native. Utilizza Groovy DSL per Gradle.
- Copertura da minSdk 9 (Android 2.3) fino ad Android 6.0 (API 23): Specificamente adattato per ambienti con hardware e firmware datati.
-
Generazione di Certificati su API 9–17: Implementazione personalizzata di
SimpleX509Generatorper risolvere l'assenza diAndroidKeyStoree superare le rigide analisi ASN.1/DER in OpenSSL / Conscrypt su Android 2.3–4.2. -
Formato BKS KeyStore: Utilizza
BouncyCastle(BKS) su API 9–17 per salvare chiavi private e certificati, evitando crash di serializzazionePKCS12su Android 2.3. -
Correzioni di Struttura ASN.1 / DER: Racchiude
AttributeTypeAndValuein unaSEQUENCEall'interno della gerarchia dei certificati e modifica esplicitamente il tipo di stringa dicommonName(2.5.4.3) inPrintableString(0x13), risolvendo l'eccezione OpenSSLASN.1 encoding routines:OPENSSL_internal:WRONG_TAG. -
Mitigazione del Problema Y2K38: I certificati autofirmati su API 9–17 utilizzano firme
SHA1withRSAcon una validità limitata a 10 anni per prevenire l'overflow del timestamp negli interi a 32 bit. -
Accesso ai File Legacy e SAF: API 19–23 utilizza
ACTION_OPEN_DOCUMENTcon SAF, mentre API 9–18 ricorre a un file manager interno per accedere direttamente alla memoria esterna. -
Compatibilità di Ricezione TLS su Android 4.4.2 (API 19–20): Il server TLS 1.2 su Kindle Android 4.4.2 supporta solo cifrari CBC, incompatibili con il client TLS Rust di LocalSend 1.17.0. Su API 19–20, la ricezione utilizza la modalità
protocol: "http"prevista dal protocollo ufficiale. API 9–18 ed API 21–23 mantengono la cifratura HTTPS per la ricezione e per tutti i trasferimenti in uscita. -
Percorsi di Salvataggio: La posizione di salvataggio è unificata nella cartella pubblica
Download/LegacySendsu tutte le versioni supportate (API 9–23). -
MulticastLock e Multithreading: L'ascolto del multicast viene abilitato dopo l'acquisizione di
MulticastLock; tutte le operazioni di rete e di I/O dei file vengono eseguite su thread in background. - Elaborazione in Streaming: I trasferimenti utilizzano un buffer da 32 KiB per lo streaming a blocchi (chunked), convalidando la coerenza tra i byte effettivamente ricevuti e le dimensioni dei metadati.
- Sistema di Notifiche: Il servizio in foreground utilizza le notifiche di sistema tradizionali per tutto il intervallo da API 9 ad API 23.
Zero dipendenze di terze parti a runtime. Utilizza esclusivamente l'Android SDK, la libreria standard di Java e org.json (inclusa nel sistema operativo).
Dipendenze di Test:
- JUnit 4.13.2: Esecuzione dei test solo su JVM host (non pacchettizzato nell'APK).
-
org.json:json:20240303: Implementazione mock per i test unitari su JVM host (non pacchettizzato nell'APK).
- 12 test unitari su host: serializzazione del protocollo, metadati multi-file, caratteri speciali/cinesi, accetta/rifiuta/annulla/timeout, rinomina, calcolo dell'hash SHA-256 e copia in streaming.
- Compilazione con Gradle, ispezione Lint e pacchettizzazione dell'APK debug.
- Verifica del Manifest per confermare
minSdkVersion=9,compileSdkVersion=23etargetSdkVersion=23. - Validazione della firma APK v1/v2 (firma v1 pronta per l'installazione su Android 2.3, 4.4.2, fino a 6.0).
-
Test Su Dispositivo Reale Android 2.3.6 (API 9): Certificato autofirmato generato e caricato con successo (nessuna eccezione
WRONG_TAG), servizio HTTPS avviato sulla porta 53317, client ufficiale LocalSend rilevato, caricamento chunked di file singoli/multipli ricevuto e scritto su disco con hash SHA-256 corrispondenti. - Test Su Dispositivo Reale Kindle Android 4.4.2 (API 19): Avvio dell'app, selezione interna dei file, trasferimento riuscito verso Android 11 e ricezione di file completata con successo da LocalSend 1.17.0 ufficiale con verifica dell'hash SHA-256.
L'app DocumentsUI del firmware Kindle conserva i dati dei download eliminati o spostati, generando eccezioni FileNotFoundException quando si tenta di aprire i relativi URI content://. Su API 9–20 viene utilizzato un file manager interno che elenca direttamente i file reali e leggibili della memoria esterna; API 21–23 continua a utilizzare SAF di sistema.
- Cambio frequente di rete Wi-Fi su hardware reale, restrizioni aggressive sul risparmio batteria dei produttori e trasferimenti di file di grandi dimensioni su Android 5.0–6.0.
- API di Download Inverso LocalSend (download via browser); l'API di Upload principale da Android a LocalSend non dipende da essa.
- Funzionalità secondarie come PIN, cronologia, condivisione negli appunti, temi, aggiornamenti automatici o account utente.
- Scansione di riserva della sottorete IP; attualmente si affida al rilevamento multicast predefinito e alla conferma bidirezionale
/register.
- Android Emulator 36 su architettura Apple Silicon non supporta le immagini di sistema ARMv7 QEMU2 per API 9 o API 19.
A causa della mancanza di cifrari in comune tra il TLS di sistema di Android 4.4 e LocalSend 1.17.0, la ricezione su API 19–20 opera in modalità HTTP, come consentito dalle specifiche del protocollo. In questa modalità, i file e i metadati non viaggiano cifrati via TLS, sebbene rimangano attivi i controlli sull'IP di origine, ID di sessione casuali e token univoci per file. Si consiglia l'uso esclusivo in reti locali fidate. Tutti i trasferimenti in uscita da LegacySend e la ricezione su API 9–18 / API 21–23 mantengono la cifratura HTTPS e il certificate pinning.
Per ulteriori dettagli sulle specifiche e sugli endpoint API, consulta [docs/protocol.md](https://www.google.com/search?q=docs/protocol.md).
Issue e Pull Request sono le benvenute. L'obiettivo principale di LegacySend è fornire una soluzione leggera, stabile e interoperabile con LocalSend (v2.2) su dispositivi datati (da Android 2.3 ad Android 6.0 / da API 9 ad API 23). La salvaguardia della compatibilità con i sistemi più vecchi ha la priorità rispetto all'aggiunta di nuove funzionalità.
- Mantenere un'implementazione indipendente senza copiare o importare codice sorgente da LocalSend.
- Utilizzare esclusivamente Java e Views native di Android (evitare Kotlin, Jetpack Compose, Flutter o Google Play Services).
- Mantenere l'obiettivo di compatibilità rigorosamente all'interno dell'intervallo da
minSdkVersion 9atargetSdkVersion 23. - Eseguire tutte le operazioni di rete e di I/O dei file su thread in background utilizzando l'elaborazione in streaming.
- Verificare il comportamento su API 9, API 19 e Android 6.0 prima di inviare modifiche rilevanti.