2012-07-04 23 views
6

Sto provando a portare libCurl ad Android con supporto SSL, il primo passo sarebbe quello di portare il ricciolo senza supporto ssl immagino quindi ho iniziato a farlo. ma ho incontrato un problema.porting libcurl su android con supporto ssl

come ho letto sul sito Web dev e nel file Android.mk, la parte difficile è la configurazione del make prima. così quello che ho fatto è:

  1. Scarica il codice sorgente di Android (! e compilarlo dal momento che alcune delle librerie intermedi sono necessari)

  2. Scarica cURL

  3. unpack arricciatura: {android_src}/esterno/arricciatura

  4. rendere lo script di configurazione per arricciare creando un file sh nella cartella esterna/curl con questo contenuto.

`

export A=/home/user/Development/AOSP/2.3.3  
export CC=$A/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-gcc 
export NDK=/home/user/Development/Tools/sdk/android/ndk 
export NDKLIBS=$NDK/platforms/android-4/arch-arm/usr/include 
export SYSROOT=$A/ndk/build/platforms/android-4/arch-arm 
export CPPFLAGS="-I $A/system/core/include" 
export LDFLAGS="-L$A/out/target/product/generic/obj/lib/ -L$A/out/target/product/generic/system/lib/-L$SYSROOT/usr/lib -Wl,--gc-sections -nostdlib -lc -lm -ldl -llog -lgcc -Wl,--no-undefined,-z,nocopyreloc -Wl,-dynamic-linker,/system/bin/linker -L$NDK/out/target/product/generic/obj/lib/" 
export CFLAGS="-fno-exceptions -Wno-multichar -mthumb -mthumb-interwork -nostdlib -lc -ldl -lm -march=armv5te -mtune=xscale -msoft-float -mandroid -fPIC -mthumb-interwork -mthumb -mlong-calls -ffunction-sections -fstack-protector -fno-short-enums -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ -DANDROID -DOS_ANDROID -D__NEW__ -D__SGI_STL_INTERNAL_PAIR_H -I$SYSROOT/usr/include -I $A/system/core/include -I $NDKLIBS" 

./configure --host=arm-eabi --with-ssl=$A/external/openssl 

` e la sintesi di uscita è questa:

di configurazione: Configurato per costruire ricciolo/libcurl:

curl version:  7.26.0 
    Host setup:  arm-unknown-eabi 
    Install prefix: /usr/local 
    Compiler:   /home/tanco/Development/AOSP/2.3.3/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-gcc 
    SSL support:  no  (--with-{ssl,gnutls,nss,polarssl,cyassl,axtls}) 
    SSH support:  no  (--with-libssh2) 
    zlib support:  enabled 
    krb4 support:  no  (--with-krb4*) 
    GSSAPI support: no  (--with-gssapi) 
    SPNEGO support: no  (--with-spnego) 
    TLS-SRP support: no  (--enable-tls-srp) 
    resolver:   default (--enable-ares/--enable-threaded-resolver) 
    ipv6 support:  no  (--enable-ipv6) 
    IDN support:  no  (--with-libidn) 
    Build libcurl: Shared=no, Static=yes 
    Built-in manual: enabled 
    --libcurl option: enabled (--disable-libcurl-option) 
    Verbose errors: enabled (--disable-verbose) 
    SSPI support:  no  (--enable-sspi) 
    ca cert bundle: /etc/ssl/certs/ca-certificates.crt 
    ca cert path:  no 
    LDAP support:  no  (--enable-ldap/--with-ldap-lib/--with-lber-lib) 
    LDAPS support: no  (--enable-ldaps) 
    RTSP support:  enabled 
    RTMP support:  no  (--with-librtmp) 
    Protocols:  DICT FILE FTP GOPHER HTTP IMAP POP3 RTSP SMTP TELNET TFTP 

    SONAME bump:  yes - WARNING: this library will be built with the SONAME 
        number bumped due to (a detected) ABI breakage. 
        See lib/README.curl_off_t for details on this. 

prima cosa strana che viene è perché la SSL non è inclusa nella configurazione poiché il linker mostra la libreria intermedia viene chiamato il flag di supporto s e ssl, ma dopo quando uso lo stesso file curl_config.h nel progetto jni che ho creato per la build (poiché ha un file Android.mk autonomo può essere compilato semplicemente decomprimendo nella cartella jni di un progetto Android, la copia del file di configurazione creato nel sorgente AOSP e chiamando NDK-build)

così posso compilare e ottengo:

$ ndk-build 
Compile thumb : curl <= url.c 
In file included from /Projects/temp/testNDK/jni/lib/url.c:32:0: 
/Tools/sdk/android/ndk/platforms/android-14/arch-arm/usr/include/unistd.h: In function 'getpagesize': 
/Tools/sdk/android/ndk/platforms/android-14/arch-arm/usr/include/unistd.h:171:3: warning: nested extern declaration of '__page_size' [-Wnested-externs] 
/Tools/sdk/android/ndk/platforms/android-14/arch-arm/usr/include/unistd.h: In function '__getpageshift': 
/Tools/sdk/android/ndk/platforms/android-14/arch-arm/usr/include/unistd.h:175:3: warning: nested extern declaration of '__page_shift' [-Wnested-externs] 
/Projects/temp/testNDK/jni/lib/url.c: At top level: 
/Projects/temp/testNDK/jni/lib/url.c:57:2: error: #error "We can't compile without socket() support!" 
make: *** [/Projects/temp/testNDK/obj/local/armeabi/objs/curl/lib/url.o] Error 1 

risposta

13

Ecco la soluzione, aggiornato per NDK8c

step zero: scarica e correggi l'NDK Android Non so come, ma e ndk ha un difetto molto interessante, che (a mio parere) non ti permette di compilare molte cose, quindi per essere in grado di compilare OpenSSL devi fare una piccola correzione, estrarre il ndk8c ogni volta che mantieni i tuoi strumenti, e quindi modificare il file: android-NDK-R8C/build/GMSL/__ GMSL linea 512: cambio di line

int_encode = $(__gmsl_tr1)$(wordlist 1,$1,$(__gmsl_input_int)) 

con la linea

int_encode = $(__gmsl_tr1)$(wordlist 1,$(words $1),$(__gmsl_input_int)) 

e siete pronti per partire!

passo uno: Scarica OpenSSL e compilare per Android: o compilare una versione porting trovato here o Scarica il funzionario 1.0.Versione 0c di OpenSSL e poi compilarlo per Android utilizzando il manuale fornito nel github ho collegato per la versione compatibile di Android

Quindi il passo successivo è quello di ottenere il libssl.so e libcrypto.so e mettere loro l'nella cartella NDK per un facile accesso, in modo da copiare da

openssl-folder/libs/armeabi/ 

a

android-ndk-r8c/platforms/android-8/arch-arm/usr/lib 

questo modo durante la compilazione yo u può includere le librerie con un interruttore linker semplice -lssl -lcrypto

Fase due: Ottenere l'ultima fonte di Curl per here

Aprire il file in Documenti/installare e seguire i passi necessari per rendere la toolchain standalone e inserire la cartella desiderata, e poi la parte difficile, avevo bisogno di avere il codice sorgente di android per la configurazione per continuare, anche se ho un openssl compilato standalone puoi includere anche i file header da lì, in ogni caso questo è il più complicato versione in modo da scegliere quello che fai, non ho scelto di eludere loro in modo da poter andare a Google AOSP site e andare attraverso i passaggi per bui ld e inizializza l'ambiente.

quindi sarebbe qualcosa di simile:

1.download,

  1. andare alla radice del codice sorgente ed eseguire:

    ~: costruire/envsetup.sh; pranzo 1; rendere;

Così alla fine abbiamo bisogno di compilare il ricciolo con supporto SSL, quindi,

Fase tre

estratto curl per la cartella desiderata (ho una precisa volontà di disattivare tutto tranne http/s per mantenere la libreria il più piccola possibile, a circa ~ 300k, se vuoi più protocolli nella tua lib, togli il --disable-protocol per il protocollo desiderato) esegui quanto segue:

make clean 

export PATH=/opt/arm-linux-androideabi-4.4.3/bin:$PATH 

export LDFLAGS="\ 
-lssl \ 
-lcrypto \ 
-L/home/user/Development/Tools/sdk/android/ndk/platforms/android-8/arch-arm/usr/lib" 

export CFLAGS="\ 
-I/home/user/Development/AOSP/2.3.7/system/core/include \ 
-I/home/user/Development/Tools/sdk/android/ndk/platforms/android-8/arch-arm/usr/include" 

./configure --host=arm-linux-androideabi \ 
--with-ssl=/home/user/Development/Projects/portingLibs/openssl-android-master \ 
--disable-ftp \ 
--disable-gopher \ 
--disable-file \ 
--disable-imap \ 
--disable-ldap \ 
--disable-ldaps \ 
--disable-pop3 \ 
--disable-proxy \ 
--disable-rtsp \ 
--disable-smtp \ 
--disable-telnet \ 
--disable-tftp \ 
--without-gnutls \ 
--without-libidn \ 
--without-librtmp \ 
--disable-dict 


make 



Note that in the block above, if you don't want to use the AOSP source, you could switch 

-I/home/user/Development/AOSP/2.3.7/system/core/include \ 

with the include folder for your ssl distribution. 

Così alla fine si ha: statica:

curl-7.28.1/lib/.libs/libcurl.a 

e condiviso:

curl-7.28.1/lib/.libs/libcurl.so.5.3 

Quindi il gioco è fatto .. prendere il file e compilare via :)

+0

Grazie mille per il tuo lavoro. Ho preso il tuo consiglio ma invece del sdk completo, ho usato solo la toochain standalone come consigliato nella guida all'installazione di cURL. Quindi ho copiato le intestazioni openssl e i file .so nelle cartelle nella toolchain e ho impostato rispettivamente LDFLAGS e CPPFLAGS. Un semplice --with-ssl ha fatto il trucco, una volta impostato correttamente. Quindi per riferimento futuro: non è necessario utilizzare l'SDK Android completo, anche la toolchain è un modo possibile. – domenukk

+0

questo è il caso ora, due anni fa non era compilabile al di fuori di AOSP – Tancho

+0

Ho dovuto modificare i comandi qui per http://pastebin.com/qzxzc592 non so se è necessario per tutti se – ruler501

0

Passi per compilando libcurl.so con supporto ssl per Android jni può essere trovato qui: http://ieroot.com/2015/03/29/1728.html

Ho faticato per una settimana per averlo capito.

Chiedi se hai qualche domanda.Risponderò il prima possibile.

+0

Link non funziona – Tancho

+0

Ho provato proprio ora e lo trovo funziona. Forse, devi riprovare. Contattami se ancora non riesci a connetterti. –

1

Mi piace il modo di utilizzare Docker per la creazione di tali librerie statiche. C'è uno script completo qui: basta eseguirlo e afferrare il risultato. Esempio: https://gist.github.com/VictorLaskin/1c45245d4cdeab033956

Tale script sarà:

  • compilazione di impostazione strumenti/utils scaricare SDK/NDK
  • creare cross-compilazione toolchain scaricare il codice personalizzato sorgente di librerie (zlib, OpenSSL, Curl)
  • impostazioni dell'ambiente di installazione per la compilazione incrociata
  • configurare e creare librerie
  • raccogliere l'output in una cartella e creare il modo di ottenere librerie compilate

Questa versione specifica utilizza l'ultima versione di NDK 10e e clang toolchain.

C'è post con maggiori dettagli qui: http://vitiy.info/dockerfile-example-to-compile-libcurl-for-android-inside-docker-container/

Spero che questo vi aiuterà qualcuno a non sprecare tempo prezioso.