優々自適

2012-05-15

[][]ADTでもmavenでもローカルでビルドできるようにするメモ

なぜかというと、ADTじゃないとデバッグ実行できなかったから。
ちなみにADTのバージョンは18。これ超重要。バージョン違うとなんかぜんぜん変わる。

両方でビルドできるようなプロジェクト構成にしておく。
着地したプロジェクト構成はこんな感じ
f:id:fuzzy31u:20120515131622p:image

各々で違うところだけ

mavenなのでsrc/main/hogeってする必要がある
・jniを使うのでsrc/main/nativeに.soファイルを置いて、pomにnativeLibraryはこっちを見てねって書いておく

・nativeLibraryはlibs配下を見るのでこっちにも.soファイルを置いておく
ビルドパスはlibs配下のを自動で見るのでpomのcopy-dependenciesプラグインでlibs配下にコピーする記述を書く
・あとはADTバージョンアップのせいだけどADTをバージョンアップしたら実行できなくなった苦戦記 - 優々自適とかですかね


mavenADTは相性が悪いらしい。
ほんっと複合的にいろんな要素が絡み合ってエラー要因の切り分けが大変だった。

2012-05-01

[][]新規mavenプロジェクト作って既存ソースを移行したメモ

  • 作成

新規→Mavenプロジェクト→アーキタイプの追加で以下を追加
 アーキタイプ・グループID: de.akquinet.android.archetypes
 アーキタイプ・アーティファクトID: android-quickstart
 アーキタイプ・バージョン: 1.0.7

プロジェクトの情報を入力
 グループ名:
 アーティファクト名:
 バージョン:1.0.0
 パッケージ:パッケージ名

  • 実行してみる
$ mvn install

この文字は、エンコーディング SJIS にマップできません。
エラーが出たら…

            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                    <encoding>UTF-8</encoding> ←
                </configuration>
            </plugin>

をpom.xmlに追記。
「この文字は、エンコーディング MS932 にマップできません。」のエラー解消方法 - jxpowerの日記


de.android.comまわりでOOMエラーが出たら…

     <dex>
       <jvmArgument>-Xms256m</jvmArgument>
       <jvmArgument>-Xmx512m</jvmArgument>
     </dex>

をpom.xmlに追記。
Mavenでプロジェクト作成(Eclipse) - BlackSheep Wiki

  • 実行はできたけどNative Libraryを使ってる場合はもう少し工夫が必要

${project.basedir}/libs
配下にarmeabi/libXXX.soがある場合、

<nativeLibrariesDirectory>${project.basedir}/src/main/native</nativeLibrariesDirectory>

この部分をコメントアウトする。
この記述がない場合はデフォで{project}/libsを見るらしい。

または
${project.basedir}/src/main/native
配下にnative libraryを置くか。どっちか。

  • すべてうまくいったら
$ mvn clean install android:deploy android:run

をひたすら実行。

2012-04-26

[]ADTをバージョンアップしたら実行できなくなった苦戦記

ADTをver18にアップデートしました。
そしたらビルドはぱっと見通ってるもののアプリの実行時にClassNotFoundが止まりません。
classes.dexファイルを解凍してみるものの…確かにsrc配下のclassたちが一式いない。res配下だけがいる様子。

そこでやったこと。&初めて知ったこと。

  • libs配下に置いてあるjarは自動的にビルドパスに通るようになったらしいので手動で通すのはやめた
  • 「Conversion to Dalvik format failed with error 1」が出るのでCREADOR GRANOESTE: Conversion to Dalvik format failed with error 1の方法で解決(いろんなケースがあるみたいですが私の場合はこれでした)
  • 「Conversion to Dalvik format failed with error 1」で他にも理由があったので。proguard.cfgがなかったので持ってきたら実行できた

ここまで派手に仕様変わるとは…リリースノートはちゃんと見ときましょうorz
ADT Plugin for Eclipse | Android Developers



■追記■
さらにClassNotFoundが続くことがあったので
穀風: Android SDK Tools を Rev. 17 にしたら Class Not Found Exception が発生するようになった
これにて解決。

■追記の追記■
もはや過程は忘れたけど「Conversion to Dalvik format failed with error 1」が出る別の要因。
ビルドパスにmavenライブラリを通さないこと。mavenとADTは相性悪いよ!

2012-04-24

[]port installしたコマンドで上書きするメモ

デフォmavenMacPortsで新しく上書きしたのでメモ。

$ sudo port install maven3

こんなのが出てきたので

To make maven 3.0.4 the default, please run
	sudo port select --set maven maven3

言われるがまま

$ sudo port select --set maven maven3
$ mvn3 -v
Apache Maven 3.0.4 (r1232337; 2012-01-17 17:44:56+0900)
Maven home: /opt/local/share/java/maven3
Java version: 1.6.0_29, vendor: Apple Inc.
Java home: /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
Default locale: ja_JP, platform encoding: SJIS
OS name: "mac os x", version: "10.6.8", arch: "x86_64", family: "mac"

ちゃんと変わってました。

port(1) - MacPorts-JP
より

select
適切なシンボリックリンクを作成することで、与えられた group に対する、デフォルトとなる version を選択します。具体的にいうと、python を python2.6 へのリンクとするなどです。利用可能な select のグループは ${prefix}/etc/select/ のサブディレクトリとしてインストールされます。グループにおける利用可能なバージョンを一覧表示させるには --list を使ってください。グループに対して現在どのバージョンが選択されているかを知るには --show を使います。選択済みのバージョンを変更するには --set を使って下さい。
たとえば次のようにします。
port select --list python
port select --show gcc
port select --set gcc mp-gcc44

2011-11-25

commons httpclient3.1でBasic認証

httpclient3.1以上にて、ググって出てくるBasic認証突破術をそのまま書くとDeprecatedになってしまうようです。

HttpClient client = new HttpClient();
UsernamePasswordCredentials credentials = new UsernamePasswordCredentials("user", "password");
client.getState().setCredentials(null, null, credentials);
GetMethod method = new GetMethod(url);
method.setDoAuthentication(true);

これは3.0系まで。

3.1でDeprecatedされないためにはこう書く。

HttpClient client = new HttpClient();
PostMethod method = new PostMethod(url);
client.getState().setCredentials(
		new AuthScope("domain", 80, "realm"),
		new UsernamePasswordCredentials("user", "pass"));
method.setDoAuthentication(true);
int statusCode = client.executeMethod(method);

BasicScheme (HttpClient 3.1 API)

RFC2617で策定された仕様にのっとったようだ。