androidnative的简单介绍

http://www.itjxue.com  2023-01-15 12:06  来源:未知  点击次数: 

Android中怎么查看native方法的定义

在Android里面,init程序会解析 Init.rc文件,然后启动很多Native Service。如何查看这些service的状态呢,查看init的源代码,发现所有的native service的信息都会保存到系统属性里面。这样就可以用下面的命令查看各个Service的状态。

# getprop |grep init.svc

getprop |grep init.svc

[init.svc.servicemanager]: [running]

[init.svc.vold]: [running]

[init.svc.netd]: [running]

[init.svc.debuggerd]: [running]

[init.svc.omsril-daemon]: [running]

[init.svc.sdm]: [running]

[init.svc.zygote]: [running]

[init.svc.media]: [running]

[init.svc.dbus]: [running]

[init.svc.installd]: [running]

[init.svc.keystore]: [running]

[init.svc.lapisrv]: [running]

[init.svc.console]: [running]

[init.svc.tcmd-autolaunch]: [stopped]

[init.svc.tel]: [stopped]

[init.svc.pxa920-setup]: [stopped]

[init.svc.logcat]: [running]

[init.svc.logcat-radio]: [running]

[init.svc.dnsmasq]: [running]

[init.svc.powerpolicy]: [stopped]

[init.svc.adbd]: [running]

[init.svc.telserver]: [stopped]

[init.svc.bootanim]: [stopped]

[init.svc.fmradiod]: [stopped]

[init.svc.wpa_supplicant]: [running]

[init.svc.dhcpcd]: [running]

Android 中Native方法是怎样调用的

1. Power.java-- find corresponding native cfile(查找对应的具体用C实现的C文件)

android.os.Power.java -------- native file ----.../jni/android_os_Power.c

2. in android_os_Power.c, you canfind:

static JNINativeMethod method_table[]= // Native functiontable

{

{"acquireWakeLock", "(ILjava/lang/String;)V", (void*)acquireWakeLock},

{"releaseWakeLock", "(Ljava/lang/String;)V", (void*)releaseWakeLock},

{"setLastUserActivityTimeout", "(J)I",(void*)setLastUserActivityTimeout },

{"setScreenState", "(Z)I", (void*)setScreenState },

{"shutdown", "()V", (void*)android_os_Power_shutdown },

{ "reboot","(Ljava/lang/String;)V", (void*)android_os_Power_reboot },

};

int register_android_os_Power(JNIEnv *env)// function to register mapping tablefrom name to function

{

returnAndroidRuntime::registerNativeMethods(

env, "android/os/Power",

method_table, NELEM(method_table));

}

3. in /framework/base/core/jni , a file named:AndroidRuntime.cpp

3.1) a global register function array

static const RegJNIRec gRegJNI[] =

{

...

register_android_os_Power,

}

3.2) Register native function process

int AndroidRuntime::startReg(JNIEnv* env)

or

Java_com_android_internal_util_WithFramework_registerNatives(...)

or

Java_LoadClass_registerNatives(....)

--- register_jni_procs(gRegJNI, NELEM(gRegJNI),env)

--- foreach(member of gRegJNI) call register_XXX_XXX_XXX..XXX() //so here register_android_os_power() will becalled

--- AndroidRuntime::registerNativeMethods(env, class_namelike "android/os/Power", method table like method_table,size)

--- jniRegisterNativeMethods(env, className,gMethods, numMethods)

--pEnv-RegisterNatives(env, clazz, gMethods,numMethods) ;

-- foreach(method) calldvmRegisterJNIMethod(ClassObject* clazz, const char*methodName,

constchar* signature, void* fnPtr)

-- calldvmSetNativeFunc(method, dvmCallSynchronizedJNIMethod, fnPtr); //for sycn method

or

call dvmSetNativeFunc(method, dvmCallJNIMethod,fnPtr);

-- ((Method*)method)-insns = insns; // set actual codespace to be executed for a native function

4.calling a native method ( JNI method)

void dvmPlatformInvoke(void* pEnv,ClassObject* clazz, int argInfo, int argc,

const u4*argv, const char* shorty, void* func, JValue*pReturn)

dvmCallMethod() /dvmInvokeMethod

--- if(dvmIsNativeMethod(method))

{

(*method-nativeFunc)(self-curFrame,retval, method, self);

}

如何分析,定位Android Native Crash

android framework分为java和native两层

native运行于C的runtime,高效。一般java层只是封装,通过jni访问native底层HAL,driver的crash也会导致上层的crash

,有效利用Log信息并对其进行分析与实时的监控管理,对于分析Android手机发生Crash的原因具有极为重要的作用。

Android Log 文件类型

由于Android上的应用程序千差万别,出现的问题也不尽相同。不过Bug类型还是有规律可循的,可以根据生成的Log文件找到相应的错误,通常错误信息里记录了错误的大致位置,据此可以捕获到问题的关键信息。

Log文件记录着每次操作的信息,在出现问题后可以借助log信息分析以达到解决问题的目的,Log文件类型主要分为以下几种:

(1) Logcat: Main缓存日志,通过运行logcat命令,可以获得系统中使用的标记和优先级的列表,也可以加上过滤器进行表达式限制,只输出测试人员及研发人员感兴趣的标记-优先级组合。

……………………

(2) Bugreport: Java应用程序Crash时会产生一个Bugreport文件,该文件主要包括三个方面的内容:

Dumpstate:内存信息,Cpu信息,Procrank信息,系统日志,Vm Trace信息等。

Build.Prop:当前版本、当前命令、显示系统Build的一些属性等;

Dumpsys:Dump Of Service Meminfo(显示某个进程更详细的内存消耗情况以及Native And Java (Dalvik)堆栈的统计数) ;

(3) Crashdump: 每次Crash都会产生一个Crashdump文件,文件包括主日志,Java 堆栈信息,本地调用堆栈,虚拟机/进程堆,Log缓存,内存信息,进程列表,Modem信息,Adb Log等信息;

(4) Bratlog: 测试用例及详细信息;

(5) Logalong: 事件,如手机通讯功能信息等;

(6) Pullfs: Traces(Java 堆栈信息);

(7) Procrank: Uss(Unique Set Size) 值,进程独自占用的物理内存。

(责任编辑:IT教学网)

更多

推荐软件水平考试文章