AndroidはFrameworkカスタムサービスを追加し、アプリケーション層で呼び出す
7098 ワード
1.カスタムaidlファイルを追加するには:
/frameworks/base/core/java/android/os/ISelfManager.aidl
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を後に追加
Android.bpファイルに「core/java/android/os/ISelfManager.aidl」を追加し、
3.コンパイル/frameworks/baseモジュールをandroidディレクトリに移動し、コマンドを入力します.
コンパイルに成功すると、抽象クラスstubインタフェースを含む対応するjavaファイルが生成されます.
4.カスタム・サービス・ファイルの追加SelfManagerServices.java
/frameworks/base/services/core/java/com/android/server/SelfManagerService.java
5.対応する管理クラスSelfManager.javaの作成
/frameworks/base/core/java/android/app/SelfManager.java
6.SelfManagerServiceの登録
システムサービスの登録プロセスは、SystemServer.javaとSystemServiceRegistry.javaで変更/frameworks/base/services/java/com/android/server/systemServer.javaにサービスを追加する必要があります.
/frameworks/base/core/java/android/app/SystemServiceRegistry.java
ここでの「selfservice」は、一般的にcontext.javaで宣言し、システム内の他のサービス呼び出し時のアプリケーションなど、ここで参照する必要があります.Context.javaで定義されています.
7.サービス定義を/frameworks/base/core/java/android/content/Clontext.javaに追加します.
8.権限の更新
ここで更新する権限ファイルは7つ(メーカーによって異なる)あり、すべて/vendor/oppo_sepolicy/private/ディレクトリの下に、サービス.teというコードを追加します.
System_server.te
Service_contexts
Untrusted_app.te
Untrusted_app_25.te
Untrusted_app_27.te
Platform_app.te
9.フルコンパイル
Androidソースディレクトリの下に入り、コマンドのフルコンパイルを実行します.メーカーによって全コンパイルコマンドが異なり、ここで私の全コンパイルコマンドは以下の通りです.
10.ブラシ機
全編成功後ブラシ
11.ブラシ後にカスタムサービスが追加されたかどうかを確認
adb shellでシステムサービスリストを表示し、selfserviceが見つかったら追加に成功します.または、ブートlogをキャプチャし、ログファイルを表示し、カスタムサービスを検索します.
そしてアプリで追加したサービスを呼び出します.ソースコードでAPKをコンパイルし、adb installを携帯電話に、Androdi Studioでコンパイルすることもできます.jarパッケージを参照し、サービス管理クラスを追加してサービスを呼び出す必要があります.ここで私はソースコードでコンパイルして、adb installはapkをインストールします
12.Android StudioプロジェクトをAndroidソースに移植する
1.自分で書いたapk全体をvendor/oppoにコピーするapp/下、またはpackages/apps/下.プロジェクトのファイルの中で多くのASの自动的に生成するファイルがあって、ここはいくつかのファイルを削除する必要があって、ただ一部のファイルだけを保留して、さもなくばコンパイルして间违いを报告しないかもしれなくて、ディレクトリの构造は以下の通りです
残りのファイルはすべて削除されます.Android.mkファイルコードは以下の通りです.
2.ローカルコンパイル、apk生成
3.APK adb installを携帯電話に接続したことを確認し、cmdコマンドラインウィンドウに入力する.
車に戻って実行し、successを提示し、インストールに成功し、携帯電話のAPKを開き、サービスが正常に呼び出されたかどうかを確認します.ここではメインイベントにButtonとTextviewを追加してサービスが正常に呼び出されたかどうかをテストし、Buttonをクリックすると、システムサービスを呼び出して整数の数字を取得し、この数字をTextviewに表示します.ここでappに入ってbuttonをクリックすると、Textviewが数字を表示し、サービス呼び出しに成功したことを説明します.
/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が数字を表示し、サービス呼び出しに成功したことを説明します.