android4.3从app到kernel代码追踪gsensor所遇到的问题

我目前所遇到的问题是在android4.3代码上追踪gsensor的时候出现代码的断层,并且找不到对应的解决方法

希望各位又看到的指导一下:

packages/apps/Settings/src/com/android/settings/gsensor/GestureScreenEnabler.java

public GestureScreenEnabler(Context context, Switch switch_) {

52         mContext = context;

53         mSwitch = switch_;

54         sm = (GSensorManager)context.getSystemService(Context.GSENSOR_SERVICE);

55         if (sm == null) {

56             mSwitch.setEnabled(false);

57         }

58         mIntentFilter = new IntentFilter(GSensorManager.ACTION_STATE_CHANGED);

59     }

然后找到对应的GSensorManager服务

frameworks/base/core/java/android/hardware/GSensorManager.java

7 public class GSensorManager {

8

9     private static final boolean DEBUG = false;

10     private static final String TAG = "GSensorManager";

11

12     public static final String ACTION_STATE_CHANGED = "android.hardware.gsensormanager.STATE_CHANGED";

13     public static final String EXTRA_STATE = "android.hardware.gsensormanager.extra.STATE";

14

15     IGSensorManager mService;

16

17     public GSensorManager(IGSensorManager service) {

18         mService = service;

19     }

20

21     public void setEnabled(boolean isEnabled) {

22         try {

23             if (mService != null)

24                 mService.setEnabled(isEnabled);

25         } catch (RemoteException e) {

26

27         }

28     }

29

30     public boolean isEnabled() {

31         try {

32             if (mService != null)

33                 return mService.isEnabled();

34         } catch (RemoteException e) {

35         }

36         return false;

37     }

38

39     public int setReferenceStatus() {

40         try {

41             if (mService != null)

42                 return mService.setReferenceStatus();

43         } catch (RemoteException e) {

44         }

45         return 0;

46     }

47

48

49     public void setThreshold(int level){

50         try {

51             if (mService != null)

52                 mService.setThreshold(level);

53         } catch (RemoteException e) {

54         }

55     }

下面是定义的getSystemService服务的接口

frameworks/base/core/java/android/content/Context.java

public static final String GSENSOR_SERVICE = "gsensor";

public abstract Object getSystemService(String name);

在frameworks/base/core/java/android/app/ContextImpl.java中实现的接口函数

public Object getSystemService(String name) {

ServiceFetcher fetcher = SYSTEM_SERVICE_MAP.get(name);

return fetcher == null ? null : fetcher.getService(this);

}

注册gsensor服务

registerService(GSENSOR_SERVICE, new ServiceFetcher() {

544                 public Object createService(ContextImpl ctx) {

545                     IBinder b = ServiceManager.getService(GSENSOR_SERVICE);

546                     IGSensorManager service = IGSensorManager.Stub.asInterface(b);

547                     return new GSensorManager(service);

548                 }

549             });

frameworks/base/services/java/com/android/server/SystemServer.java

构建各功能和对应的服务的一一对应关系

if (SystemProperties.get("ro.gesturescreenon.support").equals("true")) {

792                 try {

793                     Slog.i(TAG,"gsensor service");

794                     gSensor = new GSensorService(context);

795                     ServiceManager.addService("gsensor", gSensor);

796                 } catch (Throwable e) {

797                     Slog.e(TAG,"Failure starting gsensor Service", e);

798                 }

799             }

紧接着,下面的代码就没有办法构建成功了。并且也不知道该如何操作下面的代码了。

以下是我从hardware开始向APP曾追踪代码的说明:

hardware/libhardware/include/hardware/sensors.h

这里是定义的一些sensor的结构,也就不一一列出它们了。

struct sensors_module_t {

826     struct hw_module_t common;

827

828     /**

829      * Enumerate all available sensors. The list is returned in "list".

830      * @return number of sensors in the list

831      */

832     int (*get_sensors_list)(struct sensors_module_t* module,

833             struct sensor_t const** list);

834 };

frameworks/base/services/jni/com_android_server_GSensorService.cpp

#define GSENSOR_DIR_NAME "/sys/bus/iio/devices/iio:device0"

#define GSENSOR_DEFAULT_THRESHOLD (8 * 32)

#define GSENSOR_REFERENCE_X "motion_lpa_threshold"

#define GSENSOR_REFERENCE_Y "motion_lpa_threshold"

#define GSENSOR_REFERENCE_Z "motion_lpa_threshold"

static int setEnabled(JNIEnv *env, jobject clazz, jboolean on) {

int enable = on;

int ret = write_sysfs_int("buffer/enable", 0);

if (ret < 0)

return -1;

ret = write_sysfs_int("power_state", 1);

if (ret < 0)

return -1;

ret = write_sysfs_int("motion_lpa_on", enable);

if (ret < 0)

return -1;

if (enable) {

ret = write_sysfs_int("motion_lpa_threshold", 31 * 32);

if (ret < 0)

return -1;

ret = write_sysfs_int("motion_lpa_duration", 200);

if (ret < 0)

return -1;

ret = write_sysfs_int("motion_lpa_freq", 2);

if (ret < 0)

return -1;

}

ret = write_sysfs_int("buffer/length", 6);

if (ret < 0)

return -1;

ret = write_sysfs_int("accl_enable", 1);

if (ret < 0)

return -1;

ret = write_sysfs_int("buffer/enable", 1);

if (ret < 0)

return -1;

ret = write_sysfs_int("irq_wake_enable", enable);

if (ret < 0)

return -1;

staticEnabled = on;

return 0;

}

static JNINativeMethod gMethods[] = {

{"_setEnabled", "(Z)I", (void*)setEnabled},

{"_isEnabled", "()Z", (void*)isEnabled},

{"_setReferenceStatus", "()I", (void*)setReferenceStatus},

{"_setThreshold", "(I)V", (void*)setThreshold},

{"_getThreshold", "()I",(void*)getThreshold},

{"_setReference","(III)V", (void*)setReference},

{"_getReference", "()[I", (void*)getReference},

};

int register_android_server_GSensorService(JNIEnv *env) {

return jniRegisterNativeMethods(env, "com/android/server/GSensorService",

gMethods, NELEM(gMethods));

}

frameworks/base/services/java/com/android/server/GSensorService.java

public void setEnabled(boolean isEnabled) throws RemoteException {

mContext.enforceCallingOrSelfPermission(android.Manifest.permission.WRITE_SETTINGS, null);

Settings.System.putInt(mContext.getContentResolver(),Settings.System.GSENSOR_ENABLE,

isEnabled ? 1:0 );

int res = _setEnabled(isEnabled);

Intent intent = new Intent(GSensorManager.ACTION_STATE_CHANGED);

if (res == 0) {

//Send broadcast message to everyone else

intent.putExtra(GSensorManager.EXTRA_STATE, true);

} else {

intent.putExtra(GSensorManager.EXTRA_STATE, false);

}

intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);

Log.d(TAG,"gsensor gesture State Change Intent true");

mContext.sendBroadcast(intent);

}

private native int _setEnabled(boolean isEnabled);

private native boolean _isEnabled();

private native int _setReferenceStatus();

private native void _setThreshold(int level);

private native int _getThreshold();

private native void _setReference(int x, int y, int z);

private native int[] _getReference();

这样的关系我实在是不明白,希望各位看到的给与指点。

时间: 2024-07-29 16:40:04

android4.3从app到kernel代码追踪gsensor所遇到的问题的相关文章

GCC扩展(转--对看kernel代码有帮助

Linux Kernel的代码,上次就发现一个结构体的定义形式看不懂,后来才知道它用的不是标准的ANSI C,而是GCC的一些扩展.刚好看到<Linux内核修炼之道>中对GCC扩展有所描述,转载一下吧,对看kernel代码有所帮助. 3.5内核代码的特点 Linux内核同时使用C语言和汇编语言实现,C语言编写的代码移植性较好.易于维护,而汇编语言编写的代码相当于针对特定的平台做了优化,速度较快,所以需要在它们之间寻找一定的平衡. 一般而言,在体系结构的底层或对执行时间要求严格的地方,会使用汇编

Eclipse快捷键 之 代码追踪

在使用Java编写复杂一些的程序时,你会不会常常对一层层的继承关系和一次次方法的调用感到迷惘呢?幸亏我们有了Eclipse这么好的IDE可以帮我们理清头绪--这就要使用Eclipse强大的代码追踪功能. 1.用Open Declaration可以查看类.方法和变量的声明.这是最常用的一个功能了,如果在要追踪的对象上点右键,选择Open Declaration,可以跳转到其声明的地方.这个功能有个快捷键是F3,当然你也可以按住Ctrl键,鼠标移过去会变成一个小手,单击就可以了. 2.用Open T

微信app支付python代码实现

微信app支付python代码(使用weixin-python==0.5.4) 微信app支付python代码(python2) python3应该差不多, 官方文档: https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_1 业务流程: 商户系统和微信支付系统主要交互说明: #步骤1:用户在商户APP中选择商品,提交订单,选择微信支付. 用户在app页面选择商品,确定数量,提交订单,提供必要的参数 app支付需要的前端参数 1

[Linux] __init &amp; __setup 等宏的代码追踪

Platform:Linux 3.0.35 模仿 fbmem.c 的代码添加了 __setup 却无法触发效果(代码如下),所以原本的打算是追一下这个 __setup 的流程,结果还牵扯到了 kernel 初始化的一些相关知识,在此作简单记录. static int __init my_video_setup(char *options) { printk("%s-------------------------%s\n",__FUNCTION__, options); return

小蚂蚁学习APP接口开发(7)—— APP接口实例——读取缓存方式开发APP接口的代码案例

从数据库中直接读取数据,虽然时效性很强,但是对数据库造成很大压力,尤其是在高访问量的情况下.这时候可以通过缓存,来有效的缓解了这一压力,虽然时效性有些不足,但是服务器的抗压能力却达到了很大的提高. 读取缓存方式的中心思想: 当请求进来时,先查看是否有缓存,如果有并且缓存还在有效时间内,不再查询数据库,直接返回缓存即可:如果没有或者已经过了有效时间,查询数据库,返回数据,同时生成一份新的缓存,供以后使用. 代码案例,还是在前几天的代码基础上进行改造完善. File静态缓存类    (原来的代码请参

git,代码管理,代码追踪

零.说明 本文就以下几个问题来说明:   1.如何使用git建立仓库.   2.如何使用git获取代码和推送代码   3.使用web来查看git仓库代码. 一.如何使用git建立仓库.建立仓库的步骤很简单,按以下步骤操作即可.首先创建git组和用户1.groupadd git2.useradd git -g git3.passwd git4.sudo vi /etc/passwd默认git用户是没有设置登陆目录,切默认脚本为sh,极不好用.修改passwd,找到git的那一行,修改为:git:x

PopMetal和PX2上运行upstream linux kernel代码

Rockchip的平台,以其强大的性能和丰富的功能,在开源社区大受欢迎,Linux内核对其提供越来越丰富的支持. Linux内核目前发布的最新稳定版本是Linux 4.2,Linux 4.3的合并窗口已经打开,大概下周会发布rc1版本,最终的稳定版本 会在一两个月内发布.在Linux内核的每一个版本中,都会合并国内外大量Linux kernel hacker们为Rockchip平台提交的代码,使得 upstream对Rockchip平台的支持越来越完善. Chipspark打造的两款开发板PX2

APP 打包混淆代码

APP项目开发完成之后,当测试人员测试了,没有Bug了,一般情况下,公司会有一些技术人员负责发布.推广APP产品.这是一般正规的大公司会有专门的市场推广部门,技术维护部门,对APP进行加密混淆打包,如:使用Ant加密,还有使用第三方的加密方式(爱加密,梆梆,APKProtect等).想必APP产品为什么需要加密混淆,做为开发人员.老板都明白其中的隐含之处.然而,还有一种方式可以打包混淆APP,那就是 android 通过eclipse混淆代码 打包 + proguard 方式.具体的步骤如下:

App安全之代码混淆

参考: http://www.cnblogs.com/sunzn/archive/2013/03/06/2946952.html http://www.apkbus.com/android-240707-1-1.html 1.在项目根目录找到project.properties文件,将下图中圈出来的代码注释去除,即申明我们的混淆文件为proguard-project.txt: 2.在项目根目录找到proguard-project.txt文件,按需求添加修改以下代码: # 指定代码的压缩级别 -o