2014年2月10日月曜日

IntelliJ + GraldeでAndroidの開発環境をつくる

普段はEclipseを使って開発してるけど、
便利なようなので使ってみた。目標はHello worldをつくるところまで。

IntelliJインストール

Android開発なら無料版で十分。下サイトのDownload Communityからダウンロード。
http://www.jetbrains.com/idea/

Gradleインストール

gvmを使うと簡単にインストールできる。
$ gvm list gradle
でバージョンを調べて、最新をインストール。今回は1.10 => 1.9
$ gvm install gradle 1.9
1.10だと後ではまる(後述)。IntelliJのせいか、Gradle 1.10のバグかは不明だが、現状、1.10を使うとビルドがうまくいかないようだ。1.9を使うべし。 下でいくつかはまりポイントがあるが、最初から1.9を使っておけば通らないかも。

その他

Androidをビルドするために必要なもの。
  • Android SDKをこの辺りからダウンロード。
    http://developer.android.com/sdk/index.html?utm_source=weibolife
    http://developer.android.com/tools/sdk/tools-notes.html
これでひとまず準備OK

IntelliJを起動&設定

Androidプロジェクトを新規で生成する。Files > New Project...で、Gradle: Android Moduleを選択。プロジェクト名、アイコン、Activityの設定など、Eclipseと同じフローでプロジェクトが作られた。


# ちなみに、AndroidのApplication Moduleというのを選ぶと、Eclipseでやってたのと同じ(多分Antを使った)プロジェクトが生成される模様。こちらは簡単にビルド&実行で来た。
Finishまですると、すぐにビルド中のダイアログが出た。しばらく待つと作業Doneしたらしく、ダイアログ消えた。下がプロジェクト生成直後。Eclipseで作ってたAndroidプロジェクトとは大分ディレクトリ構成が違う。

とりあえず何も考えずにビルドしようとする。が、右上のRunマークがグレーアウトしてて押せない。その左のプルダウンからEdit configurations...を選択。+ボタン > Android Applicationを選んでConfigurationを追加。
適当に名前付けて(下の例ではGradleTest)、OKボタン。

これでビルドが出来るようになったので、Runボタンを押しておもむろにビルド。
すると以下のメッセージで怒られた。
SDKの設定ができてないようなので、Project右クリック > Open Module Settings...でProject Structureを開き、Projectタブを選択。ここの、Project SDK:のプルダウンでJDKを選択する(下ではJDK 1.7を選んだ)。

 さらに、Modulesタブ > Dependenciesで、Android API 19を選択。 > OKボタン

再度ビルドしてみる。今度は下のメッセージで怒られた。
Cannot find AndroidManifest.xml file for module GradleTestProject
AndroidManifest.xml自体はあるので、居場所を教えてあげる。
プロジェクト直下に{プロジェクト名}.imlというファイルがあるはず。ここの、<facet type="android" name="Android">タグに、<option name=MANIFEST_FILE_RELATIVE_PATH.../>を追加(下記)。
また、Local path doesn't exist.というエラーを避けるため、あらかじめapkがでk

    <facet type="android" name="Android">

      <configuration>

        <option name="ALLOW_USER_CONFIGURATION" value="false" />

        <option name="MANIFEST_FILE_RELATIVE_PATH" value="/GradleTestProject/src/main/AndroidManifest.xml" />

      </configuration>

    </facet>


これで再度ビルドしようとするが、まだ、
Default Activity not found
というエラーが出てる。今度はProject右クリック > Open Module Settings...を開き、Modulesタブ > Sourcesで、src/main/javaでSourcesを選択。


これでRunするとターゲットでバイス選択を求められ、いよいよ通ったか?と思ったが、次は以下のメッセージで怒られた。
ERROR: APK path is not specified for module "GradleTestProject"
このエラーは、下リンク当たりの情報から、*.imlと.idea/を消去して、再度プロジェクトをImportすると直りそうだ。
http://stackoverflow.com/questions/16722651/apk-path-is-not-specified-for-module-example-example
やってみると、Gradle locationの設定でつまずく。どうやら、Gradle 1.10だとうまく通らないらしい。ということで、1.10をやめて1.9をインストールしなおし。
$ gvm install gradle 1.9
デフォルトも1.9にしておく。 これで晴れてビルド通った&実行成功!

後書き:最初からGradle 1.9でやった場合

も、Module Not Foundとか言うエラーが出て一発では通らなかった。
Project Structure でJDK 1.7, Android SDK設定した後、
  1. 一旦プロジェクト閉じて、
  2. *.imlと.idea/を削除し
  3. File > Import Project ... から作ったプロジェクトを指定、
  4. 次の画面でGradleを指定
で、実行できるようになった。

2014年1月15日水曜日

apkを解凍してjavaコードまで持ってく

apk => jar => java

Androidアプリのリバースエンジニアリングの手法としては、apktookでsmaliを作るのが良く知られてるが、よりソースに近い状態にするのが以下の方法。

ルート化端末などを用いて、apkファイルを引っこ抜ける状態なのが前提。

d2j-dex2jar、jadというツールを使って、apkからjava(っぽい)ファイルを取り出す。
$ unzip hoge.apk
で解凍。classes.dexを得る。

$ d2j-dex2jar classes.dex
classes_dex2jar.jarができる。
$ unzip classes_dex2jar.jar
で、.classファイルがソースツリー状に大量にできる。
src/ディレクトリ用意して、以下コマンドでjavaファイルにできる。
$ jad -d src/ -s java -r **/*.class
これで、難読化してないと普通に読めちゃう。