RhodesでAndroidとiPhoneのアプリを、と思ったけれど…

たぶん使わないと思うので足早に。

インストール

> mkdir rhodes_projects
> cd rhodes_projects
> rbenv gemset create 1.9.3-p194 rhodes
> echo rhodes > .rbenv-gemsets
> gem install rhodes
> rbenv rehash
> rhodes-setup
We will ask you a few questions below about your dev environment.

JDK path (required) (/Library/Java/Home): 
Android SDK path (blank to skip) (): /usr/local/Cellar/android-sdk/r20.0.1
Android NDK path (blank to skip) (): /usr/local/Cellar/android-ndk/r8b
Windows Mobile 6 SDK CabWiz (blank to skip) (): 
BlackBerry JDE 4.6 (blank to skip) (): 
BlackBerry JDE 4.6 MDS (blank to skip) (): 
BlackBerry JDE 4.2 (blank to skip) (): 
BlackBerry JDE 4.2 MDS (blank to skip) ():

プロジェクト作成

> rhogen app basestation
> cd basestation
> vi build.yml
android:
  version: 4.1

scaffold的ななにか。

> rhodes model cbase id
Generating with model generator:
     [ADDED]  app/Cbase/index.erb
     [ADDED]  app/Cbase/edit.erb
     [ADDED]  app/Cbase/new.erb
     [ADDED]  app/Cbase/show.erb
     [ADDED]  app/Cbase/index.bb.erb
     [ADDED]  app/Cbase/edit.bb.erb
     [ADDED]  app/Cbase/new.bb.erb
     [ADDED]  app/Cbase/show.bb.erb
     [ADDED]  app/Cbase/cbase_controller.rb
     [ADDED]  app/Cbase/cbase.rb
     [ADDED]  app/test/cbase_spec.rb

ビルド
> rake -T
> rake run:android

rakeながいよ

run:iphoneするならXcodeのPreferencesからiOS 5.0 Simulatorをinstallしておく。

> rake run:iphone

ながいー

うーん、Rubyでマルチプラットフォームは魅力なんだけど、うーん。。

Androidアプリをscalaで作りたい

homebrewでsbtとscalaは入れてある前提。

> brew install android-sdk
> android

SDKマネージャーが立ち上がるので適当なバージョンをインストール

> android list targets
Available Android targets:
----------
id: 1 or "android-16"
     Name: Android 4.1
     Type: Platform
     API level: 16
     Revision: 2
     Skins: HVGA, QVGA, WQVGA400, WQVGA432, WSVGA, WVGA800 (default), WVGA854, WXGA720, WXGA800, WXGA800-7in
     ABIs : armeabi-v7a
----------
id: 2 or "Google Inc.:Google APIs:16"
     Name: Google APIs
     Type: Add-On
     Vendor: Google Inc.
     Revision: 2
     Description: Android + Google APIs
     Based on Android 4.1 (API level 16)
     Libraries:
      * com.google.android.media.effects (effects.jar)
          Collection of video effects
      * com.android.future.usb.accessory (usb.jar)
          API for USB Accessories
      * com.google.android.maps (maps.jar)
          API for Google Maps
     Skins: WVGA854, WQVGA400, WSVGA, WXGA800-7in, WXGA720, HVGA, WQVGA432, WVGA800 (default), QVGA, WXGA800
     ABIs : armeabi-v7a

> android create avd -n android_test -t 1
Auto-selecting single ABI armeabi-v7a
Android 4.1 is a basic Android platform.
Do you wish to create a custom hardware profile [no]
Created AVD 'android_test' based on Android 4.1, ARM (armeabi-v7a) processor,
with the following hardware config:
hw.lcd.density=240
vm.heapSize=48
hw.ramSize=512

プロジェクト作成

> android create project -t 1 -k com.example.testapps -a HelloTest -p hello_test

ビルド

> ant debug

リリース用ならant releaseなのかな。

エミュレータ転送

> adb install bin/HelloTest-debug.apk

ここからscalaで開発するための準備。

> curl https://raw.github.com/n8han/conscript/master/setup.sh | sh
> cs n8han/giter8

$HOME/binにファイルがある

> mkdir scala-test
> cd scala-test
> g8 jberkel/android-app
api_level [10]: 16

androidコマンドで起動するSDKマネージャーでインストールしているものが
Android 4.1 (API 16)
だったので16を指定した。

> git clone git://github.com/jberkel/android-plugin.git
> cd android-plugin
> sbt update
> sbt publish-local

0.6.3-SNAPSHOTだった

> cd test-scala #g8でつくったプロジェクトのディレクトリ
> vi projects/plugins.sbt

0.6.3-SNAPSHOTに書き換える。

> sbt
> compile

OutOfMemoryErrorが出る時がある。が何度かやればいける。*1

デバッグ

> android:package-debug

エミュレータ起動してデプロイ

> android:emulator-start scala_android_test
> PANIC: Could not open: /usr/local/Cellar/android-sdk/r20.0.1/.android/avd/scala_android_test.ini

ここからPANIC: 部分の修正ログ。

> export ANDROID_SDK_HOME=/usr/local/Cellar/android-sdk/r20.0.1

してから

> android create avd -n scala_android_test -t 1

> sbt
> android:package-debug
> android:emulator-start scala_android_test
[error] Expected 'scala_android_test'
[error] android:emulator-start scala_android_test

~/.androidと$ANDROID_SDK_HOMEの両方にavdがあって、ごちゃってきたのでシンボリックリンクすることにした(強引)

> cd /usr/local/Cellar/android-sdk/r20.0.1
> ln -s ~/.android .android

> sbt
> android:emulator-start scala_android_test
> android:start-emulator

android:emulator-start scala_android_testでエミュレータが起動した時に画面にロックがかかっていたらandroid:start-emulatorする前にロックを外してホーム画面にしておく。

android:install-emulatorでもいい。
実機なら、
android:install-device
android:start-device

スクリーンショットも取れた。

> android:screenshot-emulator

sbtでandroid:のあとにタブ打てば色々とコマンドがでます。

[追記]
*1
sbtのファイルをみてみたら、

> cat /usr/local/bin/sbt
#!/bin/sh
test -f ~/.sbtconfig && . ~/.sbtconfig
exec java -Xmx512M ${SBT_OPTS} -jar /usr/local/Cellar/sbt/0.12.0/libexec/sbt-launch.jar "$@"

となっているので、

vi ~/.sbtconfig
SBT_OPTS=-Xmx1024M

としてみたらとりあえずOutOfMemoryErrorが出なくなった(いまのところ)
psみたら、
/usr/bin/java -Xmx512M -Xmx1024M -jar /usr/local/Cellar/sbt/0.12.0/libexec/sbt-launch.jar
いいのかな。。

RubyMotionのアレコレ

詰まりそうなところ。

・app.provisioning_profileの指定

XcodeのOrganizerでプロファイルなど作っているとどこにあるのか、また誰のデバイスを登録してあるのかわからなくなることがありますが、Provisioning Profilesの適当なプロファイルを右クリックして、Reveal Profile in Finderとかクリックすればファイルの場所がわかります。

ちなにみOrganizerで更新するとファイル名が変わったりすることがあり混乱。

・testflightappでテストアプリをインストール出来ない

デバイス登録ができてないはず。
testflightappからテスター登録した人のデバイスIDのメールが来たら、iOS Provisioning PortalのDevicesからAdd Devicesで追加し、それが反映したProvisioning Profileをapp.provisioning_profileで指定してあげればよい。
ワイルドカードだとうまくいかない?のかもしれないので、App IDsから新しいID作って、それからProvisioning Profileを作るといいかも。
Portal上でApp ID作ったらProvisioning ProfileはそのままPortalで作りダウンロードしてもいいし、XcodeのOrganizerで作ってもいい。

・Rakefileまわりのひな形

bundle install –path vendor/bundleした時にbundle exec rakeは面倒なのです。
なので自分テンプレ



This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters


# -*- coding: utf-8 -*-
$:.unshift("/Library/RubyMotion/lib")
require 'motion/project'
require 'bundler'
Bundler.require
Motion::Project::App.setup do |app|
app.name = 'app_name'
app.device_family = [:iphone, :ipad]
app.icons = ['icon.png', 'iconx2.png']
app.identifier = 'jp.runeleaf.app_name'
app.frameworks << "GameKit"
app.frameworks << "AVFoundation"
app.frameworks << "QuartzCore"
app.frameworks << "CoreGraphics"
app.frameworks << "CoreImage"
app.frameworks << "StoreKit"
# test flight
app.testflight.sdk = 'vendor/TestFlightSDK'
app.testflight.api_token = 'api_token'
app.testflight.team_token = 'team_token'
app.testflight.distribution_lists = ['team名']
app.development do
app.provisioning_profile = '/Users/<user>/Library/MobileDevice/Provisioning Profiles/なんちゃらadhoc用.mobileprovision'
app.codesign_certificate = 'iPhone Developer: <username>'
end
app.release do
app.provisioning_profile = '/Users/<user>/Library/MobileDevice/Provisioning Profiles/なんちゃらリリース用.mobileprovision'
app.codesign_certificate = 'iPhone Developer: <username>'
end
## END
app.pods do
pod 'NanoStore', '~> 2.1.4'
pod 'AQGridView'
end
end
desc "Generate model controller view file."
task :generate do
task :model do
p 'model'
end
task :controller do
p 'controller'
end
task :view do
p 'view'
end
end
view raw

Rakefile

hosted with ❤ by GitHub

これでbundle execしなくても、ちゃんとvendor/bundleを見てる。

・app.podsで指定したライブラリが読み込まない?

pod ‘NanoStore’とかで指定したのにNanoStoreクラスないよとかエラーがでたらrm -rf vendor/Podsしてrakeすればよい。

・AppStoreへのリリース時

rake archive:releaseでできた.ipaをアップするんだとおもうが、これOrganizerからできるのかな。
TODO: リリースしたら書く
続きを書いた。

あまりメモってなかったな。。