AndroidはFrameworkカスタムサービスを追加し、アプリケーション層で呼び出す

7098 ワード

1.カスタムaidlファイルを追加するには:
/frameworks/base/core/java/android/os/ISelfManager.aidl
package android.os;
interface ISelfManager {     
  int selfAddNumber(int numberFirst, int numberSecond);  
  String selfAddString(String originalStr);
}

2.Android.mkファイルとAndroid.bpファイルの更新
この2つのファイルはframeworks/base/ディレクトリの下にあります.このディレクトリの下にAndroid.bpがなければAndroid.mkだけを更新すればいい./frameworks/base/Android.mkのLOCAL_SRC_FILESにはaidlファイルがたくさん追加されています.自分で定義したISelfManager.aidlファイルを追加する必要があります.LOCAL_でSRC_FILES+=core/java/android/os/ISelfManager.aidlを後に追加
LOCAL_SRC_FILES += \  
    core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl \    
    core/java/android/accessibilityservice/IAccessibilityServiceClient.aidl \       
    .....   
    core/java/android/os/ISelfManager.aidl \

Android.bpファイルに「core/java/android/os/ISelfManager.aidl」を追加し、
java_library {   
name: "framework",
  srcs: [     ......   
              "core/java/android/os/ISelfManager.aidl", 
              ......     
        ]
}

3.コンパイル/frameworks/baseモジュールをandroidディレクトリに移動し、コマンドを入力します.
./mk MSM_19021 remake_user frameworks/base allnet

コンパイルに成功すると、抽象クラスstubインタフェースを含む対応するjavaファイルが生成されます.
4.カスタム・サービス・ファイルの追加SelfManagerServices.java
/frameworks/base/services/core/java/com/android/server/SelfManagerService.java
package com.android.server;
import android.util.Log;
import android.os.ISelfManager; 
public class SelfManagerService extends ISelfManager.Stub { 
   private static final String TAG = "SelfManagerService";      
   public int selfAddNumber(int numberFirst, int numberSecond) {    
    Log.d(TAG,"I WILL CALCULATE IT numberFirst is:"+numberFirst+"  numberSecond is :"+numberSecond);  
   return numberFirst + numberSecond;  
  }    
 public String selfAddString(String originalStr) { 
   Log.d(TAG,"I will add a string to originalStr previous....");     
   return "previous lalala "+originalStr;  
  }
}

5.対応する管理クラスSelfManager.javaの作成
/frameworks/base/core/java/android/app/SelfManager.java
package android.app;
import android.util.Log;
import android.os.ISelfManager;
import android.content.Context;
import android.os.RemoteException;
 public class SelfManager {  
  private static String TAG = "SelfManager";   
  ISelfManager mSelfManager;   
  public SelfManager(Context ctx,ISelfManager selfManager) {    
         mSelfManager = selfManager;  
  }   
  public int selfAddNumber(int numberFirst, int numberSecond) throws RemoteException {   
        Log.d(TAG,"SelfManager  selfAddNumber ......... ");    
        return mSelfManager.selfAddNumber(numberFirst,numberSecond);   
 }   
  public String selfAddString(String originalStr) throws RemoteException {    
        Log.d(TAG,"SelfManager  selfAddString .........");       
        return mSelfManager.selfAddString(originalStr);
    }
}

6.SelfManagerServiceの登録
システムサービスの登録プロセスは、SystemServer.javaとSystemServiceRegistry.javaで変更/frameworks/base/services/java/com/android/server/systemServer.javaにサービスを追加する必要があります.
private void startOtherServices() {   
 .... 
 try{
 ServiceManager.addService("selfservice", new SelfManagerService());
}catch(Throwable e){
Slog.e(TAG, “ServiceManager.addService failed...”);
     } 
   ....
}

/frameworks/base/core/java/android/app/SystemServiceRegistry.java
import android.os.ISelfManager;
static {    ...
 registerService("selfservice", SelfManager.class,     new CachedServiceFetcher()
{                   @Override                  
  public SelfManager createService(ContextImpl ctx) {           
             IBinder b = ServiceManager.getService("selfservice");            
            ISelfManager service = ISelfManager.Stub.asInterface(b);           
             return new SelfManager(ctx,service);      
          }});  
  ...
}

ここでの「selfservice」は、一般的にcontext.javaで宣言し、システム内の他のサービス呼び出し時のアプリケーションなど、ここで参照する必要があります.Context.javaで定義されています.
7.サービス定義を/frameworks/base/core/java/android/content/Clontext.javaに追加します.
public static final String SELF_SERVICE = “selfservice” ;

8.権限の更新
ここで更新する権限ファイルは7つ(メーカーによって異なる)あり、すべて/vendor/oppo_sepolicy/private/ディレクトリの下に、サービス.teというコードを追加します.
type self_service,   service_manager_type;

System_server.te
allow system_server self_service:service_manager {find add};

Service_contexts
selfservice    u:object_r:self_service:s0

Untrusted_app.te
allow untrusted_app self_service:service_manager find;

Untrusted_app_25.te
allow untrusted_app_25 self_service:service_manager find;

Untrusted_app_27.te
allow untrusted_app_27 self_service:service_manager  { find};

Platform_app.te
allow platform_app self_service:service_manager find;

9.フルコンパイル
Androidソースディレクトリの下に入り、コマンドのフルコンパイルを実行します.メーカーによって全コンパイルコマンドが異なり、ここで私の全コンパイルコマンドは以下の通りです.
bash -x compile.sh MSM_XXXXX new_user allnet

10.ブラシ機
全編成功後ブラシ
11.ブラシ後にカスタムサービスが追加されたかどうかを確認
adb shellでシステムサービスリストを表示し、selfserviceが見つかったら追加に成功します.または、ブートlogをキャプチャし、ログファイルを表示し、カスタムサービスを検索します.
adb shell service list

そしてアプリで追加したサービスを呼び出します.ソースコードでAPKをコンパイルし、adb installを携帯電話に、Androdi Studioでコンパイルすることもできます.jarパッケージを参照し、サービス管理クラスを追加してサービスを呼び出す必要があります.ここで私はソースコードでコンパイルして、adb installはapkをインストールします
12.Android StudioプロジェクトをAndroidソースに移植する
1.自分で書いたapk全体をvendor/oppoにコピーするapp/下、またはpackages/apps/下.プロジェクトのファイルの中で多くのASの自动的に生成するファイルがあって、ここはいくつかのファイルを削除する必要があって、ただ一部のファイルだけを保留して、さもなくばコンパイルして间违いを报告しないかもしれなくて、ディレクトリの构造は以下の通りです
APK_Demo1
  java
    com
       example
          apk_demo1
             A_Activity.java
             ...
             ...
  res
       layout
       ...
       ...
  Android.mk
  AndroidManifest.xml

残りのファイルはすべて削除されます.Android.mkファイルコードは以下の通りです.
LOCAL_PATH := $(call my-dir)Include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_PACKAGE_NAME := APK_Demo1
LOCAL_SDK_VERSION := current
LOCAL_CERTIFICATE := platform
LOCAL_STATIC_ANDROID_LIBRARIES := \  
  androidx.legacy_legacy-support-v4
 LOCAL_DEX_PREOPT := falseinclude
$(BUILD_PACKAGE)

2.ローカルコンパイル、apk生成
./mk MSM_19021 remake_user vendor/oppo_app/APK_Demo1 allnet

3.APK adb installを携帯電話に接続したことを確認し、cmdコマンドラインウィンドウに入力する.
adb install -r [apk  ]

車に戻って実行し、successを提示し、インストールに成功し、携帯電話のAPKを開き、サービスが正常に呼び出されたかどうかを確認します.ここではメインイベントにButtonとTextviewを追加してサービスが正常に呼び出されたかどうかをテストし、Buttonをクリックすると、システムサービスを呼び出して整数の数字を取得し、この数字をTextviewに表示します.ここでappに入ってbuttonをクリックすると、Textviewが数字を表示し、サービス呼び出しに成功したことを説明します.