SyntaxHighlighter

2014年5月20日火曜日

[Android] 無料版と有料版のソースを統一

長らく、同じアプリの無料版と有料版を別々のプロジェクトとして管理し続けていて、無料版で更新した内容を有料版に反映したつもりがもれていたりして、大変だったんです。 で、http://d.hatena.ne.jp/tomorrowkey/20101020/1287584710 の記事を参考に1本化したんですけど、阿呆な私にはその道のりも大変険しく、はまりまくったのでメモを残しておきます。

  1. 無料版と有料版の2つのプロジェクトがある状態からのスタートだと、まずはどちらかをまるごとコピーして新しいプロジェクトを作り、そこで両方の機能を内包した1つのアプリにします。 パッケージ名は勿論無料版とも有料版とも違うものに変えてください。機能の違いは、上記URLに書いてある、パッケージ名で無料版か有料版かを判別するクラスを利用して if で分岐させます。 ソースもリソースもライブラリも、有料版にしか必要ないものも無料版にしか必要ないものも全て入れます。 必然的に差異が多ければ多いほど、パッケージのサイズが無駄に大きくなってしまいますが仕方ありません。 string.xml の app_name など、名前が同じで値が異なるものは、名前を分ける必要があります。 app_name_free と app_name_pro とかそんな感じで。 この共有プロジェクトの AndroidManifest.xml とかProGuardの設定ファイルとかは使わないのでマージするにあたって更新していく必要はありません。 放置でいいです。このプロジェクトのことは以下の説明ではCoreと呼びます。
  2. Coreプロジェクトを右クリックしてプロパティを開き、[Android]で下にスクロールして[Is library] にチェックを入れます。
  3. 既存の無料版と有料版のバックアップをとっておきます。SVN使ってるならコミットしてタグでも付けとけばいいでしょう。 使ってなければワークスペースの中のプロジェクトフォルダごとごっそりどこかにコピーしておけばいいかと。
  4. 無料版と有料版のプロジェクトから、ソースやライブラリやリソースを削除します。 このとき、src フォルダや res フォルダなどのプロジェクト直下にあるフォルダは残しておきます。 その下の階層(例えば values とか)はフォルダごと削除してしまってOKです。
  5. 無料版と有料版のプロジェクトを右クリックしてプロパティを開き、[Android]で下にスクロールして、[Add]ボタンでCoreプロジェクトを選択します。 Core以外のこれまで参照していたライブラリは外してしまっていいです。
  6. 無料版と有料版の AndroidManifest.xml を更新します。Activity 名の前に、Core のパッケージ名を付けます。 例えば今まで "MainActivity" だったものを、"com.example.hoge.core.MainActivity" にする感じ。 このとき、有料版でしか使わないアクティビティを無料版の AndroidManifest.xml に足したり、その逆をしたりする必要はありません。 使うアクティビティだけでいいです。パーミッションについてもそうです。 ソースが統一されたからといって、無料版でしか必要ないパーミッションを有料版につけたり、その逆をしたりする必要はありません。 また、アプリ名やランチャーアイコンをリソース参照すると思いますが、このとき、@packagename:string/app_name とか @packagename:drawable/ic_launcher としてはいけません。 別のパッケージにあることは気にせずにそのまんま @string/app_name と @drawable/ic_launcher でいいです。_free とかに名前変えた場合は当然 app_name_free にはしてくださいね。
  7. Eclipseのメニューの[Project]の[Build Automatically]はオフにしておき、ビルドの前にはCoreとビルドしようとしているほうのプロジェクトをメニューの[Project]の[Clean]してからビルドしましょう。 Cleanするときに、すぐにビルドする、みたいなオプションがありますがそれは外しておいてください。 この項目は、私の環境だとそうしないとエラーが出てしまうんですけど、皆がそうってわけでもないかもしれないのでCleanしなくても問題ないなら問題ないです。多分。

2014年5月15日木曜日

[Android] はまったことメモ

久々にはまったことメモ。

絶対に存在しているリソースが無いと言われる→refreshとかclean→それでもない→genの中のR.javaを捨てて、×だらけになるがそれでも無視してビルドしてみる

他のパッケージのdrawableやstringを参照するのに、@[packagename:]drawable/nameとするのは間違い。[packagename:]の部分は不要。

2014年5月6日火曜日

[Android] 自分的SVN管理方法

毎回忘れてて大変なことになるので、自分用のメモを兼ねて自宅のPC数台でのプロジェクト共有方法を書いておきます。完全に自己流です。

環境

  • TortoiseSVN 1.7.6
  • Eclipse 3.7.2

リポジトリサーバは DropBox のフォルダ直下に svn というフォルダを作ってそこを利用します。 フルパスは C:\Users\hoge\DropBox\svn と仮定して記載します。 パスは共有する各PCで異なっていても問題ありません。この svn フォルダはただのフォルダです。事前に作成しておいてください。 勿論 Dropbox じゃなくてNASとかサーバがあればそれでもいいです。

初回同期までの流れ

  • Eclipse で新規 Android プロジェクトを作る。共有したくなるまで適当に作ります。
  • エクスプローラで svn フォルダを開き、プロジェクト名で新規フォルダを作成する。ここでは仮に testproject という名前で作ったことにします。
  • 作成した testproject フォルダを右クリックして、[TortoiseSVN]→[Create repository here]をクリック。
    01_createrepo.png
  • default folder structure を作るかどうか聞いてくるので作る。
    02_createfolder.png
  • testproject フォルダを右クリックして、[TortoiseSVN]→[Repo-browser]をクリックし、中に[branches],[tags],[trunk]があることを確認したら[OK]を押して閉じる。
    03_repobrowser.png
  • Eclipse に戻って、プロジェクトを右クリックし、[Team]→[Share Project]をクリック。
  • [SVN]を選択して[Next]をクリック。
  • [新しいリポジトリー・ロケーションを作成]を選択して[Next]をクリック。
    04_newsvn.png
  • [Url]に[file:///C:/Users/hoge/DropBox/svn/testproject]と入力して[Next]をクリック。
    ※file: の後の / が3つなのは間違いではありません!3つ記載してください。
    ※パスの \ は / にして記載します。
    05_urlinput.png
  • [指定したフォルダ名を使用]にチェックを入れて、入力欄に[trunk]と入力して(※)[Next]をクリック。
    ※[URL]は[file:///C:/Users/hoge/DropBox/svn/testproject/trunk]になったはず。

    06_trunk.png
  • コメントはデフォのままでもいいし適当に編集してもいいです。[Finish]をクリック。
    ※TortoiseSVN でリポジトリを作成したときに default folder structure を作成していると、『フォルダ"{0}"はすでにリモートで存在します。既存のものと異なるフォルダ名を設定してください。』というメッセージが表示されますが、[Yes]を押せばそのまま成功します。
    07_warning.png
  • 自動的に同期画面になります。左上のペインでプロジェクトを展開してください。 [bin]フォルダを右クリックし、[svn:ignoreに追加]をクリック。開いたダイアログは中身は変更せずに[OK]をクリック。 同様に[gen]フォルダもsvn:ignoreに追加します。
    08_syncwindow.png 09_ignore.png
  • プロジェクトを右クリックして[コミット]をクリック。適当にコメントを入れて[OK]をクリック。

別PCからの初回利用の流れ

  • Eclipse で新規プロジェクト作成のウィザードを立ち上げ、[SVN]→[SVNからプロジェクトをチェックアウト]を選択して[Next]をクリック。
    10_newproj.png
  • [新規リポジトリー・ロケーションを生成]にチェックを入れて[Next]をクリック。
  • [Url]に Dropbox の svn\testproject フォルダまでのパスを入力して[Next]をクリック。1台目のPCとパスが違っても問題ありません。 例えば仮に Dropbox のフォルダが D:\Dropbox ならば [file:///D:/Dropbox/svn/testproject]と入力します。
    11_svnurl.png
  • [trunk]フォルダを選択して[Finish]をクリック。
    ※特定のタグやブランチから取り込みたければそれを選択してもOK。
    ※特定のリビジョンから取り出したかったり、ワークスペースの場所を標準から変えたければ[Finish]ではなくて[Next]で進めばそのへんを設定できます。
    12_export.png
  • リポジトリにない[bin]と[gen]フォルダは勝手に作られますが、フォルダに?マークが付いているはずです。
    13_question.png
    [bin]フォルダを右クリックし、[Team]→[svn:ignoreに追加]をクリック。開いたダイアログは中身は変更せずに[OK]をクリック。 同様に[gen]フォルダもsvn:ignoreに追加します。これで?マークが消えるはずです。

運用

  • こまめにコミットすること。コミットの方法はプロジェクトを右クリックして[Team]→[コミット]。
  • コミットの際には必ずコメントを詳細に入れること。
  • 作業PCを切り替えたときは必ず[Team]→[更新]してから編集すること。
  • リリース版にはタグを付ける。プロジェクトを右クリックして[Team]→[ブランチ/タグ]をクリック。 [コピー先のURL]に初めから入っているURLの末尾の[trunk]の部分を[tags/バージョン番号]に書き換えて[Next]をクリック。 14_tag.png [リポジトリーのHEADリビジョン]を選択(もし忘れてて後からタグ付けする場合はリリースしたときのリビジョンを選択)して[Next]をクリック。 コメントを入力して[Finish]をクリック。[作業コピーを新しいブランチ/タグに切り替える]にはチェックを入れないこと。 15_tagfinish.png
  • 本流を汚さずに実験的な機能を試したい場合はブランチを作る。 作り方はタグと同じだがコピー先URLの[tags/バージョン番号]を[branches/任意の名前]に変えることと、[作業コピーを新しいブランチ/タグに切り替える]にチェックを入れる。

覚書

  • trunk が本流。タグはリリース時点でのスナップショット。ブランチは支流。普通のソフトウェア開発とかで複数バージョンのメンテを続けなければならない場合はマイナーバージョンのブランチを作ってそのブランチでリビジョンをアップしていったりする。Android アプリは1アプリの公開バージョンは1つだけなので、1人で開発している限りブランチの必要性はあまりない。チーム開発している場合などはリリースに向けた安定化と時期バージョンの新機能追加が平行に走ったりするので必要になる。
  • 1つのリポジトリの中でプロジェクトごとにフォルダを作って管理することもできるが、リビジョン番号はリポジトリ全体での通し番号にされてしまうので、1プロジェクト単位でヒストリを見た場合にリビジョン番号が歯抜け状態になって気持ち悪い。のでプロジェクトごとにリポジトリを作っている。

2014年5月5日月曜日

android:hardwareAccelerated="true"

android:hardwareAccelerated="true" を設定すると逆に遅くなる場合もあるので注意!短めのスクロールビューで有効にしてちょっと早くなった気がする、と思っていたら、長いスクロールビューでのスクロールが使い物にならないレベルになってしまって速攻で元に戻しました。