Desenvolvimento - Mobile

Deployment para SmartDevices

Pretendo neste artigo, demonstrar de maneira simples, como criar uma forma eficaz de distribuição e instalação de aplicações para smart devices (dispositivos espertos – Pocket, Smartphone e etc...).

por Max Mosimann Netto



O desenvolvimento de sistemas para dispositivos moveis como Pocket PCs, Smartphones entre outros ficou claro quanto à facilidade e rapidez de desenvolvimento utilizando o Visual Studio.NET e a plataforma .net. No entanto, a distribuição de tais aplicações nem sempre é feita da maneira mais indicada nem da maneira correta.

Pretendo neste artigo, demonstrar de maneira simples, como criar uma forma eficaz de distribuição e instalação de aplicações para smart devices (dispositivos espertos – Pocket, Smartphone e etc...). Ao final, espero que os curiosos de plantão e especialistas estejam mais nivelados e transitando sistemas profissionais pela web e entre seus clientes.

A criação de projetos de setup para a criação de instalações e assistentes de instalações mostra-se extremamente completa e competente no Visual Studio.net, sendo assim, usaremos o mesmo tipo de projeto para criar uma instalação de sistemas para smart devices.

O processo é basicamente o mesmo, mas devemos nos apegar aos pequenos detalhes que farão a diferença no sucesso da criação da aplicação de instalação.

Para começar, devemos ter o Microsoft ActiveSync instalado e configurado corretamente no computador, pois é esse software que faz a comunicação entre o device e o seu computador. Eu recomendo a instalação sempre da última versão, pois a cada lançamento, novas features são adicionadas tornando a integração entre o device e o micro extremamente transparente ao usuário.
Para efetuar o download da última versão acesse: http://www.microsoft.com/windowsmobile/default.mspx

Um dos recursos disponíveis no Microsoft ActiveSync é o CE Application Manager (CEAppMgr.exe ) utilizado para instalar e remover programas diretamente no device.
É muito semelhante ao Instalar e Remover Programas do Windows, só que em versão especializada para dispositivos móveis, como pode ser visto na Figura 1.

Figura 1.


Esse utilitário pode ser acessado diretamente no diretório onde foi instalado o Microsoft ActiveSync, porém, como temos a liberdade de instalá-lo em diferentes locais e até mesmo em diferentes partições do HD, usaremos uma chave do registro do windows que contém exatamente o diretório onde o ActiveSync foi instalado. Isso garante que mesmo que escolheu um local diferente do padrão para a instalação, conseguira executar nossa instalação.

Esse utilitário garante que a versão apropriada a cada processador seja instalada corretamente. Por exemplo: Se desenvolvemos uma aplicação sem levar em consideração os processadores dos devices poderemos ter muitos problemas, como por exemplo erro na instalação. O CEAppMgr garante que cada device receberá a instalação para seu processador. Assim garantimos uma instalação genérica. Podemos desenvolver uma única aplicação que quando instalada em processadores ARM, SH3 ou X86 funcionarão perfeitamente, ficando transparente ao distribuidor da instalação o modelo de processador de cada aparelho.

Para dar inicio aos passos necessários para a geração de nossa instalação, será necessário criamos uma pequena aplicação de teste. Sendo assim, criaremos um formulário que ao ser executado do Pocket ficará mostrando a hora atual do sistema com a ajuda de um controle Timer.

1. Abriremos o Visual Studio.net e criaremos um projeto do tipo Smart Device Application – chamá-lo-emos de HoraCerta como visto na Figura 2;

Figura 2.

2. Após clicarmos no botão OK, uma tela solicitando o tipo do projeto será exibida. Escolheremos a plataforma Pocket PC e o tipo do projeto Windows Application; 3. No design do formulário exibido, colocaremos um Label que será responsável por exibir a hora do sistema, um controle Timer e um botão de Fechar, como visto na Figura 3;

Figura 3.

4. Mudaremos a propriedade Enabled do controle Timer para True e daremos um duplo clique sobre o controle. A tela de edição de código será exibida. Colocaremos o código necessário para exibir a data no Label, como visto na Figura 4;

Figura 4.

5. No modo design do formulário, dê um duplo clique sob o botão Fechar. A tela de edição de código será exibida. Colocaremos o código necessário para fechar a aplicação na hora que o botão for clicado, como visto na Figura 5;

Figura 5.

6. Pronto ! Nossa aplicação esta pronta para ser distribuída. Para isso compilamos a aplicação pressionando as teclas Ctrl+Shift+B ou clicando no menu Build e logo em seguida em Build HoraCerta.

7. Se a compilação foi bem sucedida, podemos tirar nossa aplicação de modo Debug e coloca-la em modo Release (distribuição). Para isso selecione a Solution HoraCerta na Solution Explorer, e mude a propriedade Active config para Release. Agora compile novamente seu projeto seguindo o passo 6 – Ao passarmos a aplicação para modo Release, várias linhas utilizadas apenas para debugar a aplicação são retiradas do código final da aplicação, isso garante que nossa aplicação seja executada muito mais rápida.

8. Agora iremos gerar os arquivos de instalação para cada processador. Para isso, basta clicarmos no menu Build e logo em seguida em Build Cab File . Algumas telas pretas (command window) serão abertas e fechadas no sua tela. Não se assuste, esse processo é normal, pois para gerar o .CAB de cada processador, uma aplicação executada em linha de comando é chamada.

9. Abra o Windows Explorer e vá até a pasta onde criamos nossa aplicação. Note que existem 3 diretórios dentro da pasta HoraCerta: bin, cab e obj. No diretório bin estão as duas versões da aplicação que acabamos de fazer (modo debug e modo release). No diretório cab esta a versão release dos arquivos .CAB que geramos no passo 8. Note que dentro da pasta HoraCerta\cab\Release estão os arquivos de instalação de cada versão de processador que o Visual Studio.net suporta (arquivos .CAB).

A primeira parte da geração das instalações esta completa, porém ainda corremos o risco de enviar versões erradas de instalações para usuários que não sabem identificar o processador de seus devices, e o pior: temos vários arquivos que fazem a mesma coisa, mas que só executam nos respectivos processadores! UM PROBLEMÃO....

Bom, nosso objetivo agora é criar uma instalação, que seja muito similar as instalações do Windows Installer (modo assistente), para que ela descubra o processador do dispositivo, e instale a versão correta da aplicação. Um outro beneficio que teremos ao criar essa aplicação Installer, é a opção de desinstalar corretamente as aplicações instaladas, sem que tenhamos que apelar para o DEL.

O primeiro passo será gerar um arquivo chamado Setup.ini com algumas configurações padrão para que o Installer gerado possa lê-lo e saber o que fazer com as informações contidas nele. O link abaixo pode ser usado para maiores informações sobre como gerar o arquivo mencionado acima: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcesetup/html/_wcesdk_creating_an_ini_file_for_the_application_manager.asp

Devido a dificuldade que a geração na mão desse arquivo oferece, desenvolvi uma pequena aplicação para gerar esse arquivo automaticamente. Para isso, basta fazer o download da aplicação clicando aqui. Para utilizar a aplicação, execute-a e clique no sinal de 3 pontos na frente do campo Path da Aplicação, como visto na Figura 6.

Figura 6.

Na caixa que é aberta, selecione o diretório aonde os arquivos .CAB da aplicação foram gerados: ../HoraCerta/cab/Release , como visto na Figura 7.

Figura 7.

A aplicação deverá preencher todos os campos automaticamente, como visto na Figura 8.

Figura 8.

Caso nenhuma mensagem de erro seja exibida, clique em Gerar Arquivo para que o arquivo Setup.ini seja gerado no mesmo diretório onde os arquivos .CAB se encontram. Caso algum campo fique em branco é provável que o diretório que você selecionou não contenha os arquivos .CAB gerados no passo 8 descrito acima.

O arquivo resultante será semelhante ao visto na Figura 9.

Figura 9.

Esse arquivo possui algumas particularidades, como por exemplo não utilizar caracteres acentuados para descrever valores de suas chaves, por esse motivo criei e utilizo o sistema para gerá-lo. Caso você queira criar seus próprios arquivos Setup.ini acrescentando outros valores fique a vontade e siga como exemplo o link que informei logo acima.

Para efetuar download do sistema de geração de arquivos Setup.ini clique aqui.

Ok – a segunda parte de todo o processo esta concluída. Agora criaremos uma DLL (não se assuste) que fará exatamente o processo de chamada do sistema CEAppMgr.exe do Microsoft ActiveSync .

A aplicação CEAppMgr.exe pode receber parâmetros para executar determinadas tarefas. São exatamente esses parâmetros que o arquivo que gerados acima (Setup.ini) irá suprir. Por esse motivo que o arquivo Setup.ini deve ser extremamente padronizado.
Nossa DLL será responsável por acessar uma chave do registro do Windows para descobrimos onde o Microsoft ActiveSync foi instalado. Feito isso, chamaremos a aplicação CEAppMgr.exe passando como parâmetro o Path do arquivo Setup.ini que acabamos de gerar. Na verdade nosso código será dividido em duas partes: Install e Uninstall .

Quando formos instalar nossa aplicação passaremos como parâmetros para o CEAppMgr.exe o Path do arquivo Setup.ini, e quando formos desinstalar chamaremos novamente a aplicação CEAppMgr.exe porém sem o parâmetro. Isso fará com que apenas o App Manager seja aberto, permitindo que nossa aplicação seja selecionada para ser desinstalada.

Para começar a criar nossa DLL, devemos criar um projeto no Visual Studio.net do tipo Class Library – chamá-lo-emos de CustomInstaller , como visto na Figura 10.

Figura 10.

Em seguida faremos referencia a 2 namespaces que utilizaremos: System.Configuration.Install e System.Windows.Forms. Para isso clique no menu Project e logo em seguida em Add Reference . Na tela que abriu, selecione os dois Namespaces informados acima.

Abaixo segue o código de nossa DLL devidamente comentado.


Imports System.ComponentModel
Imports System.Windows.Forms
Imports System.IO
Imports Microsoft.Win32

'Devemos informar que a Classe Installer que estamos criando
'é herdada da classe System.Configuration.Install.Installer
<RunInstaller(True)> Public Class Installer
Inherits System.Configuration.Install.Installer

'Essa Sub é executada quando a aplicação é instalada
Private Sub Installer_AfterInstall(ByVal sender As Object, ByVal e As System.Configuration.Install.InstallEventArgs) Handles MyBase.AfterInstall
'Retorna o path do arquivo de configuração Setup.ini
Dim arg As String = Path.Combine(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), "Setup.ini")

'Executa a Sub para chamar a aplicação Configuration Manager passando como parametro o arquivo Setup.ini
RunAppManager(arg)
End Sub

'Essa Sub é executada quando a aplicação é desinstalada
Private Sub Installer_AfterUninstall(ByVal sender As Object, ByVal e As System.Configuration.Install.InstallEventArgs) Handles MyBase.AfterUninstall
'Executa a sub para chamar a aplicação Configuration Manager em modo de unistall (sem parametros)
RunAppManager(Nothing)
End Sub

Private Sub RunAppManager(ByVal arg As String)
'Chave do registro que contém o path da instalação do Microsoft ActiveSync
Const RegPath As String = "Software\Microsoft\Windows\CurrentVersion\App Paths\CEAppMgr.exe"

'Retorna a partir do Registro o path para a execução da app Configuration Manager
Dim key As RegistryKey = Registry.LocalMachine.OpenSubKey(RegPath)
Dim appManager As String = CStr(key.GetValue(""))

'Se a chave não retornar vazia
If Not (appManager Is Nothing) Then
'Se o parametro for passado
If arg Is Nothing Then
'Chama a aplicação CEAppMgr.exe passando como paramêtro o Path do Setup.ini
Process.Start(String.Format("""{0}""", appManager))
Else
'Chama a aplicação CEAppMgr.exe não passando nada como paramêtro
Process.Start(String.Format("""{0}""", appManager), String.Format("""{0}""", arg))
End If
Else
'Caso não seja localizada a aplicação, uma mensagem é exibida
MessageBox.Show("Application Manager não encontrado. Verifique se o Microsoft ActiveSync esta instalado corretamente.")
End If
End Sub

End Class

Após codificado, podemos compilar a DLL pressionando as teclas Ctrl+Shift+B. Se a compilação ocorreu sem erros, podemos passar a DLL para modo Release como descrito o passo 7 e compila-la novamente.

A DLL será gerada dentro do diretório bin da pasta onde você criou o projeto.

Agora ja podemos partir para a criação da instalação. Para isso, criaremos um novo projeto no Visual Studio.net do tipo Setup Projects chamá-lo-emos deInstall HoraCerta- , como visto na Figura 11.

Figura 11.

Uma tela contendo duas divisões será aberta. Na divisão da esquerda selecione a opção Application Folder. Dentro dessa área, na divisão da direita, iremos adicionar os arquivos referentes a instalação de nossa aplicação. Clicamos com o botão da direita na divisão da direita é selecionamos a opção Add e logo em seguida File. Na tela que se abriu, devemos adicionar todos os arquivos .CAB que foram gerados no passo 8 do processo da criação de nossa aplicação de testes (HoraCerta). Navegue até o diretório onde o projeto esta localizado, e usando a tecla Ctrl selecione todos os arquivos .CAB. Após todos os arquivos adicionado, teremos algo como a Figura 12.

Figura 12.
Devemos repetir o processo acima para incluir na lista de arquivos, também o arquivo Setup.ini gerado no processo anterior, e também a DLL localizada dentro do diretório bin da pasta onde se localiza o projeto CustomInstall criado anteriormente, como visto na Figura 13.

Figura 13.

Agora precisamos configurar o Visual Studio.net para que esse projeto de instalação seja gerado de maneira correta: Ao executarmos a instalação, a DLL deverá ser chamada pelo instalador, passando como parâmetro para a aplicação CEAppMgr.exe o path do arquivo Setup.ini. Para isso, devemos pressionar o botão Custom Actions Editor que esta localizado na Solution Explorer, como visto na Figura 14.

Figura 14.

Uma tela contendo 4 tópicos (Install, Commit, Rollback e Uninstall)será mostrada. Aqui podemos definir o que ocorrerá em cada tópico. Por exemplo: podemos criar algo que só será executado durante a instalação, ou algo que´acontecerá caso algum erro aconteça durante o processo de instalação. Nosso objetivo é configurar o VS.net para que durante a instalação e desinstalação nossa DLL seja executada. Sendo assim, clicaremos com o botão da direira sobre a opção Install e logo em seguida em Add Custom Action. Devemos escolher a pasta onde adicionamos a DLL, no caso Application Folder. Selecionamos a DLL (CustomInstaller.dll) e clicamos em OK. Repetimos os mesmos passos para a opção Uninstall. Após adicionados aos seus respectivos tópicos, teremos algo como na Figura 15.

Figura 15.

Agora devemos configurar as pripriedades da instalação que será gerada, como diretório onde será instalada no dispositivo e nome dos autores. Para isso selecionamos o projeto Install HoraCerta na Solution Explorer e através da guia Properties podemos configura-las. Não vou me prender nesses detalhes. As configurações ficaram como na Figura 16.

Figura 16.

Pronto - Agora podemos gerar a instalação. Para isso pressionamos as teclas Ctrl+Shift+B. Se a compilação ocorreu sem erros, podemos passaro projetopara modo Release como descrito o passo 7 e compila-la novamente. Três arquivos serão criados dentro da pasta Release dentro da pasta onde o projeto de setup foi criado: Install HoraCerta.msi, Setup.Exe e Setup.Ini. Notem que o arquivo Setup.Ini não é o mesmo criado pelo gerador; é apenas um arquivo de configuração que só deve ser enviado junto coma instalação se o usuário se enqudrar nas condições abaixo:

O arquivo Install HoraCerta.msi é indicado para usuários que possuem uma versão mais atual do Windows, como o XP e superiores, pois nessa versão o Windows já vem com o Windows Installer instalado corretamente. Já para usuários que rodam o Windows 98, ME e inferiores, é recomendada a distribuição do arquivo Setup.Exe juntamente com o arquivo Install HoraCerta.msi e o Setup.Ini, pois o arquivo Setup.Exe possui recursos para executar o arquivo Install HoraCerta.msi sem a necessidade do Windows Installer.

Após executar o arquivo de instalação, um assistente será exibido. Como de costume confirme as informações apresentadas e pressione Next até concluir a instalação. Assim que a instalação for concluída, o CEAppMgr.exe será aberto e informará uma mensagem, como visto na Figura 17.

Figura 17.

Se clicarmos em Sim o projeto será instalado no device.

Pronto ! Agora já podemos criar distribuições profissionais mesmo para sistemas para dispositivos móveis.

Para efetuar o download do Projeto de teste (HoraCerta), do projeto da DLL (CustomInstall) e do projeto de Setup (Install HoraCerta), clique aqui.

Espero que seja útil a todos, pois recebí muito e-mails pedindo para criar um artigo como este.


Abraços,

Max Mosimann Netto
Max Mosimann Netto

Max Mosimann Netto - Fundador e coordenador do grupo Codificando.net (http://www.codificando.net). Atualmente presta consultoria na área de mobile business, desenvolvendo aplicações para web, pocket, celular e smartphone.
TheSpoke: http://br.thespoke.net/MyBlog/max/MyBlog.aspx