在Android23版本里,可以使用native_activityh接口实现一个完整的native activity,在使用的时候,要确认回调函数不能阻塞主UI线程。
Native_app_glue静态辅助库为另一个线程中的事件循环提供了回调,而且非常容易使用,可以参考native-activity示例程序。
首先,在Eclipse中创建一个android项目,在项目的根目录下新建一个jni目录用于存放所有的本地代码。
其次是native-activity/AndroidManifestxml 文件内容:
<xml version="10"encoding="utf-8">
<!-- BEGIN_INCLUDE(manifest) -->
<manifest xmlns:android="
package="comexamplenative_activity"
android:versionCode="1"
android:versionName="10">
<!-- This is the platform API where NativeActivity was introduced -->
<!-- 本地活动将引入的平台 API -->
<uses-sdk android:minSdkVersion="8" />
<!-- This apk has no Java code itself, so set hasCode to false -->
<!-- 该 apk 没有 Java 代码,所以设置 hasCode 属性值为假 -->
<application android:label="@string/app_name"
android:hasCode="false">
<!-- Our activity is the built-in NativeActivity framework class
This will take care of integrating with our NDK code -->
<!-- 我们的活动是内置本地活动框架类。
这将处理使我们的 NDK 代码成为一体。 -->
<activity android:name="androidappNativeActivity"
android:label="@string/app_name"
android:configChanges="orientation|keyboardHidden">
<!-- Tell NativeActivity the name of or so -->
<!-- 告知本地活动共享库的名字 -->
<meta-data android:name="androidapplib_name"
android:value="native-activity" />
<intent-filter>
<action android:name="androidintentactionMAIN" />
<category android:name="androidintentcategoryLAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
<!-- END_INCLUDE(manifest) -->
需要注释掉node_modules/react-native/packager/react-native-xcodesh中的最后一段关于“react-nativebundle”的命令调用,并不需要这个 *** 作。
整个程序结束后,或者专业的说,进程结束后,申请的内存是会被释放的,但是这要依靠底层 *** 作系统内存管理模块的实现机制,不同的实现机制释放内存的时间也不相同。不过,作为一个良好的习惯,申请内存和释放内存应该成对出现。
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信息等。
BuildProp:当前版本、当前命令、显示系统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) 值,进程独自占用的物理内存。
BootExecute──属于启动执行的一个项目
可以通过它来实现启动Natvice程序,Native程序在驱动程序和系统核心加载后将被加载,此时会话管理器(smssexe)进行windowsNT用户模式并开始按顺序启动native程序
它位于注册表中〔HKEY_LOCAL_MACHINE\System\ControlSet001\Session Manager\〕下面,有一个名为BootExecute的多字符串值键,它的默认值是"autocheck autochk ",用于系统启动时的某些自动检查。这个启动项目里的程序是在系统图形界面完成前就被执行的,所以具有很高的优先级。
启动有很多种方法,不光有一个run和启动文件夹。
如下项目都会在开机时启动。
1)“启动”文件夹——最常见的自启动程序文件夹。
它位于系统分区的“documents and Settings-->User-->〔开始〕菜单-->程序”目录下。这时的User指的是登录的用户名。
2)“All Users”中的自启动程序文件夹——另一个常见的自启动程序文件夹。
它位于系统分区的“documents and Settings-->All User-->〔开始〕菜单-->程序”目录下。前面提到的“启动”文件夹运行的是登录用户的自启动程序,而“All Users”中启动的程序是在所有用户下都有效(不论你用什么用户登录)。
3)“Load”键值—— 一个埋藏得较深的注册表键值。
位于〔HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows\load〕主键下。
4)“Userinit”键值——用户相关
它则位于〔HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\Userinit〕主键下,也是用于系统启动时加载程序的。一般情况下,其默认值为“userinitexe”,由于该子键的值中可使用逗号分隔开多个程序,因此,在键值的数值中可加入其它程序。
5)“Explorer\Run”键值——与“load”和“Userinit”两个键值不同的是,“Explorer\Run”同时位于〔HKEY_CURRENT_USER〕和〔HKEY_LOCAL_MACHINE〕两个根键中。
它在两个中的位置分别为(HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run〕和〔HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run〕下。
6)“RunServicesOnce”子键——它在用户登录前及其它注册表自启动程序加载前面加载。
这个键同时位于〔HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce〕和〔HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce〕下。
7)“RunServices”子键——它也是在用户登录前及其它注册表自启动程序加载前面加载。
这个键同时位于〔HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServices〕和〔HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices〕下。
8)“RunOnce\Setup”子键——其默认值是在用户登录后加载的程序。
这个键同时位于〔HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce\Setup〕和〔HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce\Setup〕下。
9)“RunOnce”子键——许多自启动程序要通过RunOnce子键来完成第一次加载。
这个键同时位于〔HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce〕和〔HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce〕下。位于〔HKEY_CURRENT_USER〕根键下的RunOnce子键在用户登录扣及其它注册表的Run键值加载程序前加载相关程序,而位于〔HKEY_LOCAL_MACHINE〕主键下的Runonce子键则是在 *** 作系统处理完其它注册表Run子键及自启动文件夹内的程序后再加载的。在Windows XP中还多出一个〔HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnceEX〕子键,其道理相同。
10)“Run”子键——目前最常见的自启动程序用于加载的地方。
这个键同时位于〔HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run〕和〔HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run〕下。
其中位于〔HKEY_CURRENT_USER〕根键下的Run键值紧接着〔HKEY_LOCAL_MACHINE〕主键下的Run键值启动,但两个键值都是在“启动”文件夹之前加载。
11)再者就是Windows中加载的服务了,它的级别较高,用于最先加载。
其位于〔HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services〕下,看到了吗,你所有的系统服务加载程序都在这里了!
12)Windows Shell——系统接口
它位于〔HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\〕下面的Shell字符串类型键值中,基默认值为Explorerexe,当然可能木马程序会在此加入自身并以木马参数的形式调用资源管理器,以达到欺骗用户的目的。
13)BootExecute——属于启动执行的一个项目
可以通过它来实现启动Natvice程序,Native程序在驱动程序和系统核心加载后将被加载,此时会话管理器(smssexe)进行windowsNT用户模式并开始按顺序启动native程序
它位于注册表中〔HKEY_LOCAL_MACHINE\System\ControlSet001\Session Manager\〕下面,有一个名为BootExecute的多字符串值键,它的默认值是"autocheck autochk ",用于系统启动时的某些自动检查。这个启动项目里的程序是在系统图形界面完成前就被执行的,所以具有很高的优先级。
14)策略组加载程序——打开Gpeditmsc,展开“用户配置——管理模板——系统——登录”,就可以看到“在用户登录时运行这些程序”的项目,你可以在里面添加。
在注册表中[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Group Policy Objects\本地User\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run]你也可以看到相对应的键值。
在Android里面,init程序会解析 Initrc文件,然后启动很多Native Service。如何查看这些service的状态呢,查看init的源代码,发现所有的native service的信息都会保存到系统属性里面。这样就可以用下面的命令查看各个Service的状态。
# getprop |grep initsvc
getprop |grep initsvc
[initsvcservicemanager]: [running]
[initsvcvold]: [running]
[initsvcnetd]: [running]
[initsvcdebuggerd]: [running]
[initsvcomsril-daemon]: [running]
[initsvcsdm]: [running]
[initsvczygote]: [running]
[initsvcmedia]: [running]
[initsvcdbus]: [running]
[initsvcinstalld]: [running]
[initsvckeystore]: [running]
[initsvclapisrv]: [running]
[initsvcconsole]: [running]
[initsvctcmd-autolaunch]: [stopped]
[initsvctel]: [stopped]
[initsvcpxa920-setup]: [stopped]
[initsvclogcat]: [running]
[initsvclogcat-radio]: [running]
[initsvcdnsmasq]: [running]
[initsvcpowerpolicy]: [stopped]
[initsvcadbd]: [running]
[initsvctelserver]: [stopped]
[initsvcbootanim]: [stopped]
[initsvcfmradiod]: [stopped]
[initsvcwpa_supplicant]: [running]
[initsvcdhcpcd]: [running]
以上就是关于如何开发 native-activity 工程全部的内容,包括:如何开发 native-activity 工程、如何使用xCode运行reactnative程序,打包发布、native进程内存泄漏kill掉后会释放吗等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)