SDKってどうやって作ってるの?【Android編】

     - プログラム言語 , , , ,  


こんにちは。4度目の投稿です。

現在私はAndroidのSDKを開発しています。
javaにもAndroidにもSDKにも手を出したのは初めてなので、最初はそもそもSDKのイメージが湧かず、ふわふわした状態で始めました。

SDKと調べても「あるソフトウェアを開発するために必要なプログラムや文書などをひとまとめにしたパッケージ。ソフトウェア開発キット」

って出てきて、キットって何?色んな道具でも詰まってんの?という感じでした。
今聞くと理解できますが、こういうのは実際に目で見てやっとわかるものですよね。

ということで、私のように

  • SDKってそもそも何?
  • AndroidでSDKってどうやって開発してるんだろう?

という疑問をお持ちの方に、次回 “SDK” という単語を聞いてパッとイメージが湧くことを祈って書きます。

 

まずAndroidアプリ作成の基本

まずAndroidStudioを起動して新規プロジェクトを作成した時にできるファイルを説明します。
特に重要でよくいじるファイルは以下の3つです。

androidsdk

今回はこの②MainActivityに端末情報を取得する処理を書いていき、最終的には端末情報取得SDKを作ってみます。

 

端末情報取得メソッド作成

端末情報の取得はandroid.os.Buildというライブラリをimportすることで簡単に取得できます。
以下のように書きます。

package edu.self.devicesdk;

import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

//端末情報を変数に入れる
String carrier = Build.BRAND; //キャリア
String device = Build.DEVICE; //デバイス
String manufacturer = Build.MANUFACTURER; //製造会社
String model = Build.MODEL; //モデル
String version = Build.VERSION.RELEASE; //OSバージョン

//変数をログに書き出す
Log.d("DEVICEINFO", "キャリア  :" + carrier);
Log.d("DEVICEINFO", "デバイス  :" + device);
Log.d("DEVICEINFO", "製造会社  :" + manufacturer);
Log.d("DEVICEINFO", "モデル   :" + model);
Log.d("DEVICEINFO", "OSバージョン:" + version);
}

}

実際にビルドすると以下のように取得した端末情報が書き出されます。

androidsdk2

このようにして処理を追加していくのですが、MainActivityに全ての処理を書いていると
非常に見にくく、管理しにくいので、別のクラスに分けます。

 

新しいクラスを作る

先ほどMainActivityに書いた端末情報取得処理を、新しいjavaファイルを作成してDeviceInfoクラスの中に移します。

androidsdk3

MainActivityでは新しく追加したDeviceInfoクラスのインスタンスを作成して利用します。

DeviceInfoクラスのcollectメソッドを実行すると戻り値が連想配列で返ってくるようにしたので、MainActivityに以下のように書きます。

        DeviceInfo deviceinfo = new DeviceInfo();
        HashMap map = deviceinfo.collect();

2行で端末情報が取得できるようになりました。

少し前置きが長くなりましたが、ここからSDK作成に移ります。

 

javaファイルをSDK化する

端末情報取得処理をDeviceInfo.javaファイルに分けて書くことができました。
このjavaファイルを誰でも使えるように、SDKとして出力したいと思います。

手順1. 新しいモジュールを作る

File > New > NewModuleを選択

androidsdk4

Choose Module Typeで「Android Library」を選択してNextをクリック。
その後はそのままNext、Next、Finish

androidsdk5

手順2. 作ったモジュール内にSDK化したいクラスを入れる

新しくmylibraryというモジュールが追加されたと思います。
mylibraryモジュール内のjavaディレクトリに、先ほど作ったDeviceInfo.javaファイルをコピーします。
ここにコピーされたファイルがSDKになります。

androidsdk6

手順3. jarファイルの書き出し設定

AndroidのSDKはjarファイルとして出力します。
jarファイルとして書き出すためにはbuild.gradle(Module: mylibrary)に出力のための設定を書く必要があります。

androidsdk7

手順4. ターミナルでjarファイル書き出し

ターミナルから対象プロジェクト直下のディレクトリに移動します。

$ pwd
/Users/taisuke/AndroidStudioProjects/DeviceSDK

そこで以下のコマンドを打ち、jarファイルを生成します。

$ ./gradlew mylibrary:clean mylibrary:assembleDebug mylibrary:makeJar

BUILD SUCCESSFULが出れば成功です!
mylibraryの下のreleaseの下にjarファイルができていることが確認できると思います。

$ ls mylibrary/release/
deviceinfo_sdk-1.0.jar

これでjarファイルの出力、つまりSDKを作成することができました!

SDKを使ってみる

先ほど作ったjarファイルを使って端末情報を取得してみます。
新しいプロジェクトを新規作成します。

SDKはlibsディレクトリに入れて使うのですが、初期状態では表示されていないので、
下記のようにプルダウンからProjectを選択して、libsディレクトリを表示します。

androidsdk8

そして先ほど作ったjarファイルをlibsディレクトリにコピペします。
※ドラッグすると元ファイルが消えてしまうので、コピペをオススメします。

androidsdk9

SDKをlibsディレクトリに入れたら、jarファイルを選択した状態で右クリック>Add as Libraryで、build.gradleに追加され、使用可能状態になります。

これで先ほど「新しいクラスを作る」でやったように

        DeviceInfo deviceinfo = new DeviceInfo();
        HashMap map = deviceinfo.collect();

とすれば、SDKの中にあるクラスを使うことができます。

まとめ

長くなりましたが、今回やった作業を簡単にまとめると、
「あるプロジェクト(アプリ)で作ったクラスを、別のプロジェクト(アプリ)でも使えるようにした」
ということになります。
今回は一つのjavaファイルしか作ってませんが、実際は複数のjavaファイルをまとめて(パッケージ化して)SDKを作成します。

あくまで今回は、AndroidにおけるSDK作成ですが、なんとなく最初に書いたSDKの定義に出てきた、”パッケージ”とか”開発キット”みたいな用語を理解して頂けたら幸いです。


DACエンジニア採用情報

  関連記事

no image
Polymer on Rails

Web Componentsをご存知だろうか。これが普及すればWebの開発は画期的に変わるだろう。 説明すると長くなるので、LIGさんのにその辺はお任せして。(この記事読んでください。) 簡単に言えば、下記にあるような新たに提案されたブラウザ向けAPIの総称。 Custom Elements, 説明 …

index
Android 非同期処理についてまとめてみた

Androidには、UIに影響を与えないよういくつか非同期処理が用意されています。 今回は非同期処理の代表的な ・Service ・IntentService ・HandlerThread について違いを踏まえながらまとめます! 非同期処理について(http://codezine.jp/articl …

curry
【小ネタ】JSで要素の組み合わせを列挙する

下記のような、キーの数や要素数が可変のデータの組み合わせを、列挙するjavascriptコードです。 pythonにはitertoolなどの順列・組み合わせ計算を行う定番ライブラリがあるようです。 やっている事ですが、イメージとしては組み合わせを数列に置き換えています。 1桁目が2進数、3桁目が3進 …

no image
Angular.jsのvalueとfactoryの違いを考える

次のようなHTMLがあったとする。 valueとfactoryの違いを考える valueもfactoryもcontrollerから利用する値やfunctionを登録しておくのに使う。そのようなcontrollerの外部に登録されているfunction等をサービスと呼ぶ。たとえば、下記のようにplus …

tf
ディープラーニングで「顔が似ているAKB48のメンバーを教えてくれるbot」を構築

概要 こんにちは、システム開発部の中村です。 今回は、Facebook Messenger APIを利用して、 画像をアップロードすると、似ているAKB48のメンバーを教えてくれるbotを実装しました。 尚、ディープラーニングやTensorFlowそのものの解説というより、 「エンジンとしてディープ …

スクリーンショット 2015-07-31 16.38.02
【未経験からのRuby on Rails – 第2回】Rubyのプログラムを書いてみる(Mac)

こんにちは。新卒1年目のmatsuariです。 前回はRubyとは何か、簡単にご紹介をしましたが、 今回は実際にRubyファイルを作成して、プログラムを書いてみるところまでご紹介していけたらと思います。 Mac環境のプログラミング初心者向けです。 はじめに、Rubyのプログラムを書くためのファイルを …

promise
ECMAScript6を使ってみた ~「Promise」編

ECMAScript6とは 一応ちょっとだけ説明しておくと、 ECMAScript(エクマスクリプト)は、Ecma Internationalによって標準化されたスクリプト言語で、バージョン6が2015 年 6 月 17 日に標準仕様として発行されました。(以下、ES6と呼びます) ES6ではcon …

ruby
Railsたった14行でアドサーバーAPIができた話

こんにちは。駆け出しエンジニアの近江です。 最近Railsにハマっているので、私が2年間担当しているアドサーバの、簡易版をRailsで作ってみました。 広告やキャンペーンを登録する管理画面はある前提で、ここからたった14行追加するだけでアドサーバーのHTTP APIを作りたいと思います。ついでに配信 …

shogi
ナイーブベイズで羽生さんと羽生くんを分類してみた

はじめに こんにちは。システム開発部の中村です。 機械学習についての理解を促進するため、 データから分類モデルを自動で構築する古典的な方法である、 ナイーブベイズ分類器を実装してみました。 最近はCloudVisionAPIなど専ら画像解析が流行っていますが、 自分のような初学者には敷居が高そうだっ …

no image
【未経験からのRuby on Rails – 第1回】楽しく書けるプログラミング言語 “Ruby” とは

こんにちは、はじめまして。新卒1年目のmatsuari(女子)です。 この度、Rubyの勉強を始めることになりまして、 まずはたくさんあるプログラミング言語の中で、なぜ自分がRubyを学ぶのか? しっかりと把握した上で学習に取り組んでいきたいと考え、『Rubyとは何か?』調べました。 超基礎的なこと …