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

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


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

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

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

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

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

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

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

 

まずAndroidアプリ作成の基本

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

androidsdk

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

 

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

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

[java]
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);
}

}
[/java]

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

androidsdk2

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

 

新しいクラスを作る

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

androidsdk3

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

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

[java]
DeviceInfo deviceinfo = new DeviceInfo();
HashMap map = deviceinfo.collect();
[/java]

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ファイル書き出し

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

[shell]
$ pwd
/Users/taisuke/AndroidStudioProjects/DeviceSDK
[/shell]

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

[shell]
$ ./gradlew mylibrary:clean mylibrary:assembleDebug mylibrary:makeJar
[/shell]

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

[shell]
$ ls mylibrary/release/
deviceinfo_sdk-1.0.jar
[/shell]

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

SDKを使ってみる

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

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

androidsdk8

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

androidsdk9

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

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

[java]
DeviceInfo deviceinfo = new DeviceInfo();
HashMap map = deviceinfo.collect();
[/java]

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

まとめ

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

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


DACエンジニア採用情報

  関連記事

no image
Polymer on Rails

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

(社内新卒・PHPビギナー向け)MacでPHP7開発環境を構築しよう!

はじめに みなさんこんにちは、プロダクト開発本部の亀梨です。 普段はXmediaOneというメディアプランニング・広告運用管理・トラッキング・マーケティング分析を行う 統合プラットフォームの開発を担当しています。 えっ!?新卒のプログラミング研修はPHPで行われるって?!俺の得意言語やないか!! は …

no image
【小ネタ】Javascriptのconsoleオブジェクトをもっと便利に使う方法

すごく便利なconsoleオブジェクトですが、ブラウザによってサポートされているメソッドが なかったり、そもそもconsoleオブジェクトが使えなかったりと、たまに不便だったりします。 そんなときによく使う便利なコード。 [code language=”javascript” …

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

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

PyStanによるはじめてのマルコフ連鎖モンテカルロ法

はじめに こんにちは。システム開発部の中村です。 社内で行っている『データ解析のための統計モデリング入門』(所謂緑本)の輪読会に参加した所、 大変わかりやすい本だったものの、Macユーザには悲しい事に実装サンプルがWinBUGSだったため、 9章の一般化線形モデルのベイズ推定によるアプローチをPyt …

Scala入門 準備編「開発環境構築」 – PHP使いからScala使いへ転身!

  はじめに みなさんこんにちは、今月入社しましたプロダクト開発本部の亀梨です。 普段はXmediaOneというメディアプランニング・広告運用管理・トラッキング・マーケティング分析を行う 統合プラットフォームの開発を担当しています。 XmediaOneの開発で採用しているプログラム言語はS …

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

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

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

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

【未経験からのRuby on Rails – 第2回】Rubyのプログラムを書いてみる(Mac)

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

プログラミング初心者がswiftでゲームアプリ的なものを作ってみた。

こんにちは、DAC2年目のkumataです。 普段は素敵な先輩方に囲まれてインフラ周りのお仕事をさせて頂いていますが、 今回は業務とは全く関係ないプログラミングをやってみました。 全く初心者なのですが、swift+Xcodeで簡単にスマホゲーム的なものが作れました。 初心者の目線から作成方法をつらつ …