フレーム・レイヤのハードウェア・アクセス・サービスの追加

3762 ワード

これは一連の文章です.
  • Androidカーネル追加駆動
  • fregドライバをテストする機能内蔵Cプログラム
  • HALレイヤコード
  • を追加
  • JNI層
  • を追加
  • フレーム層追加ハードウェアアクセスサービス
  • このシリーズはandroidの下から上までの各層に簡単なデザインがあり、スズメは小さいが、五臓がそろっている.enjoy now!
    このセクションの内容は、ハードウェアアクセスサービスの追加、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.mkLOCAL_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権限を構成しています