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.

[ Hits: 54.535 ]

Por: Alessandro de Oliveira Faria (A.K.A. CABELO) em 09/11/2010 | Blog: http://assuntonerd.com.br


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

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á 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.

Como sempre menciono... Colaborar atrai amigos, competir atrai inimigos...
Sobre o autor: http://www.netitec.com.br/alessandro

Página anterior    

Páginas do artigo
   1. Introdução
   2. Instalação, compilação e utilização
Outros artigos deste autor

ARToolKit: Criando aplicativos de Realidade Aumentada

IBM Omni Find Yahoo: Um mecanismo de busca corporativa em seu servidor

Testamos: Visual Basic 8 .NET no Linux. Vejam o resultado!

Ångström: Linux em Palmtops, portáteis e embarcados sem mistério

jKiwi: Simulando pintura de cabelo e novo visual com Software Livre

Leitura recomendada

OneAPI: A plataforma da Intel para facilitar o desenvolvimento com chips Intel, AMD, ARM, NVIDIA POWER e FPGA

Alocação dinâmica

Tratamento de exceções na linguagem C

Parâmetros interessantes do scanf e do printf em C

Algum humor e C++ Design Patterns (parte 2)

  
Comentários
[1] Comentário enviado por matux em 09/11/2010 - 11:34h

Cabelo, mais uma vez você demonstra profundos conhecimentos, profissionalismo e uma profunda curiosidade/pro-atividade.
Meus parabéns.
São pessoas que tem atitudes semelhantes a tua que fazem a comunidade open-source mais forte.
Belo artigo e espero que suas iniciativas motivem aos estudantes de computação em nosso país.
Um forte abraço!
Ps. Já está nos favoritos!

[2] Comentário enviado por rodrigo.slacklin em 09/11/2010 - 12:10h

http://www.saurik.com/id/4
http://code.google.com/p/iphone-dev/
http://stackoverflow.com/questions/276907/starting-iphone-app-development-in-linux

Fontes que datam antes da sua publicação.
Seja mais honesto Cabelo, site as fontes, não queira a glória toda pra você só porque montou o lego.

[3] Comentário enviado por cabelo em 09/11/2010 - 12:34h

Rodrigo Slacklin:

Em primeiro lugar, quero deixar bem claro que gosto de críticas, pois só com elas consigo evoluir, como também não quero, glória pois não teve genialidade nenhuma e vc tem razão apenas montei o lego.

Deixei bem claro também sobre a sua colocação referente a glória na entrevista como Jomar (http://www.itweb.com.br/blogs/blog.asp?cod=86). "Não foi genialidade nenhuma (inclusive não posso deixar de agradecer o Erisvaldo Júnior que diminuiu bastante o meu tempo de aprendizado), foi apenas paciência, calma, pesquisa séria e desafio (estou com o iPad faz uns 4 meses), nas horas vagas para relaxar e sair da rotina, bastou juntar uma série de projetos open-source como iFuse (que permite montar o ipad/iphone no file system), dmg2img converte imagens e aquivos dmg, compilador gnu objetive-c, ferramentas opensource para o darwin e o script iphonedevonlinux, para chegar na imagem ideal (utilizando o suse studio) linux baseda no openSUSE"

Inclusive na página da imagem LiMobile (http://pt.opensuse.org/Utilizador:Cabelo/LiMobile) menciono todos os pacotes opensource utilizado como também o objetivo do projeto.

"O principal objetivo desta iniciativa é proporcionar a composição rápida do ambiente de desenvolvimento para dispositivos móveis da APPLE até para usuários com pouco conhecimento na plataforma GNU/Linux. Sendo o foco principal é evitar transtornos de dependências de pacotes e incompatibilidade de versões. Compilar um gcc para gerar instruções para o iPad e iPhone não necessita de muita técnica especial, pois Cortex A8 é baseado no núcleo do ARM11 ;-)"

Finalizando, meu objetivo foi facilitar a utilização de todos estes recursos opensource...

Abraços.

[4] Comentário enviado por luanyata em 09/11/2010 - 12:47h

Cabelo... mais uma vez sensacional...
Obrigado por compartilhar seu conhecimento e suas pesquisas...

[5] Comentário enviado por paulorvojr em 09/11/2010 - 21:56h

Cabelo a ideia é muito interessante, e uma alternativa claro. belo trabalho.

Mas convenhamos que desenvolvedores como você e eu não vamos utilizar isto em produção.

Melhor pagar 99 doletas a apple por ano, para pode publicar nossos apps a applestore e ganhar dinheiro. Sem isso não é possível.

Desbloquear o aparelho para inserir os testes eu acho valido e faço isso, mas pra produção nada de jailbreak.

usuários mesmo da apple que compram apps, não fazem jailbreak, so maioria dos brasileiros que mau ve um aparelho ja quer desbloquear e acha que ta abafando, so perde com os updates. estimativas indicam que 90% compra na itunes e nada de unlock.

a grande receita eu falo para todos,

vmware + snow leopard + xcode(SDK 3.0) + jailbreak com cydia no iphone/ipod. façam testes e mais testes, sem complicação.

quer ganhar dinheiro no object-c? entao assina a apple anualmente e seja feliz, até calculadora simples ganha 99 centavos de dolar fácil.




[6] Comentário enviado por removido em 11/11/2010 - 12:38h

As aplicações desenvolvidas neste modelo pode ser publicadas nas Apple Store ?

[7] Comentário enviado por anonymous em 11/11/2010 - 20:40h

Cabelo,
Mais uma vez, mandou mt bem!

[8] Comentário enviado por nitro em 20/07/2011 - 11:29h

Exelente Tutorial.. Parabens. Estou pra comprar um iMac, mas com essas dicas acho que vou economizar uma graninha...kkkkkkkkkkkk

[9] Comentário enviado por Noobix em 25/07/2011 - 12:53h

Gostaria de saber se é possivel instalar o seu programa em um Mint, nao encontro o pacote de nome xar para baixar, caso encontre o programa rodará aqui? Onde posso achá-lo?
grato

[10] Comentário enviado por franzbutu em 15/09/2013 - 11:28h

Alguém pode me ajudar nisso?
Tenho o Ubuntu 12.04 fiz todo os procedimentos de download, porém ao executar comando para fazer o download e a compliação não deu certo (tenho o gcc instalado):

francisco@francisco-desktop:~/iOS$ ./toolchain.sh all
Preparing the environment
Toolchain version: 3.0
Building in: /home/francisco/iOS
The following commands are missing: xar bison flex
You may need to install additional software for them using your package manager.

[11] Comentário enviado por andersonbambam em 06/10/2013 - 10:19h

Olá amigo, belo material mas eu gostaria de saber se existe alguma IDE que possa auxiliar o desenvolvimento, para não ficar preso a VI ou VIM no shell.

[12] Comentário enviado por Azraelm em 25/08/2015 - 04:37h

Ótimo artigo.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts