Binder 专题18——添加 Java 系统服务
目录
| 添加 Java 系统服务 |
一、编写 AIDL
加一个在开机就自启动的 Java 系统服务。
在 frameworks/base/core/java 目录下创建如下的文件与文件夹:
com/yuandaima
└── IJavaHelloService.aidl
其中 IJavaHelloService.aidl 的内容如下:
package com.yuandaima;
interface IJavaHelloService
{
void sayhello();
int sayhello_to(String name);
}
AIDL 在我们自定义的 com/yuandaima 包结构下。
二、将 AIDL 加入 Android.bp
接着修改 frameworks/base/Android.bp
java_defaults {
name: "framework-defaults",
installable: true,
srcs: [
//......
"core/java/com/yuandaima/IJavaHelloService.aidl"
]
//......
}
三、定义 Binder 服务端类
frameworks/base/services/core/java/com 目录下新建如下的目录与文件:
yuandaima
└── JavaHelloService.java
其中 JavaHelloService.java:
package com.yuandaima;
import android.util.Log;
public class JavaHelloService extends IJavaHelloService.Stub {
private static final String TAG = "JavaHelloService";
private int cnt1 = 0;
private int cnt2 = 0;
public void sayhello() throws android.os.RemoteException {
cnt1++;
Log.i(TAG, "sayhello : cnt = "+cnt1);
}
public int sayhello_to(java.lang.String name) throws android.os.RemoteException {
cnt2++;
Log.i(TAG, "sayhello_to "+name+" : cnt = "+cnt2);
return cnt2;
}
}
四、开机启动服务
修改 frameworks/base/services/java/com/android/server/SystemServer.java 文件,在 startOtherServices 方法的最后增加以下代码:
//import 不要忘了
import com.yuandaima.JavaHelloService;
// add hello service
traceBeginAndSlog("JavaHelloService");
ServiceManager.addService("JavaHelloService", new JavaHelloService());
traceEnd();
五、selinux 配置
接着添加 selinux 配置:
同时修改 system/sepolicy/private 和 system/sepolicy/prebuilts/api/29.0/private 目录下的:
service.te:
type JavaHelloServiceType, system_server_service, service_manager_type;
service_contexts:
JavaHelloService u:object_r:JavaHelloServiceType:s0
platform_app.te:
allow platform_app JavaHelloServiceType:service_manager find;
六、添加 Java 接口白名单
我们新添加了 com/yuandaima Java 软件包,这些包需要在白名单中声明才能被上层 App 访问到:
在 build/make/core/tasks/check_boot_jars/package_whitelist.txt 中添加如下内容:
com\.yuandaima
com\.yuandaima\..*
七、系统 App 使用系统服务
接着我们就可以在我们的系统 App 中使用我们的自定义的系统服务了:
修改添加的系统 App Demo:
Android.bp:
android_app {
name: "FirstSystemApp",
srcs: ["src/**/*.java"],
resource_dirs: ["res"],
manifest: "AndroidManifest.xml",
platform_apis: true,
sdk_version: "",
certificate: "platform",
//去掉 product_specific
// product_specific: true,
static_libs: ["androidx.appcompat_appcompat",
"com.google.android.material_material",
"androidx-constraintlayout_constraintlayout",
"lib-lottie"],
}
接着修改自定义 Product 配置文件 device/jelly/rice14/rice14.mk:
PRODUCT_PACKAGES += \
# ......
FirstSystemApp
PRODUCT_ARTIFACT_PATH_REQUIREMENT_WHITELIST += \
# ......
/system/app/FirstSystemApp/FirstSystemApp.apk
修改 device/jelly/rice14/FirstSystemApp/src/com/yuandaima/firstsystemapp/MainActivity.java 源码:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
IJavaHelloService service = IJavaHelloService.Stub.asInterface(ServiceManager.getService("JavaHelloService"));
service.sayhello();
} catch (Exception e) {
e.printStackTrace();
}
}
}
接着我们就可以重新编译系统,烧录镜像了:
source build/envsetup.sh
# 自定义 Product rice14
lunch xxx
# 更新一下 api
make api-stubs-docs-update-current-api
make -j32
接着我们就可以打开我们的 FirstSystemApp 了,然后查看 log:

更多推荐



所有评论(0)