UbuntuではAndroidシステムにC実行可能なプログラムテストLinuxカーネルドライバを内蔵しています。


前の記事では、UbuntuでAndroidシステムのためにLinuxカーネルドライバを作成する方法を紹介しました。このhelloという名前のLinuxカーネルドライバでは、3つの異なるファイルノードを作成してユーザ空間へのアクセスを行います。それぞれは、伝統的なデバイスファイル/dev/hello、procシステムファイル/proc/helloとdevfsシステム属性ファイル/sys/class/hello/hello/valです。さらに、ドライバの正確性を検証するために、catコマンドによって直接/proc/helloと/sys/class/hello/valファイルにアクセスする。この記事では、自分で作成したC実行プログラムを通じてデバイスファイル/dev/helloにアクセスします。読者は不思議に思うかもしれませんが、どうやってAndroidシステムの中でC言語でアプリケーションを作成できますか?AndroidシステムのアプリケーションはすべてJavaアプリケーションではないですか?実際には、読者は、adb shellコマンドでAndroidシミュレータに接続してもいいです。/system/binディレクトリの下で、多くのC実行可能プログラムが見られます。例えば、catコマンドです。今日は、AndroidシステムにC言語で作成した実行可能なプログラムを追加する方法を学びましょう。
 一.Ubuntu Androidシステム上でLinuxカーネルドライバの実現方法を編纂します。文を参照して、Linuxドライバを準備します。Androidシミュレータを使って、このLinuxドライバを含むカーネルファイルをロードし、adb shellコマンドを使ってシミュレーションを接続し、/devディレクトリにデバイスファイルhelloが存在することを検証します。
二.Androidソースコードプロジェクトのexternalディレクトリに入り、ハローディレクトリを作成する:
      USER-NAME@MACHINE-NAME:~/Android$cd external
      USER-NAME@MACHINE-NAME:~/Android/external$mkdir hello
 三.helloディレクトリにhello.cファイルを新規作成する:

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#define DEVICE_NAME "/dev/hello"
int main(int argc, char** argv)
{
	int fd = -1;
	int val = 0;
	fd = open(DEVICE_NAME, O_RDWR);
	if(fd == -1) {
		printf("Failed to open device %s.
", DEVICE_NAME); return -1; } printf("Read original value:
"); read(fd, &val, sizeof(val)); printf("%d.

", val); val = 5; printf("Write value %d to %s.

", val, DEVICE_NAME); write(fd, &val, sizeof(val)); printf("Read the value again:
"); read(fd, &val, sizeof(val)); printf("%d.

", val); close(fd); return 0;
 このプログラムの役割では、ファイルを開けてから、先に/dev/helloファイルの値を読み出して、次に5から/dev/helloの値を書き込み、最後にもう一度/dev/helloファイルの値を読み出します。dev/helloファイルから読み書きする値は、実は私達の仮想ハードウェアのレジスタvalの値です。
 四.ハローディレクトリにAndroid.mkファイルを新規作成する:
     LOCAL_PATH:=$(call my-dir)
      include$VRS)
      LOCAL_MODULE_TAGS:=optional
      LOCAL_MODULE:=ハロー
      LOCAL_SRC_FILES:=$(call all-subdir-c-files)
      include$EXECUTABLE)
   注意:BUILD_EXECUTABLEでは、私たちがコンパイルしたいのは実行可能なプログラムです。
 5.Androidソースコードのモジュールを単独でコンパイルする方法を参照してください。mmmコマンドでコンパイルします。
       USER-NAME@MACHINE-NAME:~/Android$mmm./external/hello
  コンパイルが成功したら、out/target/product/gerneric/system/binディレクトリの下で実行可能ファイルhelloを見ることができます。
 六.Androidシステムファイルを再包装するsystem.img:
       USER-NAME@MACHINE-NAME:~/Android$make snod
 このように、再包装したsystem.imgファイルには、先ほどコンパイルしたハロー実行可能ファイルが含まれています。
七.シミュレータを実行し、/system/bin/hello実行プログラムを使用してLinuxカーネルドライバにアクセスします。
      USER-NAME@MACHINE-NAME://Android$emulator-kenel./ケネル/common/arch/boot/zImage&
      USER-NAME@MACHINE-NAME:~/Android$adb shell
      root@android:/腣cd system/bin
      root@android:/system/bin菗./hello
      Read theオリジナリティvalue:
      0.
      Write value 5 to/dev/hello.
      Read the value again:
      5.
 この結果を見て、私たちが作成したC実行プログラムは私たちが作成したLinuxカーネルドライバにアクセスできるということです。
      C言語で作成された実行可能なプログラムを紹介してから、私達のLinuxカーネルドライバを訪問します。読者はAndroidのApplication FraamewarksでJavaインターフェースを提供してLinuxカーネルドライバを訪問してもいいですか?はい、次のいくつかの記事では、AndroidのAppleication FraamewarksにJavaインターフェースを追加してLinuxカーネルドライバにアクセスする方法を紹介しますので、ご期待ください。
引き続きこの部分の資料を整理します。ありがとうございます。