2014年2月1日土曜日

gitとgithubを使ってみました

ふとAndroidアプリが作りたくなったのでせっかくだからとgitとgithubを使ってみた。

作ったアプリ

今回作ったのは通話開始前に確認が出るようにするアプリ。
そういうのは既にいくつかあるけど今回は呼び出し元アプリ基準で振り分けするようにしてみた。

アプリはgithubからダウンロードできる。

アプリ実装時の裏話はメインではないので最後にでも。

gitで使ったコマンド

github使うなら当然gitも使うわけで、まずはここから。
と言っても使ったことがないわけではなくcommitとかpushぐらいならしたことあるので省略して今回はじめて使ったあたりを紹介。

revert

コミットを取り消すコミットだが今回躓いたポイントその1。
1つファイルを追加してcommit&pushした後に取り消したかったのだが予想外に大変だった。
(ローカルでのコミットだけなら素直にresetしても良さそう)

とりあえず一つ前に戻りたい!という感覚で
git revert HEAD^
を実行したのだがこれがまずかったらしい。

どうやらrevertはそこへ戻るコミットをしてくれるわけではなく指定したコミットそのものを取り消すコミットをするらしい。
つまり2つ前のコミット(作業の大部分)が消えてしまった。

しかもキャンセルしたりEclipseからやり直したりと変なことをしているうちにファイルは全部戻ったけどコミットはされていない状態に。
ということで次のresetに手をだすことになりました。

reset

こちらが躓いたポイントその2。
過去に戻るためのコマンドっぽい?
ファイルは変更されていて既にaddもされているけどcommitされていないという状態からHEADの状態に戻りたかったので使うことにしました。

結論から言うと
git reset --hard HEAD
で出来ました。
これでファイルも含めてすべてHEADの状態に戻ります。
逆に言えば作業中のファイルがあっても吹っ飛ぶので怖いですね。

これをする前に思いついたのは
git reset HEAD
git checkout .
というやり方。
こっちは多分ステージングされたファイルを全部戻してから実際に書きだすという方法?
結局こっちは使ってないのでどうなるのかはわかりません。
gitよくわかってないのでファイルを消すような作業をするときは怖いですね。
今回の場合は最悪リモートからまるごと持ってきてやり直しという方法もあるんでまだましですけど。

githubでアプリを公開

ちょっと前まではgithubは無料で使えるgitリポジトリ程度の認識だったのですが今回初めてgithub独自の機能使ってみました。

今回使ったのはRelease機能。
どうやらソースをgitで管理する以外にそれを完成品として公開する機能があるらしい。

まずは公開の準備として最新のコミットにtagを設定してpush。
今回は v1.0.0 というタグにしておきました。

次に普通にローカルでパッケージ化。
Androidアプリでなければビルドしたり必要なファイルまとめたりとかそういうことになるんだろう。

最後にgithub上でtagを指定してRelease用に設定…のはずがなんか勝手にtagを認識して既に登録されてましたw
それを編集してパッケージの添付、説明文の追加などを行って完成!
出来上がったのが上に張ったリンクです。

本来であれば更新履歴とかを書く気がしますが、今回はアプリの説明かいちゃいました。
そのうちREADMEを作ってそっちに動かします。

githubで公開してみて

意外にgithubが高機能でびっくりしました。
公開とか出来るんですね。
触ってない機能がまだまだあることを考えると恐ろしい…

一方で別にアプリ作るにあたってgithubで公開する良さは今のところよくわからなかったり。
ライブラリとかならみんなが使ってくれるかもしれませんがアプリ公開しても別に使い道無いですよね…
複数人で開発とか始めると便利になるのかな?

おまけ:アプリ裏話

今回はおまけになったアプリ開発のお話。

発信への割り込み

Androidでは権限さえあれば発信への割り込みは簡単に出来ます(緊急発信を除く)。
(前に作った通話便利ツールでもやってます)電話番号の書き換えやら発信の取り消しなどやり放題です。

今回のアプリでどんな割り込みをやってるかはソースが公開されてるのでそっちを見てください。
変なことはしてませんよ?
(中身が見せられるとこういう時に便利なのかな?)

割り込み中は止められないのでユーザーの判断が必要な場面では一旦取り消して確認ダイアログに飛ばしてます。
許可した場合はそこから更にかけ直すので割り込み権限の他に発信権限も必要になりますね。

呼び出し元アプリの特定

実はこれAndroid側の制限で出来ません。
返事を返す必要がある特殊なインテントなどでは取得できますが今回は該当しません。
そもそも今回処理するのは呼び出し元アプリからのインテントではなく電話アプリからのブロードキャストなのでもし取得できたとしても無意味です。

ということで今回は起動中アプリを取得して一番最近のアプリが呼び出し元だろうという強引な前提を使っています。
普通に使っていれば大体の場合は当てはまるので多分大丈夫だと思いますが、あまりおすすめな方法ではないですね。
APIの説明にもアプリ一覧はこういう処理に使うのはよくないよ!って書いてありますし。

アプリの使い道

悪意あるアプリの発信をブロックする…と言いたいところですが、この方法だと悪意のあるアプリに対しての対策には全くなりません。
それこそ電話の発信自体はバックグラウンドからでもできるわけです。
もちろんそんなことをされたら呼び出し元の判定は当然おかしくなります。
ましてや通常のダイヤルアプリが起動した時に裏で発信されたら大抵の場合許可されてしまいます。

結局のところこのアプリは電話の直接発信を行う正規のアプリからの発信を制限することしか出来ません。
電話を発信する正規アプリ自体それほど多くありませんし、その中で押し間違えやすいUIで確認もないようなアプリと考えるとなかなかありません。
使い道という面ではかなり微妙な感じです。

0 件のコメント:

コメントを投稿