环境说明
- ubuntu16.04
- android4.1
- java version “1.6.0_45”
- GNU Make 3.81
- gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.12)
可能有人会问,现在都2024了怎么还在用android4版本,早都过时了。确实,现在最新的都是Android13、Android14了,不过我这里主要是用于demo的演示学习使用,只要整个的流程掌握了,哪个版本的流程都是大同小异;再一个就拿Android13来说,源码100G多非常庞大,代码clone、源码编译都是很慢的,而Android4.1源码才4G多,编译运行就快多了,省时省力。
编写AIDL文件
如果不了解aidl,建议先看看:android AIDL使用demo
仿照系统中现有服务的编写方式,新增服务需要编写aidl接口(也就是提供什么服务),在frameworks/base/core/java/android/helloservice/新建aidl文件,
ICallBack.aidl内容如下
package android.helloservice;
interface ICallBack {
void onReceive(String serverMsg);
}
IHelloService.aidl内容如下
package android.helloservice;
import android.helloservice.ICallBack;
interface IHelloService {
String getHello(String send);
void registerCallback(ICallBack callback);
void unRegisterCallback(ICallBack callback);
}
修改frameworks/base/Android.mk,在LOCAL_SRC_FILES变量中加入新增的aidl文件
## READ ME: ########################################################
##
## When updating this list of aidl files, consider if that aidl is
## part of the SDK API. If it is, also add it to the list below that
## is preprocessed and distributed with the SDK. This list should
## not contain any aidl files for parcelables, but the one below should
## if you intend for 3rd parties to be able to send those objects
## across process boundaries.
##
## READ ME: ########################################################
LOCAL_SRC_FILES += \
core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl \
core/java/android/accessibilityservice/IAccessibilityServiceClient.aidl \
core/java/com/android/internal/widget/IRemoteViewsFactory.aidl \
core/java/com/android/internal/widget/IRemoteViewsAdapterConnection.aidl \
//省略部分
core/java/android/helloservice/ICallBack.aidl \
core/java/android/helloservice/IHelloService.aidl \
执行mmm frameworks/base
单编,编译成功之后会在out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/android/helloservice/生成如下文件
IHelloService.java内容(androidstudio生成,aosp生成的代码紧凑不方便阅读)
/*
* This file is auto-generated. DO NOT MODIFY.
*/
package android.helloservice;
public interface IHelloService extends android.os.IInterface
{
/** Default implementation for IHelloService. */
public static class Default implements android.helloservice.IHelloService
{
@Override public java.lang.String getHello(java.lang.String send) throws android.os.RemoteException
{
return null;
}
@Override public void registerCallback(android.helloservice.ICallBack callback) throws android.os.RemoteException
{
}
@Override public void unRegisterCallback(android.helloservice.ICallBack callback) throws android.os.RemoteException
{
}
@Override
public android.os.IBinder asBinder() {
return null;
}
}
/** Local-side IPC implementation stub class. */
public static abstract class Stub extends android.os.Binder implements android.helloservice.IHelloService
{
/** Construct the stub at attach it to the interface. */
public Stub()
{
this.attachInterface(this, DESCRIPTOR);
}
/**
* Cast an IBinder object into an android.helloservice.IHelloService interface,
* generating a proxy if needed.
*/
public static android.helloservice.IHelloService asInterface(android.os.IBinder obj)
{
if ((obj==null)) {
return null;
}
android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
if (((iin!=null)&&(iin instanceof android.helloservice.IHelloService))) {
return ((android.helloservice.IHelloService)iin);
}
return new android.helloservice.IHelloService.Stub.Proxy(obj);
}
@Override public android.os.IBinder asBinder()
{
return this;
}
@Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException
{
java.lang.String descriptor = DESCRIPTOR;
if (code >= android.os.IBinder.FIRST_CALL_TRANSACTION && code <= android.os.IBinder.LAST_CALL_TRANSACTION) {
data.enforceInterface(descriptor);
}
switch (code)
{
case INTERFACE_TRANSACTION:
{
reply.writeString(descriptor);
return true;
}
}
switch (code)
{
case TRANSACTION_getHello:
{
java.lang.String _arg0;
_arg0 = data.readString();
java.lang.String _result = this.getHello(_arg0);
reply.writeNoException();
reply.writeString(_result);
break;
}
case TRANSACTION_registerCallback:
{
android.helloservice.ICallBack _arg0;
_arg0