重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
Zygote可以说是Android开发面试很高频的一道问题, 但总有小伙伴在回答这道问题总不能让面试满意, 在这你就要搞清楚面试问你对Zygote的理解时,他最想听到的和其实想问的应该是哪些? 下面我们通过以下几点来剖析这道问题!
成都创新互联主要从事成都网站建设、成都网站设计、网页设计、企业做网站、公司建网站等业务。立足成都服务洪湖,10年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:18982081108
Zygote的作用分为两点:
关于这个问题答出了这两点那就是OK了。可能大部分小伙伴可能能答出第二点,第一点就不是很清楚。SystemServer也是Zygote启动的,因为SystemServer需要用到Zygote准备好的系统资源包括:
直接从Zygote继承过来就不需要重新加载过来,那么对性能将会有很大的提升。
在说Zygote启动流程之前, 先明确一个概念:启动三段式, 这个可以理解为Android中进程启动的常用套路, 分为三步骤:
这里要了解LOOP循环是什么,其实LOOP作用是不停地 接受消息 , 处理消息 ,消息的来源可以是 Soket 、 MessageQueue 、 Binder 驱动发过来的消息,但无论消息从哪里来,它整个流程都是去接受消息,处理消息。这个启动三段式,它不光是Zygote进程是这样的,只要是有独立进程的,比如说系统服务进程,自己的应用进程都是如此。
Zygote进程的启动取决于init进程,init进程是它是linux启动之后用户空间的第一个进程,下面看一下 启动流程 :
3.启动配置文件中定义的系统服务,其中Zygote服务就是定义在配置中的
4.同时启动的服务除了Zygote之外还有一些别的系统服务也是会启动的,比如说ServiceManager进程,它是通过fork+execve系统调用启动的
在init.rc 文件中会import /init.${ro.zygote}.rc,init.zygoteXX,XX指的是32或者64,对我们没差我们直接看init.zygote32.rc即可。配置文件比较长,这里做了截取保留了Zygot相关的部分。
说完了启动配置呢,这里来聊一下启动进程, 启动进程有两种方式:
第一种:fork+handle
第二种:fork+execve
两者看起来差不多,首先首先都会调用fork函数创建子进程,这个函数比较奇特会返回两次,子进程返回一次,父进程返回一次。 区别在于:
主要分为两部分Native层处理和Java层处理,Zygote进程启动之后,它执行了execve系统调用,它执行的是用C++写的二进制的可执行程序里的main函数作为入口,然后在Java层运行!
先来看一下Native层的处理流程
在app_main.cpp文件,AndroidRuntime.cpp文件。我们可以找到几个主要函数名
根据上述代码,你会发现在我们的应用里直接就可以 JNI 调用了,并不需要创建虚拟机。因为应用进程是Zygote进程孵化出来的,继承了父进程的拥有虚拟机,只需要重置数据即可。
接着看一下Java层的处理,具体可参考ZygoteInit文件的main方法
1.预加载资源,比如常用类库、主题资源及一些共享库等
2.启动SystemServer进程
3.进入Socket 的Loop循环 会看到的ZygoteServer.runSelectLoop(…)调用
Zygote启动流程中需要主要以下2点问题
最后
系统bug,网络问题。
1、系统bug是android开发软件系统出现了问题导致第三方应用不能调用,等待官方修复即可。
2、网络问题是自身设备连接的网络出现较大波动,导致android开发软件第三方应用不能调用,更换网络重新打开即可。
一、前言
这系列文章是自己在平时开发过程中遇到的问题。之前只是记在云笔记上面,现在整理一下,发出来共享。
ps:像那些什么没有注册Activity呀,权限呀等最基本的就不再赘述。
二、ADB连接异常
有时我们发现,即使自己从任务管理器里面把adb.exe给干掉了,但还是不行,这时,你就可以尝试以下操作:
[2014-07-30 17:09:11 - QtActivity] The connection to adb is down, and a severe error has occured.
[2014-07-30 17:09:11 - QtActivity] You must restart adb and Eclipse.
[2014-07-30 17:09:11 - QtActivity] Please ensure that adb is correctly located at ‘D:\InstallFile\AndroidDevelop\ADT\sdk\platform-tools\adb.exe’ and can be executed.
adb起动失败:
1,杀掉其它的adb.exe看,如果不行,
2,看sdk\tools路径下面有没有
hprof-conv.exe
如果有,则把它复制到sdk\platform_tools下
3,如果没有,刚看sdk\platform_tools下有没有
hprof-conv.exe
如果有,刚复制到tools下。
4,如果两者都没有,刚下一个
hprof-conv.exe
三、java.lang.IllegalStateException: Activity has been destroyed
这个异常在切换Fragment中比较容易出现,稍不注意就会出现如下异常:
FATAL EXCEPTION: main12-0909:20:14.689: E/AndroidRuntime(31223): java.lang.IllegalStateException: Activity has been destroyed12-0909:20:14.689: E/AndroidRuntime(31223): at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1365)12-0909:20:14.689: E/AndroidRuntime(31223): at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)12-0909:20:14.689: E/AndroidRuntime(31223): at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:574)12-0909:20:14.689: E/AndroidRuntime(31223): at cn.com.topsky.community.tfd.DongTaiFragment.init(DongTaiFragment.java:209)12-0909:20:14.689: E/AndroidRuntime(31223): at cn.com.topsky.community.tfd.DongTaiFragment.onCreateView(DongTaiFragment.java:68)12-0909:20:14.689: E/AndroidRuntime(31223): at android.support.v4.app.Fragment.performCreateView(Fragment.java:1500)12-0909:20:14.689: E/AndroidRuntime(31223): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:927)12-0909:20:14.689: E/AndroidRuntime(31223): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)12-0909:20:14.689: E/AndroidRuntime(31223): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)12-0909:20:14.689: E/AndroidRuntime(31223): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467)12-0909:20:14.689: E/AndroidRuntime(31223): at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:440)12-0909:20:14.689: E/AndroidRuntime(31223): at android.os.Handler.handleCallback(Handler.java:605)12-0909:20:14.689: E/AndroidRuntime(31223): at android.os.Handler.dispatchMessage(Handler.java:92)12-0909:20:14.689: E/AndroidRuntime(31223): at android.os.Looper.loop(Looper.java:154)12-0909:20:14.689: E/AndroidRuntime(31223): at android.app.ActivityThread.main(ActivityThread.java:4624)12-0909:20:14.689: E/AndroidRuntime(31223): at java.lang.reflect.Method.invokeNative(Native Method)12-0909:20:14.689: E/AndroidRuntime(31223): at java.lang.reflect.Method.invoke(Method.java:511)12-0909:20:14.689: E/AndroidRuntime(31223): atcom.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:809)12-0909:20:14.689: E/AndroidRuntime(31223): atcom.android.internal.os.ZygoteInit.main(ZygoteInit.java:576)12-0909:20:14.689: E/AndroidRuntime(31223): at dalvik.system.NativeStart.main(Native Method)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
经查,说这个是当前android-support-v4版本的一个bug,因为在当fragment进行到detached状态时,它会重置它的内部状态。
然而,它并没有重置mChildFragmentManager.这导致在Fragment重新attach时,它(fragment)没有重新attachm childFragmentManager,从而引发了上面的异常.
解决方案:
在每个调用getChildFragmentManager()的fragment中复写onDetach()方法:
@OverridepublicvoidonDetach() {super.onDetach();try{Field childFragmentManager = Fragment.class.getDeclaredField("mChildFragmentManager");childFragmentManager.setAccessible(true);childFragmentManager.set(this,null);}catch(NoSuchFieldException e) {thrownewRuntimeException(e);}catch(IllegalAccessException e) {thrownewRuntimeException(e);}}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
四、java.lang.IllegalArgumentException: Illegal character in query at index
这个异常,在我们拼接请求参数时,可能会碰到,原因是里面的特殊字符转换异常。解决办法如下:
url转换问题
String url = baseUrl + “?” + “name=” + name + “age=” + age;
url = url.replaceAll(“”, “%26”);
url = url.replaceAll(” “, “%20”);
解释如下:
特殊符号替换符号
?%3F
%26
|%124
=%3D
#%23
/%2F
+%2B
%%25
空格%20
五、eclipse连接小米2S调试程序的问题
虽然快2年没用过eclipse了,但这个问题还是贴出来,也许正好有正在用eclipse的同学遇到了此问题:
小米Mi2S连接到eclipse上无法识别。即使开启了调试模式,也无法识别.终于找到了一个可用的方法。
方法
用数据线连接手机和电脑。
打开手机拨号界面。
在拨号界面按 # #717717# # 自动就开启了。
在通知栏会出现一个 Diag USB port enable。
当然,应该是需要ROOT权限的。
这时候你的PC机会弹出安装设备驱动。
如果不成功,多插拔几次试试。
ok!安装完就搞定了!这时候打开eclipse就会在Driver里面看到你的手机了。
注意事项
在PC机上安装新硬件向导时候可能会遭遇到缺少dll文件,比如我就遇到缺少了WinUSBCoInstaller2.dll,这个问题。这时候就要去网上找找喽。这个东西分x64 和 x86的,注意不要搞错了!
如果先打开eclipse,再安装的话,可能导致eclipse挂掉,不明原因,可能是我机器配置不行。两次均有这种状况。所以建议先安装后再开eclipse。