在framework下新建系统api

过程如下:
先在framework/base 下创建一目录叫venus
/venus 目录下有两个文件夹:

|-- java
|   `-- android
`-- jni
    |-- Android.mk
    |-- jni.cpp



java 下的类包遵循java 类包命名规则,好了,进入关键的第二步:

在文件build/core/pathmap.mk中的FRAMEWORKS_BASE_SUBDIRS变量里添加 venus\

OK,大功告成, 在Android 源码目录执行如下命令:

make update-api
make 
make PRODUCT-sdk-sdk

新增的接口在源码环境和SDK环境中都有了,存放在 android.jar 里


------------------------------------------------------------------------------------


最近因项目需要,在frameworks\base\core\java\android\preference里面新添加了一个继承TwoStatePreference的类XXXSwitchPreference

经过查证后得知: 
Android SDK中有些JAVA类是开放的,有些是不开放的,API同样如此。这里所谓开放的类或API,只是javadoc的范畴,并不是java中public和private,也就是说,对于源码的编译无所谓,但是对android的上层应用有影响,因为非开放的类或API,android上层应用无法直接访问。

对于在原有的类中添加方法,google 给了两个解决方法: 
1. 在你添加的API或者变量前面,增加 javadoc 注释@hide。但是要注意的是,并不是简单写个@hide 或者 /*@hide*/ 就可以了,这些都是错误的javadoc注释格式,标准的javadoc都是这样的 /** */ 而且对于 format 变量 应该加上 { }。应该写成 /** {@hide} */

2.想要在生成的javadoc里面出现这个方法或者变量,你必须执行:

make update-api
 
 
  • 1

这样的话,系统自动将新增加的API添加到frameworks\base\api\current.txt中了,但是如果修改的是google没有开放出来的类,比如RIL,PhoneFactory,就不会出现这个问题。

而如果要加进新的类, 
1、在原有的包下面加类,这个最简单,加完之后执行make update-api,在frameworks\base\api\current.txt中会自动增加一段代码

2、若加在framework/base下面,这时你make update-api是不会在frameworks\base\api\current.txt里生成你新增的API的。这时,需要修改android源码根目录下的build/core/pathmap.mk把你的目录加进去.(未经亲自验证)



------------------------------------------------------------------------------------


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把你的目录加进去。然后就好了。


------------------------------------------------------------------------------------


修改framework/base下面的api要注意更新api/current.txt文件 
需要修改frameworks/base/下的代码,请注意 :

如果修改了Android原有API的 ,需要update frameworks/base/api/current.txt。否则编译被中断并出现编译错误提示。

可以通过运行 make update-api 后,自动更新此文件,检查确认正确后,跟代码一起提交即可。


------------------------------------------------------------------------------------

http://blog.csdn.net/badboyplane/article/details/7864621

  1. 主要是基于Android系统现在的Framework模块上再添加一个独立的模块,目前只是很简单的framework层调用native层(后期根据学习的进度,会将hal层补上,还有aidl, stub, 异步)。基本思路为:

     

  2. 为应用添加framework接口,即SDK API
  3. framework调用native代码,即jni部分
  4. jni部分实现最终功能

     

    最终功能其实就是很简单的log打印,目的只要是重新温习一下framework开发的流程。之前都是在Android现有的机制上添加API,这次尝试添加一个独立的模块,只是个人的一个想法,不清楚Android添加一个新的独立模块的标准做法是怎样的,就当作学习吧。

  1. 为应用添加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 \

        vpn \

        keystore \

        voip \

     )

     

    也就是说我们要在build/core/pathmap.mk文件中添加pmps目录,添加后为:

    FRAMEWORKS_BASE_SUBDIRS := \

    $(addsuffix /java, \

        core \

        graphics \

        location \

        media \

        opengl \

        sax \

        telephony \

        wifi \

        vpn \

        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<stdio.h>

    #include<assert.h>

    #include<limits.h>

    #include<unistd.h>

    #include<fcntl.h>

    #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;

    }



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值