1、添加framework/base/core/java/android/os/IRtlAlarmPowerOn.aidl
package android.os;
/**
* Direct interface to the UpdateLockService's functionality
*
* {@hide}
*/
interface IRtcAlarmPowerOn {
int updatePowerOnToRtc(in int[] time);
int rtcDeviceOpen();
}
2、添加framework/base/services/core/java/com/android/services/RtlAlarmPowerOn.java
package com.android.server;
import android.util.Slog;
import android.os.IRtcAlarmPowerOn;
import android.content.Context;
public class RtcAlarmPowerOn extends IRtcAlarmPowerOn.Stub{
private static final String TAG = "AidlService";
private final Context mContext;
public static final String RTCALARM_STATS_SERVICE = "rtcalarmstats";
public RtcAlarmPowerOn(Context context)
{
Slog.d(TAG,"RtcAlarmPowerOn");
mContext = context;
}
@Override
public int updatePowerOnToRtc(int[] time) throws android.os.RemoteException
{
Slog.d(TAG,"updatePowerOnToRtc begin nativeUpdatePowerOnToRtc");
return nativeUpdatePowerOnToRtc(time);
}
@Override
public int rtcDeviceOpen() throws android.os.RemoteException
{
Slog.d(TAG,"rtcDeviceOpen begin nativeRtcDeviceOpen");
return nativeRtcDeviceOpen();
}
public static native int nativeUpdatePowerOnToRtc(int[] arg);
public static native int nativeRtcDeviceOpen();
}
3、完成rameworks/base/services/core/jni/com_android_server_RtcAlarmPowerOn.cpp
#define LOG_TAG "RtcAlarmPowerOn"
#include "jni.h"
#include <nativehelper/JNIHelp.h>
//#include "android_runtime/AndroidRuntime.h"
#include <utils/misc.h>
#include <utils/Log.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <poll.h>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <linux/rtc.h>
#include <sys/ioctl.h>
#include "../../../../../../kernel-5.10/include/uapi/linux/rtc.h"
namespace android
{
int fd;
struct rtc_time dt;
#define RTC_ALM_PWRON_SET _IOW('p', 0x15, struct rtc_time)
static jint nativeUpdatePowerOnToRtc(JNIEnv *env , jobject /*clazz*/ , jintArray timeArr)
{
int i;
int length = env->GetArrayLength(timeArr);
jint* buf = env->GetIntArrayElements(timeArr,NULL);
for(i = 0; i < length; i++)
{
ALOGE("nativeUpdateTimeToRtc buf=%d index i=%d",buf[i],i);
}
if(length == 5)
{
dt.tm_sec = 0;//00
dt.tm_min = buf[4];//00
dt.tm_hour = buf[3];//11
dt.tm_mday = buf[2];//20-(2019-2016)=17 21=x-(2019-2016)-->x=24
//dt.tm_mon = buf[1];//10+1=11
dt.tm_wday = buf[1]; // rtc pcf8563 alarm need wday
dt.tm_year = buf[0];//20(19)
//start time 2019-11-21 09:30
}else
{
//parse time to int value
dt.tm_sec = 0;//00
dt.tm_min = buf[4];//00
dt.tm_hour = buf[3];//11
dt.tm_mday = buf[2];//20-(2019-2016)=17 21=x-(2019-2016)-->x=24
dt.tm_mon = buf[1];//10+1=11
dt.tm_year = buf[0];//20(19)
//start time 2019-11-21 09:30
}
int res;
fd = open("/dev/rtc0", O_RDWR);
if (fd < 0)
{
printf("can't open /dev/rtc0!\n");
return -11;
}
res = ioctl(fd, RTC_ALM_PWRON_SET, &dt);
if (res < 0)
printf("RTC_ALM_PWRON_SET ioctl failed");
close(fd);
//return fd;
return res;
}
static jint nativeRtcDeviceOpen(JNIEnv* /* env */, jobject /* clazz */)
{
int fd,retval;
struct rtc_time rtc_tm;
fd=open("/dev/rtc0",O_RDWR);
if(fd < 0)
{
printf("can't open /dev/rtc0!\n");
return -11;
}
retval=ioctl(fd,RTC_RD_TIME,&rtc_tm);
if(retval < 0)
{
printf("error RTC_RD_TIME ioctl");
return -1;
}
close(fd);
return 0;
}
static const JNINativeMethod method_table[] = {
{ "nativeUpdatePowerOnToRtc", "([I)I", (void*)nativeUpdatePowerOnToRtc },
{ "nativeRtcDeviceOpen", "()I", (void*)nativeRtcDeviceOpen },
};
int register_android_server_RtcAlarmPowerOn(JNIEnv *env)
{
jclass clazz = env->FindClass("com/android/server/RtcAlarmPowerOn");
if (clazz == NULL) {
ALOGE("Can't find com/android/server/RtcAlarmPowerOn");
return -1;
}
return jniRegisterNativeMethods(env, "com/android/server/RtcAlarmPowerOn",
method_table, NELEM(method_table));
}
};
4、Android bp添加cpp编译
rameworks/base/services/core/jni/Android.bp
"com_android_server_RtcAlarmPowerOn.cpp",
5、frameworks/base/services/core/jni/onload.cpp
int register_android_server_sensor_SensorService(JavaVM* vm, JNIEnv* env); int register_com_android_server_rkdisplay_RkDisplayModes(JNIEnv* env); int register_com_android_server_audio_RkAudioSetting(JNIEnv* env); int register_android_server_RtcAlarmPowerOn(JNIEnv* env); }; using namespace android; register_android_server_sensor_SensorService(vm, env); register_com_android_server_rkdisplay_RkDisplayModes(env); register_com_android_server_audio_RkAudioSetting(env); register_android_server_RtcAlarmPowerOn(env); return JNI_VERSION_1_4; }
6、 frameworks/base/services/java/com/android/server/SystemServer.java添加services
boolean enableVrService = context.getPackageManager().hasSystemFeature( PackageManager.FEATURE_VR_MODE_HIGH_PERFORMANCE); boolean disableRtcAlarmServices = SystemProperties.getBoolean("config.disable_rtcalarm", false); boolean disableVendorStorage = SystemProperties.getBoolean("config.disable_vendor_storage", false); if (!disableRtcAlarmServices) { t.traceBegin("StartSerialService"); try { ServiceManager.addService(RtcAlarmPowerOn.RTCALARM_STATS_SERVICE, new RtcAlarmPowerOn(context)); } catch (Throwable e) { Slog.e(TAG, "Failure starting SerialService", e); } t.traceEnd(); }