カテゴリー別アーカイブ: Android開発

Android/gradle: ビルドの時にdexDebugが失敗する


IntelliJにて、Androidアプリのgradleプロジェクトを新しく作成し、いくつかの外部ライブラリを使用してビルドを試みたところ、dexDebugなるタスクが失敗して困ったのでメモしておきます。

ビルドを実行すると以下のようなエラーとなります。

ThingsToDoはモジュール名です。

“dexDebug failed”で検索するといくつか情報があるようですが状況によって対策が異なるようで、私の場合は以下の方法で解決出来ました。

原因を深く追っていないのでいい加減な対応なのかもしれませんが、ひとまずビルドは通りました。

新たな問題:あり得ない場所でNoClassDefFoundError

multi-dexを有効にした副作用のようですが、enumをswitch文で分岐する場所で上記例外が発生しました。追ってみるとStack Overflowにそれらしきトピックがあり、試してみました。

build.gradleのdependenciesに以下を追記します。

そして、Applicationクラスの派生元をMultiDexApplicationに変更します。

今度こそうまくいったようです。

Android Studio / gradle: 既存のモジュールをプロジェクトに追加する


私はIntelliJのAndroidプラグインで開発していますが、Android Studioも同様だと思います。

まず、Androidアプリのgradleプロジェクトを作成し、その後に別に作成したライブラリプロジェクトをモジュールとして追加したい場合があります。IDE上だけでは完結しないようなので手順をメモしておきます。

プロジェクト配下に、(ProjectRoot)/MoaiTools/MoaiToolsLibのような外部のgradleプロジェクトをチェックアウトしたとします。ここではMoaiToolsは事前に作成したAndroidライブラリプロジェクトです。

ProjectHierarchy

上記のMoaiToolsLibの部分が取り込みたいモジュールになります。

IDE上でFile>New>Module from Existing Sources…を選択し、MoaiToolsを取り込みます。それから、File>Project Structureにて本体アプリのDependencyに追加します。

Project_Structure

 

すると、IDE上はリンクされるのですが、Build>Make Projectなどを実行するとパッケージが存在しないなどのエラーとなります。これは、IDEの依存関係とAndroid gradleプロジェクト設定が同期されていないためです。

手動でgradleファイルも修正が必要です。

(Project Root)/settings.gradleにプロジェクトを追加します。

‘:MoaiTools:MoaiToolsLib’の部分が追加となります。パスをコロンで区切って指定します。

それから、本体アプリのbuild.gradleも修正します。

 

以上でライブラリの取り込みは完了です。

私はライブラリプロジェクトをgitのsubmoduleとして他のアプリからも参照できるようにしています。

Android: spyを使用したJUnitを実行するとabstract method not implementedと言われる


Androidの単体テストでmockitoを使用していると、spyしたオブジェクトのメソッド呼び出しでjava.lang.AbstractMethodError: abstract method not implementedというエラーが発生します。これはmockitoのバージョンを変更すると解決するようです。

build.gradleのdependencyにて以下のようにmockitoの1.9.5を使用するよう修正してテストが通ることを確認しました。

[Android] 独自のボタンスタイルを定義する


Androidアプリの開発において、きめ細かなUIを提供するためには独自のルックアンドフィールを持つUI部品の提供は欠かせません。もちろん、OSが提供する標準部品を活用することは前提ですが、Androidではあまり幅広い要件をカバーできるようなUI部品の提供が行われていないのも現実です。

今回はボタン(android.widget.Button)の見た目をカスタマイズする方法をメモします。

準備するもの

  • 通常、フォーカス、クリック時の画像
  • 画像のセレクタ (res/drawable/hoge_selector.xml)
  • ボタンのスタイル (res/values/styles.xml など)
  • そしてスタイルを適用するボタン自身
順に見ていきます。
通常、フォーカス、クリック時の画像。9patchを使用して伸縮しても見た目が悪くならないよう調整しておきます。フォーカス時の画像は、フォーカスが当たっている間表示されますので、それなりに見やすい色になるよう配慮します。クリック時の画像はタップしたときの一瞬しか表示されないので派手めにしたほうが分かりやすいでしょう。
画像のセレクタは、ボタンの各状態ごとに使用する画像を定義します。以下のように作成します。
[res/drawable/flat_button_selector.xml]

ボタンのスタイルは、スタイルを適用するボタンのstyleプロパティで参照します。スタイルは以下のように作成します。

[res/values/styles.xml]

ここまで準備できたら、実際のレイアウトファイルに適用してみます。貼りつけたボタンのプロパティ”style”を設定するとプレビューの見た目も変わります。

そして、実行。
device-2011-07-30-195926

EditTextにカスタムInputFilterを適用して入力値の制限を行う


EditTextで入力できる文字の種類や書式を制限したい場合、android:inputType属性を使用すれば大抵の場合は用が足ります。(ちなみにinputTypeの種類についてはこちらに便利な情報がまとまっています)。inputTypeで実現できないような入力制限を行いたい場合にはInputFilterを使用します。

今回、時刻入力フィールドにての入力は0〜59とする、といった制限が必要になったので、ちょっと調べてみました。

以下のようなEditTextを例にとって説明します。

そして、InputFilterを以下のように実装します。

そして、EditTextにフィルタを設定してあげます。

ちなみにこんな感じの画面で使っています。

Linux上のEclipse+ADTでプロパティが編集できない問題の対処法


私は主にUbuntu環境でAndroidアプリを開発しています。

しかし、Linux(GNOME)版Eclipseにはバグがあるらしく、プロパティエディタで[…]というボタンがマウスクリックに反応しないために手書きでプロパティを記入する必要があります。画面数の多いアプリを開発する際には作業効率に大変な影響を及ぼすため、日々ストレスを感じていました。(この問題だけのためにWindows環境への移行を何度も検討しました)

本日この問題を解決する手順がわかったので、ここにメモしたいと思います。手順は醜いですが簡単です。

プロパティ編集画面

編集したいプロパティをクリックしてから、Tab→Spaceの順にキー操作するとダイアログがポップアップします。

ネタ元: Stack Overflow

AndroidアプリをProGuardで難読化する


Android Marketでアプリを公開するにあたって、逆コンパイルなどによるプログラムの解読を防ぎたい場合があります。その目的としては、ライセンス認証やセキュリティに関わる処理の内容を第三者に知られにくくしたいといった場合や、一部ジャンルのゲームなどのようにプログラムの解析によって著しくコンテンツの価値が下がってしまう場合の対応策として利用することなどが考えられます。

Androidアプリを難読化するためのツールとしてはProGuardが利用できます。これは最新のAndroid SDKには含まれていますので、現時点でアプリを公開している方は簡単に導入することができます。

ProGuardに関するAndroid Developers公式サイトのドキュメントはhttp://developer.android.com/guide/developing/tools/proguard.htmlです。

手順を要約すると以下のようになります。

ProGuardを有効にする

プロジェクトルートにProGuardの挙動を設定するためのproguard.cfgを作成します。最新のSDKで新規プロジェクトを作成すると自動的に作成されます。

デフォルトの proguard.cfg の内容:

そしてプロジェクトのルートディレクトリに、ant.propertiesを以下の内容で作成します。(以前はdefault.propertiesでしたがAndroid SDK r14から変更となりました)

準備ができたら、ant releaseまたは、eclipseによるエクスポートウィザードでリリースを行うと自動的に難読化が適用されます。デバッグビルドの場合は難読化は行われず、通常のビルドが行われます。

antビルドの場合はout.dirのディレクトリの下のproguard、そしてeclipseの場合はプロジェクトルート直下のproguardディレクトリに難読化処理の結果が保存されます。保存された内容は、アプリの強制終了などのときにユーザーからレポートされるスタックトレースの解析に利用しますので、リリースの都度保管しておく必要があります。