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エンジニア採用情報

  関連記事

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

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

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

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

初心者がRailsで開発 – deviseでユーザー認証設定 –

こんにちは、2年目のYukaです。 開発部所属でありながら実は、、 実際に自分で手を動かして開発する機会がなかなかありませんでした。。 しかしついに、、、 開発初心者がRailsでWebアプリの開発に挑戦します!! 今回のゴールは社内でも使用しているGoogleアカウントで簡単にログインができるよう …

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

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

D3.jsとその活用事例について

D3.jsとは? D3とは「Data Driven Document」の略で、データに基づいてドキュメントを操作するための JavaScript ライブラリです。 ご存知の方も多いと思いますが、ちょっとだけD3.jsの基本的な使い方、そして弊社プラットフォームでの利用についてご紹介したいと思います。 …

iOS端末情報をTreasureDataに送るアプリをswiftで作ってみた。

はじめまして、2年目のOyamanです。 通常業務とは別のことになりますが、Swiftに触れる機会が少しあったので、スマホ関連の記事を書かせていただきます。 はじめに SwiftとTreasureDataのSDKを使って、 iOSの端末情報をTreasureDataへ送るアプリを作ってみます。 今回 …

GoogleスプレッドシートからTreasureDataへデータを取り込む

AudienceOneの開発を担当しています。skryoです。 またまたTreasureDataネタですが、今回はGoogleスプレッドシートからGoogleAppsScriptを使ってTreasureDataへデータを取り込む手順を紹介したいと思います。 なぜ? Googleスプレッドシート上でマ …

Scala実践「Either型を使ってimmutable(不変)なコードを書こう!」

はじめに みなさんこんにちは、プロダクト開発本部の亀梨です。 普段はXmediaOneというメディアプランニング・広告運用管理・トラッキング・マーケティング分析を行う 統合プラットフォームの開発を担当しています。 Scalaでイケてるコードを書きたい! 背景 わたくしはDACに入社してからScala …

Scala番外編「Boxに保存したファイルをBox APIを使ってダウンロードしよう!」

はじめに みなさんこんにちは、プロダクト開発本部の亀梨です。 普段はXmediaOneというメディアプランニング・広告運用管理・トラッキング・マーケティング分析を行う 統合プラットフォームの開発を担当しています。 Box APIを使う背景・目的 DACはメディアレップです メディアレップとは、インタ …

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

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