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
gulp.jsで広告タグの開発環境を整える

SEOの観点から、サイト表示速度の高速化のためJavaScriptファイルから不用な空白や改行、 コメントを除去したりやローカル変数名を短縮するminifyが奨励されていますが、 これはタスクランナーのgulp.jsとプラグインを使って自動化する事が可能です。 ※gulpの基本的な使い方については下 …

【未経験からのRuby on Rails – 第4回】Railsアプリケーション開発をしよう! 〜開発の準備編〜

こんにちは。新卒のmatsuariです。 Rubyについてまだまだ知るべきことはたくさんありますが、とにかく早くアプリを作りたい! ということで、今回はアプリ開発の準備に取り掛かっていきます。 Rubyはアプリを作成しながら、同時に学んでいきたいと思います。 Railsアプリケーション開発の準備《 …

no image
Polymer core-ajax の使い方

Polymerのcore-ajaxの使い方。 まずは、index.html [code language=”html” title=”index.html”] <!doctype html> <html> <head&gt …

no image
Polymer on Rails

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

読み方がわからない技術用語 2015

英語圏での読み方を基本的には参考にしています。英語圏でも複数の読み方をしているケースもあるようなので、あくまでも参考程度。2015と書きながら、古い言葉も混じってますが。 async – えーしんく Alt – おると ASUS – えいすーす bower &#8 …

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

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

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

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

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

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

【未経験からのRuby on Rails – 第3回】変数と定数

こんにちは。新卒1年目のmatsuariです。 今回はRubyに限らずプログラミングを学ぶ上で非常に重要となる「変数と定数」について、ご紹介していきます。 変数とは・・・ オブジェクトを一時的に格納しておく箱で、オブジェクトを識別するために利用します。 言葉だけでは理解が難しいかと思いますので、まず …

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

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