I.MX6 Android frameworks services 文件架构

/*******************************************************************************
 *                  I.MX6 Android frameworks services 文件架构
 * 说明:
 *     这部分内容后续可能需要多给一点注意力了,因为这部分在做系统移植的时候经常
 * 需要通过这部分来进行调试。
 *                                           2016-3-19 深圳 南山平山村 曾剑锋
 ******************************************************************************/

一、cat frameworks/base/services/jni/Android.mk
    # 获取当前路径
    LOCAL_PATH:= $(call my-dir)
    # 清理变量,但是不会清理LOCAL_PATH变量的值
    include $(CLEAR_VARS)

    # 指定jni cpp文件
    LOCAL_SRC_FILES:= \
        com_android_server_AlarmManagerService.cpp \
        com_android_server_BatteryService.cpp \
        com_android_server_input_InputApplicationHandle.cpp \
        com_android_server_input_InputManagerService.cpp \
        com_android_server_input_InputWindowHandle.cpp \
        com_android_server_LightsService.cpp \
        com_android_server_power_PowerManagerService.cpp \
        com_android_server_SerialService.cpp \
        com_android_server_SystemServer.cpp \
        com_android_server_UsbDeviceManager.cpp \
        com_android_server_UsbHostManager.cpp \
        com_android_server_VibratorService.cpp \
        com_android_server_location_GpsLocationProvider.cpp \
        com_android_server_connectivity_Vpn.cpp \
        onload.cpp                            -----------------------------+
                                                                           |
    # 指定jni cpp依赖的头文件                                              |
    LOCAL_C_INCLUDES += \                                                  |
        $(JNI_H_INCLUDE) \                                                 |
        frameworks/base/services \                                         |
        frameworks/base/core/jni \                                         |
        external/skia/include/core \                                       |
        libcore/include \                                                  |
        libcore/include/libsuspend \                                       |
        $(call include-path-for, libhardware)/hardware \                   |
        $(call include-path-for, libhardware_legacy)/hardware_legacy \     |
                                                                           |
    # 指定依赖的库文件                                                     |
    LOCAL_SHARED_LIBRARIES := \                                            |
        libandroid_runtime \                                               |
        libandroidfw \                                                     |
        libcutils \                                                        |
        libhardware \                                                      |
        libhardware_legacy \                                               |
        libnativehelper \                                                  |
        libsystem_server \                                                 |
        libutils \                                                         |
        libui \                                                            |
        libinput \                                                         |
        libskia \                                                          |
        libgui \                                                           |
        libusbhost \                                                       |
        libsuspend                                                         |
                                                                           |
    ifeq ($(WITH_MALLOC_LEAK_CHECK),true)                                  |
        LOCAL_CFLAGS += -DMALLOC_LEAK_CHECK                                |
    endif                                                                  |
                                                                           |
    # 生成的模块的名字                                                     |
    LOCAL_MODULE:= libandroid_servers                                      |
                                                                           |
    # 这里相当于开始编译                                                   |
    include $(BUILD_SHARED_LIBRARY)                                        |
                                                                           |
二、cat frameworks/base/services/jni/onload.cpp             <--------------+
    /*
     * Copyright (C) 2009 The Android Open Source Project
     *
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     *
     *      http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     */

    #include "JNIHelp.h"
    #include "jni.h"
    #include "utils/Log.h"
    #include "utils/misc.h"

    // 声明接下来的需要用到android命名空间中的jni函数
    namespace android {
    int register_android_server_AlarmManagerService(JNIEnv* env);
    int register_android_server_BatteryService(JNIEnv* env);
    int register_android_server_InputApplicationHandle(JNIEnv* env);
    int register_android_server_InputWindowHandle(JNIEnv* env);
    int register_android_server_InputManager(JNIEnv* env);
    int register_android_server_LightsService(JNIEnv* env);
    int register_android_server_PowerManagerService(JNIEnv* env);
    int register_android_server_SerialService(JNIEnv* env);
    int register_android_server_UsbDeviceManager(JNIEnv* env);
    int register_android_server_UsbHostManager(JNIEnv* env);
    int register_android_server_VibratorService(JNIEnv* env);
    int register_android_server_SystemServer(JNIEnv* env);
    int register_android_server_location_GpsLocationProvider(JNIEnv* env);
    int register_android_server_connectivity_Vpn(JNIEnv* env);
    };

    // 使用命名空间
    using namespace android;

    // C语言JNI加载函数,用于调用前面的android命名空间总的函数,这些函数
    // 主要是对JNI进行注册。
    extern "C" jint JNI_OnLoad(JavaVM* vm, void* reserved)
    {
        JNIEnv* env = NULL;
        jint result = -1;

        if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
            ALOGE("GetEnv failed!");
            return result;
        }
        ALOG_ASSERT(env, "Could not retrieve the env!");

        register_android_server_PowerManagerService(env);   ---------------+
        register_android_server_SerialService(env);                        |
        register_android_server_InputApplicationHandle(env);               |
        register_android_server_InputWindowHandle(env);                    |
        register_android_server_InputManager(env);                         |
        register_android_server_LightsService(env);                        |
        register_android_server_AlarmManagerService(env);                  |
        register_android_server_BatteryService(env);                       |
        register_android_server_UsbDeviceManager(env);                     |
        register_android_server_UsbHostManager(env);                       |
        register_android_server_VibratorService(env);                      |
        register_android_server_SystemServer(env);                         |
        register_android_server_location_GpsLocationProvider(env);         |
        register_android_server_connectivity_Vpn(env);                     |
                                                 +-------------------------+
        return JNI_VERSION_1_4;                  |       间接加载
    }                                            |
                                                 v
三、cat frameworks/base/services/jni/com_android_server_BatteryService.cpp
    ......
    namespace android {

    #define POWER_SUPPLY_PATH "/sys/class/power_supply"

    static void android_server_BatteryService_update(JNIEnv* env, jobject obj)
    {
        setBooleanField(env, obj, gPaths.acOnlinePath, gFieldIds.mAcOnline);
        setBooleanField(env, obj, gPaths.usbOnlinePath, gFieldIds.mUsbOnline);
        setBooleanField(env, obj, gPaths.wirelessOnlinePath, gFieldIds.mWirelessOnline);
        setBooleanField(env, obj, gPaths.batteryPresentPath, gFieldIds.mBatteryPresent);

        setIntField(env, obj, gPaths.batteryCapacityPath, gFieldIds.mBatteryLevel);
        setVoltageField(env, obj, gPaths.batteryVoltagePath, gFieldIds.mBatteryVoltage);
        setIntField(env, obj, gPaths.batteryTemperaturePath, gFieldIds.mBatteryTemperature);

        char prop[5];
        // always report AC plug-in and capacity 100% if emulated.battery is set to 1
        property_get("sys.emulated.battery", prop, "0");
        if (!strcmp(prop, "1")){
            env->SetBooleanField(obj, gFieldIds.mAcOnline, true);
            env->SetIntField(obj, gFieldIds.mBatteryLevel, 100);
        }

        const int SIZE = 128;
        char buf[SIZE];

        if (readFromFile(gPaths.batteryStatusPath, buf, SIZE) > 0)
            env->SetIntField(obj, gFieldIds.mBatteryStatus, getBatteryStatus(buf));
        else
            env->SetIntField(obj, gFieldIds.mBatteryStatus,
                             gConstants.statusUnknown);

        if (readFromFile(gPaths.batteryHealthPath, buf, SIZE) > 0)
            env->SetIntField(obj, gFieldIds.mBatteryHealth, getBatteryHealth(buf));

        if (readFromFile(gPaths.batteryTechnologyPath, buf, SIZE) > 0)
            env->SetObjectField(obj, gFieldIds.mBatteryTechnology, env->NewStringUTF(buf));
    }

    static JNINativeMethod sMethods[] = {
         /* name, signature, funcPtr */
        {"native_update", "()V", (void*)android_server_BatteryService_update},
    };

    int register_android_server_BatteryService(JNIEnv* env)
    {
        ......
        return jniRegisterNativeMethods(env, "com/android/server/BatteryService", sMethods, NELEM(sMethods));
    }                                                       |
                                                            |
    } /* namespace android */                               |
                                                            V
四、cat frameworks/base/services/java/com/android/server/BatteryService.java
    ......
    public final class BatteryService extends Binder {

        ......
        private native void native_update();

        ......
        private void updateLocked() {
            if (!mUpdatesStopped) {
                // Update the values of mAcOnline, et. all.
                native_update();

                // Process the new values.
                processValuesLocked();
            }
        }
        ......
    }

 

时间: 2024-07-30 03:58:00

I.MX6 Android frameworks services 文件架构的相关文章

I.MX6 Android USB Touch eGTouchA.ini文件存放

/******************************************************************** * I.MX6 Android USB Touch eGTouchA.ini文件存放 * 声明: * 本文主要记录徐远志在移植eGTouch USB Touch Android驱动过程中遇到的 * eGTouchA.ini文件存放问题如何解决. * * 2016-2-25 深圳 南山平山村 曾剑锋 ******************************

I.MX6 android 禁止低电量自动关机

/************************************************************************ * I.MX6 android 禁止低电量自动关机 * 说明: * 记录如何禁止Android低电量自动关机的功能. * * 2016-3-18 深圳 南山平山村 曾剑锋 ***********************************************************************/ 一.参考文章: android低电

Android视图控件架构分析之View、ViewGroup_Android

在Android中,视图控件大致被分为两类,即ViewGroup和View,ViewGroup控件作为父控件,包含并管理着子View,通过ViewGroup和View便形成了控件树,各个ViewGoup对象和View对象就是控件树中的节点.在控件树中,以树的深度来遍历查找对应的控件元素,同时,上层控件负责子控件的测量与绘制,并传递交互事件. Android控件树: AndroidUI界面架构图: 一.测量View的工具类:MeasureSpec 1.MeasureSpec包含了测量的模式和测量的

Android群英传笔记——第一章:Android体系与系统架构

Android群英传笔记--第一章:Android体系与系统架构 图片都是摘抄自网络 今天确实挺忙的,不过把第一章的笔记做一下还是可以的,嘿嘿 1.1 Google的生态圈 还是得从Android的起源说起,Android是一个以Linux为基础的开源移动设备操作系统,主要用于智能手机和平板电脑,由Google成立的Open Handset Alliance(OHA,开放手持设备联盟)持续领导与开发中.Android已发布的最新版本为Android 6.0.1(M). Android系统最初由安

Android之.so文件奇巧淫技

.so文件的前世今生 早期的Android系统几乎只支持ARMv5的CPU架构,而现在它可以支持7种,几乎涵盖了市面上大部分的CPU架构. Android系统目前支持的CPU架构主要包含以下7种:ARMv5,ARMv7 (从2010年起),x86 (从2011年起),MIPS (从2012年起),ARMv8,MIPS64和x86_64 (从2014年起),每一种都关联着一个相应的ABI. 二进制接口(ABI) 应用程序二进制接口(Application Binary Interface)定义了二

介绍Android平台的安全架构及其权限控制机制

本文从 Android 层次化安全架构入手,详细地介绍 Android 平台的安全架构及其权限控制机制,涵盖 Android 应用程序权限申请方法等,并从源代码实现层面来解析该机制. Android 层次化安全架构 Android 作为一个移动设备的平台,其软件层次结构包括了一个操作系统(OS),中间件(MiddleWare)和应用程序(Application).根据 Android 的软件框图,其软件层次结构自下而上分为以下几个层次: 操作系统层(OS) 各种库(Libraries)和 And

Android系统移植与调试之-------&amp;gt;Android Sensor传感器系统架构初探

1. 体系结构 2. 数据结构 3. 四大函数 本文以重力感应器装置G-sensor为例探索Android的各层次结构. 1. 体系结构     Android的体系结构可分为4个层次. 第一层次  底层驱动层,包括标准Linux,Android核心驱动,Android相关设备驱动,G-sensor的设备驱动程序即存在于此 第二层次 Android标准C/C++库,包括硬件抽象层,Android各底层库,本地库,JNI 第三层次 Android Java Framwork框架层 第四层次 Jav

I.MX6 Android Linux UART send receive with multi-thread and multi-mode demo

/******************************************************************************************* * I.MX6 Android Linux UART send receive with multi-thread and multi-mode demo * 声明: * 1. 本软件是为了测试Android底层的Linux驱动以及硬件是否存在缺陷而编写的测试软件: * 2. 本软件可以设置为发送.接收.发送并接

I.MX6 Android 5.1 快速合成系统

/**************************************************************************** * I.MX6 Android 5.1 快速合成系统 * 说明: * Android源代码编译系统是一件很痛苦的事,主要是在修改了一些很小的东西,但 * 要重新编译,要等很久才能编译完,如使用了mmm编译完,只是要打包一下system.img * 就行了,没必要去做那么多检查编译工作,所以这里跟一下系统合成原来,再精简 * 一下,做一个快速合