ARTIGOS: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."
Índice
Instalação
Embora seja um desenvolvedor Android, questionamento 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 processado 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.
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, seguinte (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. Ele é 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 são exata, 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 já todos os arquivos instalado 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 passa 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
Compilação
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 ( http://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á copilado 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á e teremos 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 para ~/Projects/iphone/toolchain/apps/HelloWorldFirst. Encontraremos nesta pasta um convencional HellWord 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 sera reiniciado e um novo aplicativos será acrescentado na area de trabalho. Para finalizar, deixo abaixo um vídeo demonstrativo do projeto o LiMobile.
Sendo assim, como sempre menciono... Colaborar atrai amigos, competir atrai inimigos...
Sobre o autor: (Alessandro de Oliveira Faria A.K.A.CABELO )