如何向android的framework里添加新类
google对于所有的类和API,分为开放式和不开放式两种。所谓的开放式就是值javadoc所包含的,并不是java中有public和private,而是跟javadoc有关系,代码 没有关系。
在开放式的类中增加了一个变量,而又没隐藏,导致和原API的doc不一致造成的就会有错。
通过提示,有2个方法可以解决 该问题:
1、将新增加的变量或方法加上"@hide" 的注释,注意一点,加"@hide" 不是简简单单的/*@hide */就行了,标准的javadoc要这样 /** */ 而且对于 format 变量 应该加上 { },也就是/**{@hide}*/
2、如果想在生成的doc中增加该变量或方法的话,必须输入:
make update-api
这样的话,系统 自动 将新增加的API添加到current.xml中了。
所以如果要加方法就是按上面的方法加。
如果需要加进新的类 这时候又分2种 一种是原有的包下面加类 这个最简单 加完之后直接make update-api就好了 还有一种是加在framework/base下面 这个时候你make update-api是不会在current。xml里生成你的类的。 看了Android。mk才知道 原来需要修改android源码根目录下的build/core/pathmap.mk把你的目录加进去。然后就好了。
如果是native方法,注册
如果是service方法,AIDL
==================================================================================Android开发:Framework添加新模块
主要是基于Android系统现在的Framework模块上再添加一个独立的模块,目前只是很简单的framework层调用native层(后期根据学习的进度,会将hal层补上,还有aidl, stub, 异步)。基本思路为:
为应用添加framework接口,即SDK API
framework调用native代码,即jni部分
jni部分实现最终功能
最终功能其实就是很简单的log打印,目的只要是重新温习一下framework开发的流程。之前都是在Android现有的机制上添加API,这次尝试添加一个独立的模块,只是个人的一个想法,不清楚Android添加一个新的独立模块的标准做法是怎样的,就当作学习吧。
为应用添加framework接口,即SDK API
在framework/base目录新建pmps目录,在pmps目录创建\java\android\pmps\PmpsManager.java 文件,输入代码:
package android.pmps;
import android.util.Log;
public class PmpsManager
{
private static final String LOG_TAG = "PmpsManager";
static {
System.loadLibrary("pmps_jni");
}
public PmpsManager() {
Log.i(LOG_TAG, "PmpsManager constructor().");
}
public native static void sayHello();
}
PmpsManager 为应用层提供相关API,如 sayHello(),这里是直接调用了JNI的native方法。值得注意的是PmpsManager加载了中的System.loadLibrary("pmps_jni")加载了文章中第3步将会生成的libpmps_jni.so文件。
还有一个需要注意的细节,我们可以先看一下framework/base目录下的Android.mk文件,其中有一段:
# FRAMEWORKS_BASE_SUBDIRS comes from build/core/pathmap.mk
LOCAL_SRC_FILES := $(call find-other-java-files,$(FRAMEWORKS_BASE_SUBDIRS))
我们再看看build/core/pathmap.mk,其中有一段
FRAMEWORKS_BASE_SUBDIRS := \
$(addsuffix /java, \
core \
graphics \
location \
media \
opengl \
sax \
telephony \
wifi \
\
keystore \
voip \
)
也就是说我们要在build/core/pathmap.mk文件中添加pmps目录,添加后为:
FRAMEWORKS_BASE_SUBDIRS := \
$(addsuffix /java, \
core \
graphics \
location \
media \
opengl \
sax \
telephony \
wifi \
\
keystore \
voip \
pmps \
)
然后我们就可以通过 mmm 命令编译这个新添加的模块了。
mmm framework/base 编译,生成文件为out/target/product/generic/system/framework/framework.jar
代码编译通过后,就可以做接下来的事情了。
2.framework调用native代码,即jni部分
上一步中的 publicnative static void sayHello() 就可以由应用层调用了,当然我们可以在framework里面再封装一下,以实现更加复杂的功能,例如:
//api
public int sayHelloFirst()
{
//省略的代码...
return sayHello();
}
//declaration
public native static void sayHello();
3.jni部分实现功能
这一步通过编写native代码实现framework中的调用的功能,可以实现具体的功能或者调用hal层的相关驱动,完成硬件操作功能。
当前只是简单地打印一下信息。
值得注意的要实现JNI_OnLoad函数,如果有需要的话,也可以重写JNI_OnUnLoad函数。
/*//device/libs/android_runtime/android_media_MediaPlayer.cpp
**
** Copyright 2007,The Android Open Source Project
**
** Licensed under theApache License, Version 2.0 (the "License");
** you may not usethis file except in compliance with the License.
** You may obtain acopy of the License at
**
** http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required byapplicable law or agreed to in writing, software
** distributed underthe License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIESOR CONDITIONS OF ANY KIND, either express or implied.
** See the Licensefor the specific language governing permissions and
** limitations underthe License.
*/
#define LOG_NDEBUG 0
#define LOG_TAG"PmpsManager-JNI"
#include"utils/Log.h"
#include
#include
#include
#include
#include
#include"jni.h"
#include"JNIHelp.h"
#include"android_runtime/AndroidRuntime.h"
//----------------------------------------------------------------------------
using namespaceandroid;
static voidandroid_pmps_PmpsManager_sayHello(JNIEnv *env, jobject thiz)
{
LOGV("sayHello()");
}
static constJNINativeMethod method_table[] = {
{"sayHello","()V", (void*)android_pmps_PmpsManager_sayHello},
};
// This function onlyregisters the native methods
intregister_android_pmps_PmpsManager(JNIEnv *env) {
inti;
LOGI("JNI_OnLoad:register_android_pmps_PmpsPlayer");
returnAndroidRuntime::registerNativeMethods(env,
"android/pmps/PmpsManager",method_table, NELEM(method_table));
}
jintJNI_OnLoad(JavaVM* vm, void* reserved)
{
JNIEnv* env = NULL;
jint result = -1;
if (vm->GetEnv((void**) &env,JNI_VERSION_1_4) != JNI_OK) {
LOGE("ERROR: GetEnvfailed\n");
goto bail;
}
assert(env != NULL);
if (register_android_pmps_PmpsManager(env)< 0) {
LOGE("ERROR: PmpsManager nativeregistration failed\n");
goto bail;
}
/* success -- return valid version number*/
result = JNI_VERSION_1_4;
bail:
return result;
}