Infra - Linux
Criando aplicativos para o iPhone no Linux (sem Xcode e MacOS X)
Consultando diversos especialistas da plataforma iPhone, não obtive sucesso na busca de alternativa ao desenvolvimento para os aparelhos da APPLE no Linux. Mas no fundo o Cortex-A8 é um processador ARM, então deixo neste documento como usar o compilador llvm-gcc-4.2 para a arquitetura Darwin-Arm, assim permitindo criar binários para os dispositivos APPLE a partir de fontes C/C++ e Obj-C.
por Alessandro de Oliveira FariaIntrodução
Veremos neste documento como desenvolver
aplicativos para os dispositivos da APPLE (iPhone, iPod Touch e iPad) sem a
necessidade de obter o conjunto super proprietário (Mac OS X, Xcode e MacBook).
Muitas pessoas, inclusive instrutores de programação para o iPhone, diziam ser
impossível criar aplicações em ambientes não Mac. Mais impossível ainda com
ferramentas de código aberto.
Embora seja um desenvolvedor Android, questionamentos surgiram, pois já instalaram
o Android no iPhone,o processador do iPad A4 é baseado no Cortex-A8, que no
fundo pertence a arquitetura ARM. No site UBM
TechInsights podemos obter o RAIO-X na CPU do processador A4 e perceber
"a semelhança total" com o núcleo do Samsung S5PC110A01. Então é
fácil concluir que o processador do iPad A4 = ARM Cortx A8 (45 nm) = ARM.
Foi assim que comecei a minha jornada para a compilação cruzada de aplicativos
escrito em C/C++ e Obj-C para os dispositivos da APPLE.
Aproveito este artigo para divulgar um appliance Linux baseado no openSUSE, que criei para os interessados no desenvolvimento de software para o iPhone, utilizando ferramentas open-source e não tem tempo para ficar resolvendo e compilando dependência, como também compatibilidade do mesmo com o seu sistema atual. Este projeto chama-se LiMobile, esta iniciativa nasceu das minhas pesquisas, como também da necessidade de carregar um live CD ou um pendrive com um sistema composto de todo SDK open souce para dispositivos portáteis APPLE.
A mágica para chegar ao resultado final
está na pesquisa e no agrupamentos de muitas ferramentas de código aberto, mas
em especial vale a pena mencionar o llvm-gcc e o iphonedevonlinux.
O LLVM, Low Level Virtual Machine, é uma infraestrutura de compilação (LATTNER,
C, 2006), proporciona componentes modulares e reaproveitáveis para construção
de compiladores, assim, reduzindo o tempo e custo para construir um compilador
particular. O llvm-gcc é uma versão do gcc que compila programas C/ObjC em
objetos nativos, bitcode LLVM (binário), ou em linguagem assembly LLVM (texto)
(LLVM TEAM, 2009).
O pacote iphonedevonlinux não passa de um script que faz o download e processa
todos os códigos fontes possíveis e imagináveis para compilar o compilador
arm-darwin-gcc. A principal vantagem do LiMobile, além de possuir os pacotes
com a versão é que dispensa horas de download durante a compilação, sendo
assim, é efetuado o download apenas dos pacotes proprietários para não violar
os licenciamentos da APPLE.
Abaixo um screenshot do boot da imagem do projet LiMobile.
Instalação, compilação e utilização
Requisitos e instalação:
Software proprietário:
Começaremos pela parte proprietária. O arquivo do firmware e SDK 3 do iphone
(iPhone1,2_3.0_7A341_Restore.ipsw e iphone_sdk_3.0__leopard__9m2736__final.dmg)
são imprescindíveis e serão obtidos por conta própria no site da APPLE ou em
FTPs públicos espalhados pela internet (megaupload, rapidshare entre outros). É
uma pena, pois se o licenciamento permitisse, a imagem do LiMobile traria
consigo todos os arquivos instalados pronto para compilação.
Hardware:
O aparelho precisa estar desbloqueado com o jailbreak, cydia, openssh, afc2add
e MobileTerminal (opcional). Não vou entrar em detalhes com relação ao
desbloqueio do mesmo para não fugir do escopo principal deste documento.
Dependências:
A lista abaixo de dependências básicas foi o que motivou a criar o LiMobile, não quero passar por esta saga novamente:
- automake
- bison
- cpio
- flex
- g++
- g++-4.3
- g++-4.3-multilib
- gawk
- gcc-4.3
- git-core
- gobjc-4.3
- gzip
- libbz2-dev
- libcurl4-openssl-dev
- libssl-dev
- make
- mount
- subversion
- sudo
- tar
- unzip
- uuid
- uuid-dev
- wget
- xar
- zlib1g-dev
Primeiramente, baixe o script toolchain.sh do projeto iphonedevonlinux:
$ svn checkout http://iphonedevonlinux.googlecode.com/svn/branches/3.0/
Na sua pasta home crie as pastas Projects/iphone/toolchain/files/firmware e
copie o arquivo do firmware e SDK nas pastas conforme o exemplo abaixo.
$ mkdir -p ~/ Projects/iphone/toolchain/files/firmware
$ cp iphone_sdk_3.0__leopard__9m2736__final.dmg ~/ Projects/iphone/toolchain/files
$ cp iPhone1,2_3.0_7A341_Restore ~/ Projects/iphone/toolchain/files/firmware
Para iniciar os downloads, compilação e toda magia-negra automatizada, execute
o script toolchain.sh:
$ ./toolchain.sh all
O script efetuará o download e compilará alguns pacote como:
- dmg2img -
Converte imagens/arquivos .dmg para imagens hfsplus. Mais informações no
site oficial.
- llvm-gcc - Compilador utilizado para objetos nativos, bitcode LLVM de programas escrito em C/OBJC. Informações no site oficial.
- Ferramentas open source para o Darwin (www.opensource.apple.com), o lado opensource do Mac. Abaixo a lista dos pacotes.
http://www.opensource.apple.com/tarballs/cctools/cctools-667.8.0.tar.gz
http://www.opensource.apple.com/tarballs/libsecurity_authorization/libsecurity_authorization-32564.tar.gz
http://www.opensource.apple.com/tarballs/libsecurity_cdsa_client/libsecurity_cdsa_client-32432.tar.gz
http://www.opensource.apple.com/tarballs/libsecurity_cdsa_utilities/libsecurity_cdsa_utilities-33506.tar.gz
http://www.opensource.apple.com/tarballs/libsecurity_cms/libsecurity_cms-32521.tar.gz
http://www.opensource.apple.com/tarballs/libsecurity_codesigning/libsecurity_codesigning-33803.tar.gz
http://www.opensource.apple.com/tarballs/libsecurity_cssm/libsecurity_cssm-32993.tar.gz
http://www.opensource.apple.com/tarballs/libsecurity_keychain/libsecurity_keychain-34101.tar.gz
http://www.opensource.apple.com/tarballs/libsecurity_mds/libsecurity_mds-32820.tar.gz
http://www.opensource.apple.com/tarballs/libsecurity_ssl/libsecurity_ssl-32463.tar.gz
http://www.opensource.apple.com/tarballs/libsecurity_utilities/libsecurity_utilities-32820.tar.gz
http://www.opensource.apple.com/tarballs/libsecurityd/libsecurityd-33470.tar.gz
http://www.opensource.apple.com/tarballs/DiskArbitration/DiskArbitration-183.tar.gz
http://www.opensource.apple.com/tarballs/IOKitUser/IOKitUser-388.2.1.tar.gz
http://www.opensource.apple.com/tarballs/IOGraphics/IOGraphics-193.2.tar.gz
http://www.opensource.apple.com/tarballs/IOHIDFamily/IOHIDFamily-258.3.tar.gz
http://www.opensource.apple.com/tarballs/IOStorageFamily/IOStorageFamily-88.tar.gz
http://www.opensource.apple.com/tarballs/IOCDStorageFamily/IOCDStorageFamily-39.tar.gz
http://www.opensource.apple.com/tarballs/IODVDStorageFamily/IODVDStorageFamily-26.tar.gz
http://www.opensource.apple.com/tarballs/WebCore/WebCore-351.9.tar.gz
http://www.opensource.apple.com/tarballs/CF/CF-476.14.tar.gz
http://www.opensource.apple.com/tarballs/configd/configd-210.tar.gz
http://www.opensource.apple.com/tarballs/xnu/xnu-1228.7.58.tar.gz
http://www.opensource.apple.com/tarballs/xnu/xnu-1228.3.13.tar.gz
http://www.opensource.apple.com/tarballs/Libc/Libc-498.tar.gz
http://www.opensource.apple.com/tarballs/launchd/launchd-258.1.tar.gz
http://www.opensource.apple.com/tarballs/DirectoryService/DirectoryService-514.23.tar.gz
http://www.opensource.apple.com/tarballs/JavaScriptCore/JavaScriptCore-466.1.tar.gz
Durante a execução, o código fonte do dmg2img será compilado para
posterior utilização no pacote SDK do iPhone.
Trying to mount the iPhone SDK dmg...
dmg2img v1.6.1 is derived from dmg2iso by vu1tur (to@vu1tur.eu.org)
/home/mobile/Projects/iphone/toolchain/files/iphone_sdk_3.0__leopard__9m2736__final.dmg-->
/home/mobile/Projects/iphone/toolchain/tmp/iphone_sdk_3.0__leopard__9m2736__final.img
reading property list, 522739 bytes from address 2237401625 …
partition 0: begin=195, size=430, decoded=284
partition 1: begin=914, size=430, decoded=284
partition 2: begin=1632, size=430, decoded=284
partition 3: begin=2367, size=430, decoded=284
partition 4: begin=3088, size=430, decoded=284
partition 5: begin=3799, size=516090, decoded=347564
partition 6: begin=520170, size=430, decoded=284
decompressing:
opening partition 0 ... [2]
100.00%ok
opening partition 1 ... [2]
100.00%ok
opening partition 2 ... [2]
100.00%ok
opening partition 3 ... [2]
100.00%ok
opening partition 4 ... [2]
100.00%ok
opening partition 5 ...[8684]
100.00%ok
Archive successfully decompressed as
/home/mobile/Projects/iphone/toolchain/tmp/iphone_sdk_3.0__leopard__9m2736__final.img
You should be able to mount the image [as root] by:
modprobe hfsplus
mount -t hfsplus -o loop
/home/mobile/Projects/iphone/toolchain/tmp/iphone_sdk_3.0__leopard__9m2736__final.img
/mnt
In order to extract iphone_sdk_3.0__leopard__9m2736__final.dmg, I am going to
mount it.
This needs to be done as root.
SDK is version 3.0.1
Extracting iPhoneSDKHeadersAndLibs.pkg...
Extracting MacOSX10.5.pkg...
Unmounting iPhone SDK img...
Headers extracted.
Logo em seguida, o arquivo de firmware do iPhone é descompactado para extração
dos arquivos necessários com a chave criptográfica obtida em tempo real na
internet.
Checksum of firmware file is valid.
Archive:/home/mobile/Projects/iphone/toolchain/files/firmware/iPhone1,2_3.0_7A341_Restore.ipsw
inflating: /home/mobile/Projects/iphone/toolchain/tmp/Restore.plist
Firmware Details
Device Class: iPhone
Product Version: 3.0
Build Version: 7A341
Restore RamDisk: 018-5305-002.dmg
Restore Image: 018-5301-002.dmg
Board Config: n82ap
Unzipping 018-5301-002.dmg...
Archive:/home/mobile/Projects/iphone/toolchain/files/firmware/iPhone1,2_3.0_7A341_Restore.ipsw
inflating:
/home/mobile/Projects/iphone/toolchain/tmp/018-5301-002.dmg
We need the decryption key for 018-5301-002.dmg.
I"m going to try to fetch it from
http://www.theiphonewiki.com/wiki/index.php?title=VFDecrypt_Keys:_3.x....
I found it!
Mounting 018-5301-002.dmg...
Decrypting 018-5301-002.dmg...
dmg2img v1.6.1 is derived from dmg2iso by vu1tur (to@vu1tur.eu.org)
/home/mobile/Projects/iphone/toolchain/tmp/018-5301-002.dmg.decrypted -->
/home/mobile/Projects/iphone/toolchain/tmp/018-5301-002.dmg.decrypted.img
reading property list, 116195 bytes from address 208878440 …
partition 0: begin=195, size=430, decoded=284
partition 1: begin=914, size=430, decoded=284
partition 2: begin=1632, size=430, decoded=284
partition 3: begin=2367, size=430, decoded=284
partition 4: begin=3088, size=430, decoded=284
partition 5: begin=3800, size=105735, decoded=71204
partition 6: begin=109817, size=430, decoded=284
decompressing:
opening partition 0 ... [2]
100.00%ok
opening partition 1 ... [2]
100.00%ok
opening partition 2 ... [2]
100.00%ok
opening partition 3 ... [2]
100.00%ok
opening partition 4 ... [2]
100.00%ok
opening partition 5 ...[1775]
100.00%ok
Archive successfully decompressed as
/home/mobile/Projects/iphone/toolchain/tmp/018-5301-002.dmg.decrypted.img
modprobe hfsplus
mount -t hfsplus -o loop
/home/mobile/Projects/iphone/toolchain/tmp/018-5301-002.dmg.decrypted.img /mnt
In order to extract 018-5301-002.dmg, I am going to mount it.
This needs to be done as root.
Copying required components of the firmware...
Unmounting...
Firmware extracted.
Building the toolchain...
Finding and extracting archives...
cctools-667.8.0
CF-476.14
configd-210
DirectoryService-514.23
...
Vá tomar um CAFÉ...
...
Se tudo estiver bem, a compilação do llvm-gcc e outros finalizarão e terão as seguintes mensagens finais:
checking where to find the target ranlib... pre-installed
checking where to find the target strip... pre-installed
checking where to find the target windres... pre-installed
checking whether to enable maintainer-specific portions of Makefiles... no
updating cache ./config.cache
creating ./config.status
creating Makefile
Building gcc-4.2-iphone...
Build progress logged to:
/home/mobile/Projects/iphone/toolchain/toolchain/bld/gcc-4.2-iphone/make.log
It seems like the toolchain built!
Cleaning up...
All stages completed. The toolchain is ready.
Para compilar o um programa em c, basta entrar na pasta ~/Projects/iphone/toolchain/apps/HelloWorldFirst. Encontraremos nesta pasta um convencional HelloWorld conforme o exemplo abaixo, para compilá-lo basta utilizar o comando make.
#include <stdio.h>
int main()
{
printf("Hello World\n");
return 0;
}
Vamos direto ao código em objetive-C,
localizado em ~Projects/iphone/toolchain/apps/HelloToolchain. Ao entrar nesta
pasta utilize o comando make para compilar o projeto. E logo em seguida define
o IP do seu dispositivo móvel para um posterior deploy como no exemplo abaixo:
$ make
$ export IP=10.0.0.2
$ make deploy
Pronto, nesta etapa o dispositivo será reiniciado e um novo aplicativo será
acrescentado na área de trabalho.
Como sempre menciono... Colaborar atrai amigos, competir atrai inimigos...
- Login automático com SSH e Automatização da instalação (deploy) e atualização de sites com GitLinux
- Extensão Sun Presentation Minimizer para Broffice.ORGLinux
- Otimização de Desempenho em sistemas GNU/LinuxLinux
- Hardware para sistemas GNU/Linux - Dicas de Desempenho - Parte 3Hardware
- Hardware para sistemas GNU/Linux - Dicas de Desempenho - Parte 2Hardware