UbuntuではAndroidのためにAplication Frame ewarks層を実現し、ハードウェアアクセスサービスを追加します。


デジタル科学技術が日進月歩する今日では、ソフトとハードの完璧な組み合わせが、スマートフォンの流行を生み出している。今日みんなはiOSとAndroidシステムに興味を持っています。この二つのシステムには多彩なアプリケーションがあるからです。したがって、ソフトウェアとハードウェアの関係は、ある程度、ハードウェアはソフトウェアのためのサービスであると言えます。ハードウェアエンジニアが開発したハードウェア設備は、もちろんソフトウェアエンジニアが少なくなりました。ドライバの最終目的は、最上層のアプリケーションがこれらのハードウェアで提供されるサービスを利用してユーザにソフトウェア機能を提供することができるようにするためである。Androidシステム上のアプリケーションにとっては、システムのAppleication Fraamewarks層でハードウェアサービスを提供するということです。前のいくつかの記事では、Linuxカーネル層、ハードウェア抽象層、および実行時ライブラリ層によって提供されるカスタムハードウェアサービスインターフェースを重点的に紹介しました。これらのインターフェースはいずれもCまたはC+言語によって実現されます。この記事では、JavaインターフェースのハードウェアサービスをAndroidシステムのAppplication Fraamewarks層で提供する方法を紹介します。
  一.Ubuntu Android HAL編纂JNI方法提供JAVAアクセスハードウェアサービスインターフェースに示されているハードウェア抽象層モジュールのためのJNIメソッド呼び出し層を準備する。
  二.Androidシステムでは、ハードウェアサービスは一般的に独立したプロセスで実行され、様々なアプリケーションにサービスを提供する。したがって、これらのハードウェアサービスを起動するアプリケーションとこれらのハードウェアサービスとの間の通信は、エージェントによって行われる必要がある。そのためには、まず通信インタフェースを定義します。fram eworks/base/core/java/android/osディレクトリに入り、IHello Service.aidlインターフェース定義ファイルを追加します。
      USER-NAME@MACHINE-NAME:~/Android$cd fram eworks/base/core/java/android/os
      USER-NAME@MACHINE-NAME:~/Android/frame ewarks/base/core/java/android/os/vi IHello Service.aidl
      IHello Service.aidlはIHello Serviceインターフェースを定義しています。

package android.os; 
 
interface IHelloService { 
 void setVal(int val); 
 int getVal(); 
} 
 IHelloServiceインターフェースは、主にデバイスとハードウェアレジスタvalの値を取得する機能を提供し、それぞれsetValとgetValの2つの関数で実現される。
三.フレームワーク/baseディレクトリに戻り、Android.mkファイルを開いてLOCAL_を修正する。SRC_FILES変数の値は、IHello Service.aidlソースファイルを追加します。

## READ ME: ########################################################

 ##

 ## When updating this list of aidl files, consider if that aidl is

 ## part of the SDK API. If it is, also add it to the list below that

 ## is preprocessed and distributed with the SDK. This list should

 ## not contain any aidl files for parcelables, but the one below should

 ## if you intend for 3rd parties to be able to send those objects

 ## across process boundaries.

 ##

 ## READ ME: ########################################################

 LOCAL_SRC_FILES += /

 ....................................................................

 core/java/android/os/IVibratorService.aidl /

 core/java/android/os/IHelloService.aidl /

 core/java/android/service/urlrenderer/IUrlRendererService.aidl /

 .....................................................................
  四.IHello Service.aidlインターフェースをコンパイルする:
    USER-NAME@MACHINE-NAME:~/Android$mmm frame ewarks/base
   このように、IHello Service.aidlによって対応するIHello Service.Stubインターフェースが生成される。
   五.frame eworks/base/services/java/com/android/serverディレクトリに入り、Hello Service.javaファイルを追加します。

package com.android.server; 
import android.content.Context; 
import android.os.IHelloService; 
import android.util.Slog; 
public class HelloService extends IHelloService.Stub { 
 private static final String TAG = "HelloService"; 
 HelloService() { 
 init_native(); 
 } 
 public void setVal(int val) { 
 setVal_native(val); 
 } 
 public int getVal() { 
 return getVal_native(); 
 } 
 
 private static native boolean init_native(); 
 private static native void setVal_native(int val); 
 private static native int getVal_native(); 
}; 
 ハローサービスは主にJNIメソッドinit_を呼び出します。native、setVal_nativeとgetVal_native(Ubuntu Android HAL編纂JNI方法提供JAVAアクセスハードウェアサービスインターフェース文で参照)は、ハードウェアサービスを提供する。
     六.同じディレクトリのSystem Server.javaファイルを修正し、Server Thread:run関数にHello Serviceをロードするコードを追加します。

 @Override

 public void run() {

 ....................................................................................

 try {

  Slog.i(TAG, "DiskStats Service");

  ServiceManager.addService("diskstats", new DiskStatsService(context));

 } catch (Throwable e) {

  Slog.e(TAG, "Failure starting DiskStats Service", e);

 }

 try {

  Slog.i(TAG, "Hello Service");

  ServiceManager.addService("hello", new HelloService());

 } catch (Throwable e) {

  Slog.e(TAG, "Failure starting Hello Service", e);

 }

 ......................................................................................

 } 
   七.ハローサービスをコンパイルし、system.imgを再包装する:
     USER-NAME@MACHINE-NAME:~/Androidドルmmm fram ewarks/base/services/java
     USER-NAME@MACHINE-NAME:~/Android$make snod
     このように、再包装されたsystem.imgシステムのミラーファイルは、Appplication Fraameweorks層に私達がカスタマイズしたハードウェアサービスHello Serviceを含んでいます。そしてシステムが起動する時、自動的にHelloServiceをロードします。この時、アプリケーションはJavaインターフェースを通じてハローハードウェアサービスにアクセスできます。次の文章では、Javaアプリケーションの作成方法を説明します。このHelloServiceインターフェースを呼び出してハードウェアにアクセスすることを期待してください。
 以上はAndroid Application Fraamewarks層のハードウェアへのアクセスを増やすサービスの実現方法です。引き続き関連知識を補充します。ありがとうございます。