フレーム・レイヤのハードウェア・アクセス・サービスの追加
3762 ワード
これは一連の文章です. Androidカーネル追加駆動 fregドライバをテストする機能内蔵Cプログラム HALレイヤコード を追加 JNI層 を追加フレーム層追加ハードウェアアクセスサービス このシリーズはandroidの下から上までの各層に簡単なデザインがあり、スズメは小さいが、五臓がそろっている.enjoy now!
このセクションの内容は、ハードウェアアクセスサービスの追加、selinux権限の構成、サービスの開始を含む.
1.ハードウェアアクセスサービスの追加
fregサービスはsystem_にあるのでserverプロセスでは、そのサービスにアクセスするappは自分のプロセスであり、2つの異なるプロセスに属するため、プロセス間通信Binderを使用する必要があり、fregサービスはstubエンドであり、AIDL方法を実現する.
この方法では
システムサービスコード
nativeメソッドを呼び出し、
2.selinux権限の構成
サービスでteファイルに追加:
ここにいるよteファイルに追加:
ファイル_contextsファイルに追加:
サービスでteのファイルに追加:
サービス_contextsファイルに追加:
システムでserver.teファイルに追加:
untrusted_app.teファイルに追加:
システムでapp.teファイルに追加:
参照blog:/devで新しいデバイスドライバを追加するSelinux関連設定
3.サービスの開始
'frameworks/base/services/java/com/android/server/systemServer.JAva'のstartOtherServices()には、次のコードが追加されます.
newのインスタンスFregServiceをServiceManagerに登録し、名前:freg.この名前はselinux権限を構成しています
このセクションの内容は、ハードウェアアクセスサービスの追加、selinux権限の構成、サービスの開始を含む.
1.ハードウェアアクセスサービスの追加
fregサービスはsystem_にあるのでserverプロセスでは、そのサービスにアクセスするappは自分のプロセスであり、2つの異なるプロセスに属するため、プロセス間通信Binderを使用する必要があり、fregサービスはstubエンドであり、AIDL方法を実現する.
frameworks/base/core/java/android/os/IFregService.aidl
: package android.os;
/** @hide */
interface IFregService {
void setVal(int val);
int getVal();
}
この方法では
/** @hide */
を追加することに注意するが、そうでないとコンパイルがエラーを報告し、APIの更新を促す.hideを追加することは、外部に公開されないことに相当し、frameworks/base/Android.mk
のLOCAL_SRC_FILES
にAPIを追加する必要はありません. core/java/android/os/IFregService.aidl \
IFregService.aidl
のソースファイルを追加する役割を果たす.mkファイルの書き方では、各行の先頭に8つのスペースではなくtableキーを使うことに注意してください!!!システムサービスコード
frameworks/base/services/core/java/com/android/server/FregService.java
を追加します.package com.android.server;
import android.content.Context;
import android.os.IFregService;
import android.util.Slog;
public class FregService extends IFregService.Stub {
private static final String TAG = "FregService";
private int mPtr = 0;
FregService() {
mPtr = init_native();
if(mPtr == 0) {
Slog.e(TAG, "Failed to initialize freg service.");
}
}
public void setVal(int val) {
if(mPtr == 0) {
Slog.e(TAG, "Freg service is not initialized.");
return;
}
setVal_native(mPtr, val);
}
public int getVal() {
if(mPtr == 0) {
Slog.e(TAG, "Freg service is not initialized.");
return 0;
}
return getVal_native(mPtr);
}
private static native int init_native();
private static native void setVal_native(int ptr, int val);
private static native int getVal_native(int ptr);
};
nativeメソッドを呼び出し、
dev/freg
に対する読み書き操作を実現する.2.selinux権限の構成
サービスでteファイルに追加:
type freg_device, dev_type;
ここにいるよteファイルに追加:
allow domain freg_device:chr_file rw_file_perms;
ファイル_contextsファイルに追加:
/dev/freg u:object_r:freg_device:s0
サービスでteのファイルに追加:
type freg_service, system_api_service, system_server_service, service_manager_type;
サービス_contextsファイルに追加:
freg u:object_r:freg_service:s0
システムでserver.teファイルに追加:
allow system_server freg_device:chr_file rw_file_perms;
untrusted_app.teファイルに追加:
allow untrusted_app freg_service:service_manager find;
システムでapp.teファイルに追加:
allow system_app freg_service:service_manager find;
参照blog:/devで新しいデバイスドライバを追加するSelinux関連設定
3.サービスの開始
'frameworks/base/services/java/com/android/server/systemServer.JAva'のstartOtherServices()には、次のコードが追加されます.
try {
Slog.i(TAG, "Freg Service");
ServiceManager.addService("freg", new FregService());
} catch (Throwable e) {
Slog.e(TAG, "Failure starting Freg Service", e);
}
newのインスタンスFregServiceをServiceManagerに登録し、名前:freg.この名前はselinux権限を構成しています