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の基本的な使い方については下 …

no image
Polymer core-ajax の使い方

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

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

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

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

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

Selenium × PHP でテスト自動化!【環境構築編】

はじめに みなさんこんにちは、プロダクト開発本部の亀梨です。 普段はXmediaOneというメディアプランニング・広告運用管理・トラッキング・マーケティング分析を行う 統合プラットフォームの開発を担当しています。 テスト自動化の背景 わたくしが担当するXmediaOneでは品質担保のために①コードベ …

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

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

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

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

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

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

TypeScriptについてまとめてみた

はじめに JavaScript がとりあえずそのまま動くので、雰囲気で使ってしまいがちな TypeScript。初心者向けに基本的なことをまとめてみました。 TypeScript って何? TypeScript はマイクロソフトが開発したプログラミング言語で、オープンソースでメンテナンスされています …

Bootstrapのモーダル機能で多重表示する際に解決しなければならない2つの問題

はじめに みなさんこんにちは、プロダクト開発本部の亀梨です。 普段はXmediaOneというメディアプランニング・広告運用管理・トラッキング・マーケティング分析を行う 統合プラットフォームの開発・保守を担当しています。 エンジニアの皆さん、デザインってどうしてます? わたくしはプライベートでとあるW …