ページ

2013/06/30

[Android]リリースビルドしても waiting for debugger が出る

開発をしていてそろそろリリースするか、と
リリースビルドした apk をインストールして実行してみると
waiting for debugger が出てアプリが開かない。

waiting for debugger | 秋元
デバッグ版が不完全にアンインストールされている
USBでつないで実機でデバッグなどしていた場合に、実機のアプリケーション一覧からアンインストールしただけでは、署名関係などが残ってしまいリリース版のインストールがうまくいかないことがあるそうです。インストールできない、とデバッガ待ちで止まってしまう
完全にコレでした。
USB で実機をつないで ADB 経由で完全にアンインストールしないと証明書関係の情報が残って
デバッグ版として waiting for debugger が出るらしい。
以下のコマンドで完全にアンインストールできる。
adb uninstall example.package.name

2013/06/18

[Android]Google Analytics for Androidの送信タイミングを制御する

Google Analytics へのデータ送信をフォアグラウンド実行中に制限したかったので
設定を変更してみた。

まず、データ送信は以下の2つのタイプがある。
Periodic dispatch: プログラムか analytics.xml で設定した間隔で送信するタイプ
Manual dispatch: 任意のタイミングで送信するタイプ

Periodic Dispatch

<integer name="ga_dispatchPeriod">60</integer>
GAServiceManager.getInstance().setDispatchPeriod(60);
デフォルトは30分で、負の値で送信を無効化、0でトラッキングイベント発生時に送信するように設定できる。
僕はフォアグラウンド実行中に制限するために 0 を指定した。

Manual Dispatch

GAServiceManager.getInstance().dispatch();
これを呼び出すだけでいいらしい。
バックグラウンドに移る際に実行しておけば送信漏れが無さそうで良いかもしれない。

送信失敗してもローカルに保存されて次回送信されるけど
午前4時を過ぎるとデータが無効化されるのでできるだけ漏れがないように実装したいところ。

2013/06/17

[Android]Google Analytics for Android でオプトアウトを実装する

[Android]Google Analytics for Android SDKを使う | DevAchieveで書いたように
Google Analytics を実装する場合はユーザーに通知して同意を得るか
オプトアウトできるようにする必要がある。
Advanced Configuration - Android SDK - Google Analytics — Google Developers
You can enable an app-level opt out flag that will disable Google Analytics across the entire app. Once set, the flag will persist for the life of the app or until it is reset.
the life of the app ってライフサイクルの終わりまででいいんだろうか?
アンインストールするまで?

// Google Analytics Opt-Out
if(PreferenceUtil.getBoolean(this, getString(R.string.isOptOutRequested), false)){
    boolean isOptOut = PreferenceUtil.getBoolean(this, getString(R.string.isOptOut), false);
    GoogleAnalytics.getInstance(this).setAppOptOut(isOptOut);
}else{
    PreferenceUtil.putBoolean(this, getString(R.string.isOptOutRequested), true);
    showOptOutDialog();
}
上記で初回に Google Analytics を使用するが問題ないか尋ねてその結果をセットする。
GoogleAnalytics.getInstance(this).setAppOptOut(true);
PreferenceUtil.putBoolean(this, getString(R.string.isOptOut), true);
一回セットすればアプリ全体で機能が有効/無効切り替えることができる。

requestAppOptOut でオプトアウト状況を取得することができるけど
普通に SharedPreferences に持っていた方が良いような気がする。

2013/06/16

[Android]ビルドエラー INSTALL_FAILED_CONTAINER_ERROR

Android アプリを開発していたら急にビルド時に
INSTALL_FAILED_CONTAINER_ERROR が出てビルドできなくなった。
よくわからないけど installLocation を preferExternal にしていると起こるみたい。

SDカードへのインストールが失敗してゴミが残るとインストールエラーになるっぽいので
PC から SDカードをファイラーで開いて以下のファイルを削除すれば良い。らしい。
/sdcard/.android_secure/smdl2tmp1.asec

見てみたらなかったので自分のアプリのパッケージ名 .asec があったので削除したらビルドできるようになった。

2013/06/08

[Git][Android].gitignoreを設定する

Androidアプリ作ってるよー!カメラアプリでプレビューが歪むよー!
結構大きな変更になりそうだよー!ブランチ切りたいよー!
git 使ってなかったよー! Android 用の .gitignore ってどんな設定すればいいのー?

ということで
git init
vi .gitignore
# built application files
*.apk
*.ap_

# files for the dex VM
*.dex

# Java class files
*.class

# generated files
bin/
gen/

# Local configuration file (sdk path, etc)
local.properties

# Eclipse project files
.classpath
.project

# Proguard folder generated by Eclipse
proguard/

# Intellij project files
*.iml
*.ipr
*.iws
.idea/
gitignore/Android.gitignore at master · github/gitignore · GitHub

.DS_store とかもコミット対象になってるんだけどーって場合は
vi ~/.gitignore
# Compiled source #
###################
*.com
*.class
*.dll
*.exe
*.o
*.so
 
# Packages #
############
# it's better to unpack these files and commit the raw source
# git has its own built in compression methods
*.7z
*.dmg
*.gz
*.iso
*.jar
*.rar
*.tar
*.zip
 
# Logs and databases #
######################
*.log
*.sql
*.sqlite
 
# OS generated files #
######################
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
Icon?
ehthumbs.db
Thumbs.db
git config --global core.excludesfile ~/.gitignore で設定する。
設定された確認するには以下のようにする。
git config --global --get core.excludesfile

[Git][GitHub]やっておくと地味に便利なこと2つ | DevAchieve
設定したはずなんだけどすっかり忘れてた。

2013/06/04

[Android]Google Analytics for Android SDKを使う

Android Native Application Tracking Overview - Google Analytics

Android でも Google Analytics を使えばアプリの使用状況を知ることができるので
アプリの改善につながると思い、開発中のアプリに組み込むことにした。

Downloads - Android SDK - Google Analytics

まずはダウンロードだけど、ダウンロードと同時に
GOOGLE ANALYTICS TERMS OF SERVICE(※日本語版:Google アナリティクス サービス利用規約)と
Measurement Protocol / SDK Policyに同意したことになるので読んでおいたほうがいい。
特に SDK Policy は大事で、
どのようなデータを収集するか、開発者が持つユーザーの他のデータと紐付けることができるかどうかなどの
Google Analytics の実装と機能についてユーザーに適切な通知をすること、
ユーザーからの同意を得るか、実装と機能をオプトアウトする機会を提供する必要が有ること、
個人やデバイスを一意に識別できるいかなるデータをハッシュ化しようともアップロードしてはならないこと
などが書かれている。
ダウンロードしたら /libs フォルダに入れて Build Path の設定をする。

Set up new properties for Mobile App Analytics

ヘルプの手順で Google Analytics のアプリ用のプロパティを設定する。
トラッキング ID が大事。

Google Analytics SDK for Android v2 (Beta) - Overview

AndroidManifest.xml に以下のパーミッションを追加する
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
EasyTracker メソッドを追加する
public class TrackedActivity extends Activity {
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
  }

  @Override
  public void onStart() {
    super.onStart();
    EasyTracker.getInstance().activityStart(this); // Add this method.
  }

  @Override
  public void onStop() {
    super.onStop();
    EasyTracker.getInstance().activityStop(this); // Add this method.
  }
}
analytics.xml ファイルを作成する
<?xml version="1.0" encoding="utf-8" ?>
<resources>
    <!-- your tracking ID-->
    <string name="ga_trackingId">UA-XXXX-Y</string>

    <!--Enable automatic activity tracking-->
    <bool name="ga_autoActivityTracking">true</bool>

    <!--Enable automatic exception tracking-->
    <bool name="ga_reportUncaughtExceptions">true</bool>
</resources>
Lint 先生が怒るので以下のように記述する。ハイフンをエンコードしてはいけない。
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="TypographyDashes">
その他の設定値は Google Analytics SDK for Android v2 - EasyTracker Parameters を参照のこと。

Congratulations! Your app is now setup to send data to Google Analytics.

これで設定は完了しました!おめでとう!
さらなる情報は Advanced Configuration - Android SDK や Dev Guide を読もう!

2013/06/03

[zsh]Gitのコマンドやブランチ名を補完できるようにする

zshでgitのコマンドやブランチ名を補完できるようにする - QNYP Blogを見て、
記事中の動画のブランチ名がターミナルに常に表示されているせいか
何故かブランチ名をターミナルに常に表示させる方法として記憶が刷り込まれて
設定完了するまで気が付かなかった @wada811 です。

とりあえず色々補完ができたら便利そうなので設定しました。
Mac に最初から Git 入っていたと思う(とりあえず HomeBrew でインストールした記憶はない)ので
補完定義ファイルをダウンロードして設定する方式で設定しました。

まずは ~/.zsh/completion/ に補完定義ファイルを入れるためのディレクトリを作成します。
mkdir -p ~/.zsh/completion/
次は以下の2つの補完定義ファイルをダウンロードしてきます。
cd ~/.zsh/completion/
curl -O https://raw.github.com/git/git/master/contrib/completion/git-completion.bash
curl -O https://raw.github.com/git/git/master/contrib/completion/git-completion.zsh
curl -Oでリモートファイルをローカルファイルに書き込み保存してくれるらしい。Output か。
git-completion.zsh を _git にリネームする。
mv git-completion.zsh _git
以下のような構造になっていれば良いらしい。
tree ~/.zsh/completion
/Users/wada/.zsh/completion
├── _git
└── git-completion.bash

0 directories, 2 files
と、tree とか出てきて、なにこれ便利!いいな!と思ったらbrew install treeで使えるようになります。
あとは、vi ~/.zshrcで以下のように記述してsource ~/.zshrcする。
fpath=(~/.zsh/completion $fpath)

autoload -U compinit
compinit -u
rm -f ~/.zcompdump; compinitもした方が良いらしい。

ブランチ名の補完が効くようになったので今度はブランチ名を常に表示させる設定をしたい。

2013/06/02

[SublimeText]ステータスバーに改行コードを表示する

久々の Sublime Text 2 についての記事です。
Chrome のタブがタスクな僕は ST2 についてのページがタブに溜まっていたのだけど
Chrome を一回閉じなくてはいけなくなったので Twitter のお気に入りに退避したら
見事に開かなくなった系男子です。

今回は前から思っていた Sublime Text 2 で改行コードが確認できない、
変更できない(←調べてないだけ)問題を解決する記事が流れてきていたので
参考にしてパッケージを入れて解決しました。
参考: Sublime Text 2 でステータスバーに改行コードを表示する // understandard

titoBouzout/LineEndings · GitHubPackage Control でインストールするだけ。
これだけで以下のことができる。
  • ステータスバーに改行コードを表示する
  • コマンドパレットから改行コードを変更する
  • ステータスバーのタブサイズのメニューから改行コードを変更する
  • 想定しない改行コードだった時にアラートを表示する
  • 現在のウインドウのすべてのビューについてインデントをスペースかタブに変更する
  • 現在のウインドウのすべてのビューについて改行コードを変更する
  • ファイルを開いた際に自動で改行コードを変更する(※保存はしない)

便利ですね。

2013/06/01

[Eclipse][設定]Eclipse JunoでCode Templateの$userを変更する

開発中のアプリのコードを公開しようか迷っているけど
どっちにしろライセンスは全てのファイルに記述しようと思い立ったので
Android開発を行う際の eclipse の便利設定 | zaki日記を参考に
Code Template を設定することにした。

ところで1記事の中に複数の項目について記述する場合は
id つけてもらえるとリンクしやすいので id つけて欲しいなーと思ったり。
自分も忘れがちだから気をつけなきゃいけないけど、id あると紹介しやすいんだよねー。

ということで以下のライセンスを指定した。
/*
 * Copyright ${year} ${user}<メールアドレス>
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
自動的に${year}が今年の西暦を入れてくれて、${user}がユーザー名を入れてくれる。

本題はココから。

${user}がどこを参照したのか wada にしてくれちゃうので wada811 にしたい僕は困ったという話。
まず、eclipse.ini の起動時引数に以下で指定すれば良いというのは分かった。
-Duser.name=UserName
JavaDocの@authorで補完される名前を変更したい:おぼえがき:So-net blog
で、その肝心の eclipse.ini はどこかというと Mac なら以下にある。
[Eclipse HOME]/Eclipse.app/Contents/MacOS/eclipse.ini
参考: Steppin' out: Mac (Lion) で Eclipse 4.2 Juno を日本語化
ついでに-cleanも指定して保存して Eclipse を再起動すれば $user が指定のユーザー名になる。
ちなみに Code Templates の設定の Automatically add comments for new methods and types に
チェックを入れないとファイル新規作成時にライセンスが自動挿入されないので注意。