哪些代码是运行在App进程的?哪些又是运行在system_server进程
1 一般Android SDK里面的代码都是运行在我们APP进程的,一般sdk里面是android.jar,其实也就是我们编译出的framework.jar,因为我们app需要依赖sdk才可以编译通过,说明各个app肯定会使用sdk中的代码,这个块代码属于所有app共用,故修改其中的一个类就会影响所有的应用进程
2 一般com.android.server.*相关的类都是运行在system_server,这一部分平时是接触不太到的,因为普通应用根本无法引入相关的server代码,因为这些代码属于system_server特殊应用自己的代码,普通应用只能通过跨进程通信的方式与其通信获取相关数据及接受控制,一般java代码对于的是services.jar
主要jar介绍
- framework-res.apk:android系统资源库
- framework.jar:android的sdk中核心代码
- services.jar:框架层服务端的编译后jar包
面对实际项目需求到底该修改哪一块的代码呢?修改原则是什么?
需要具体分析需求,按一下几步的优先级进行
1、明确业务需求,分析业务是否可以应用层面(即App的业务代码)通过标准接口实现,如果是真实的项目又同时要考虑到是否这个App可能被其他的第三方应用替代,或者被卸载等
2、如果业务代码无法通过标准接口实现,则再考虑应用程序的框架修改是否可以实现,也就是前面说的android sdk部分,即framework.jar,要考虑该部分代码是运行于所有的app,要考虑功耗影响,及稳定性,尽量把修改面变小,不可以修改sdk的标准接口,只能考虑新加,但是接口的具体实现可以根据情况修改,修改错误也可能黑屏
3、framework.jar部分的框架也无法满足时候,就需要考System_server中去修改相关的Service等是否可以满足,这一部分更需要谨慎修改,一不小心很可能导致系统无法启动黑屏
源码分析方式
-主动调用型,跟着源码一步步一行行的分析(如startActivity)
-被动调用型,即我们可能只知道结果方法,回调方法,需要反推从哪里调用过来的(如Activity的onCreate)
日志打印技巧
java端跟踪调用堆栈方法,通过log可以看到源代码如何运行。
Log.i(“test1”,“oncreate”,new Exception());
/**
* Send a {@link #INFO} log message and log the exception.
* @param tag Used to identify the source of a log message. It usually identifies
* the class or activity where the log call occurs.
* @param msg The message you would like logged.
* @param tr An exception to log
*/
public static int i(String tag, String msg, Throwable tr) {
return println(LOG_ID_MAIN, INFO, tag, msg + '\n' + getStackTraceString(tr));
}
3、日志分析
######联系人进程调用startActivity,会最后调用AMS的startActivity
07-18 16:56:49.770 2590 2590 I test1 : client execStartActivity
07-18 16:56:49.770 2590 2590 I test1 : java.lang.Exception
07-18 16:56:49.770 2590 2590 I test1 : at android.app.Instrumentation.execStartActivity(Instrumentation.java:1611)
07-18 16:56:49.770 2590 2590 I test1 : at android.app.Activity.startActivityForResult(Activity.java:4493)
07-18 16:56:49.770 2590 2590 I test1 : at android.support.v4.app.BaseFragmentActivityApi16.startActivityForResult(BaseFragmentActivityApi16.java:54)
07-18 16:56:49.770 2590 2590 I test1 : at android.support.v4.app.FragmentActivity.startActivityForResult(Unknown Source:0)
07-18 16:56:49.770 2590 2590 I test1 : at android.app.Activity.startActivityForResult(Activity.java:4451)
07-18 16:56:49.770 2590 2590 I test1 : at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:725)
07-18 16:56:49.770 2590 2590 I test1 : at android.app.Activity.startActivity(Activity.java:4812)
07-18 16:56:49.770 2590 2590 I test1 : at android.app.Activity.startActivity(Activity.java:4780)
07-18 16:56:49.770 2590 2590 I test1 : at com.android.contacts.util.ImplicitIntentsUtil.startActivityInApp(ImplicitIntentsUtil.java:82)
07-18 16:56:49.770 2590 2590 I test1 : at com.android.contacts.util.AccountFilterUtil.startEditorIntent(AccountFilterUtil.java:205)
07-18 16:56:49.770 2590 2590 I test1 : at com.android.contacts.activities.PeopleActivity
5.
o
n
C
l
i
c
k
(
P
e
o
p
l
e
A
c
t
i
v
i
t
y
.
j
a
v
a
:
542
)
07
−
1816
:
56
:
49.77025902590
I
t
e
s
t
1
:
a
t
a
n
d
r
o
i
d
.
v
i
e
w
.
V
i
e
w
.
p
e
r
f
o
r
m
C
l
i
c
k
(
V
i
e
w
.
j
a
v
a
:
6294
)
07
−
1816
:
56
:
49.77025902590
I
t
e
s
t
1
:
a
t
a
n
d
r
o
i
d
.
v
i
e
w
.
V
i
e
w
5.onClick(PeopleActivity.java:542) 07-18 16:56:49.770 2590 2590 I test1 : at android.view.View.performClick(View.java:6294) 07-18 16:56:49.770 2590 2590 I test1 : at android.view.View
5.onClick(PeopleActivity.java:542)07−1816:56:49.77025902590Itest1:atandroid.view.View.performClick(View.java:6294)07−1816:56:49.77025902590Itest1:atandroid.view.ViewPerformClick.run(View.java:24770)
07-18 16:56:49.770 2590 2590 I test1 : at android.os.Handler.handleCallback(Handler.java:790)
07-18 16:56:49.770 2590 2590 I test1 : at android.os.Handler.dispatchMessage(Handler.java:99)
07-18 16:56:49.770 2590 2590 I test1 : at android.os.Looper.loop(Looper.java:164)
07-18 16:56:49.770 2590 2590 I test1 : at android.app.ActivityThread.main(ActivityThread.java:6494)
07-18 16:56:49.770 2590 2590 I test1 : at java.lang.reflect.Method.invoke(Native Method)
07-18 16:56:49.770 2590 2590 I test1 : at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
07-18 16:56:49.770 2590 2590 I test1 : at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
##########System_server进程的AMS startActivity 打印,从方法堆栈在可以看出属于binder驱动调用,肯定无法看到联系人进程的堆栈
07-18 16:56:49.774 1522 1533 I test1 : system_server startActivity callingPackage == com.android.contacts
07-18 16:56:49.774 1522 1533 I test1 : java.lang.Exception
07-18 16:56:49.774 1522 1533 I test1 : at com.android.server.am.ActivityManagerService.startActivity(ActivityManagerService.java:4519)
07-18 16:56:49.774 1522 1533 I test1 : at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:121)
07-18 16:56:49.774 1522 1533 I test1 : at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2919)
07-18 16:56:49.774 1522 1533 I test1 : at android.os.Binder.execTransact(Binder.java:697)
##########System_server进程的AMS一切处理完毕,需要通知联系人进程拉起新的Activity
07-18 16:56:49.779 1522 1533 I test1 : system_server app.thread.scheduleLaunchActivity
07-18 16:56:49.779 1522 1533 I test1 : java.lang.Exception
07-18 16:56:49.779 1522 1533 I test1 : at com.android.server.am.ActivityStackSupervisor.realStartActivityLocked(ActivityStackSupervisor.java:1457)
07-18 16:56:49.779 1522 1533 I test1 : at com.android.server.am.ActivityStackSupervisor.startSpecificActivityLocked(ActivityStackSupervisor.java:1580)
07-18 16:56:49.779 1522 1533 I test1 : at com.android.server.am.ActivityStack.resumeTopActivityInnerLocked(ActivityStack.java:2726)
07-18 16:56:49.779 1522 1533 I test1 : at com.android.server.am.ActivityStack.resumeTopActivityUncheckedLocked(ActivityStack.java:2255)
07-18 16:56:49.779 1522 1533 I test1 : at com.android.server.am.ActivityStackSupervisor.resumeFocusedStackTopActivityLocked(ActivityStackSupervisor.java:2094)
07-18 16:56:49.779 1522 1533 I test1 : at com.android.server.am.ActivityStack.completePauseLocked(ActivityStack.java:1486)
07-18 16:56:49.779 1522 1533 I test1 : at com.android.server.am.ActivityStack.activityPausedLocked(ActivityStack.java:1413)
07-18 16:56:49.779 1522 1533 I test1 : at com.android.server.am.ActivityManagerService.activityPaused(ActivityManagerService.java:7442)
07-18 16:56:49.779 1522 1533 I test1 : at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:317)
07-18 16:56:49.779 1522 1533 I test1 : at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2919)
07-18 16:56:49.779 1522 1533 I test1 : at android.os.Binder.execTransact(Binder.java:697)
##########通过binder通信调用到了联系人进程的scheduleLaunchActivity方法
07-18 16:56:49.800 2590 2703 D test1 : scheduleLaunchActivity
07-18 16:56:49.800 2590 2703 D test1 : java.lang.Exception
07-18 16:56:49.800 2590 2703 D test1 : at android.app.ActivityThread
A
p
p
l
i
c
a
t
i
o
n
T
h
r
e
a
d
.
s
c
h
e
d
u
l
e
L
a
u
n
c
h
A
c
t
i
v
i
t
y
(
A
c
t
i
v
i
t
y
T
h
r
e
a
d
.
j
a
v
a
:
787
)
07
−
1816
:
56
:
49.80025902703
D
t
e
s
t
1
:
a
t
a
n
d
r
o
i
d
.
a
p
p
.
I
A
p
p
l
i
c
a
t
i
o
n
T
h
r
e
a
d
ApplicationThread.scheduleLaunchActivity(ActivityThread.java:787) 07-18 16:56:49.800 2590 2703 D test1 : at android.app.IApplicationThread
ApplicationThread.scheduleLaunchActivity(ActivityThread.java:787)07−1816:56:49.80025902703Dtest1:atandroid.app.IApplicationThreadStub.onTransact(IApplicationThread.java:196)
07-18 16:56:49.800 2590 2703 D test1 : at android.os.Binder.execTransact(Binder.java:697)
##########联系人应用的主线程调用Activity的onCreate方法
07-18 16:56:49.808 2590 2590 I test1 : Activity onCreate
07-18 16:56:49.808 2590 2590 I test1 : java.lang.Exception
07-18 16:56:49.808 2590 2590 I test1 : at android.app.Activity.onCreate(Activity.java:995)
07-18 16:56:49.808 2590 2590 I test1 : at android.support.v4.app.SupportActivity.onCreate(SupportActivity.java:66)
07-18 16:56:49.808 2590 2590 I test1 : at android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:290)
07-18 16:56:49.808 2590 2590 I test1 : at android.support.v7.app.AppCompatActivity.onCreate(AppCompatActivity.java:84)
07-18 16:56:49.808 2590 2590 I test1 : at com.android.contacts.activities.AppCompatTransactionSafeActivity.onCreate(AppCompatTransactionSafeActivity.java:33)
07-18 16:56:49.808 2590 2590 I test1 : at com.android.contacts.AppCompatContactsActivity.onCreate(AppCompatContactsActivity.java:81)
07-18 16:56:49.808 2590 2590 I test1 : at com.android.contacts.activities.ContactEditorActivity.onCreate(ContactEditorActivity.java:315)
07-18 16:56:49.808 2590 2590 I test1 : at android.app.Activity.performCreate(Activity.java:7005)
07-18 16:56:49.808 2590 2590 I test1 : at android.app.Activity.performCreate(Activity.java:6996)
07-18 16:56:49.808 2590 2590 I test1 : at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214)//核心调用方法
07-18 16:56:49.808 2590 2590 I test1 : at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2731)//核心调用方法
07-18 16:56:49.808 2590 2590 I test1 : at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)//核心调用方法
07-18 16:56:49.808 2590 2590 I test1 : at android.app.ActivityThread.-wrap11(Unknown Source:0)
07-18 16:56:49.808 2590 2590 I test1 : at android.app.ActivityThread
H
.
h
a
n
d
l
e
M
e
s
s
a
g
e
(
A
c
t
i
v
i
t
y
T
h
r
e
a
d
.
j
a
v
a
:
1589
)
07
−
1816
:
56
:
49.80825902590
I
t
e
s
t
1
:
a
t
a
n
d
r
o
i
d
.
o
s
.
H
a
n
d
l
e
r
.
d
i
s
p
a
t
c
h
M
e
s
s
a
g
e
(
H
a
n
d
l
e
r
.
j
a
v
a
:
106
)
07
−
1816
:
56
:
49.80825902590
I
t
e
s
t
1
:
a
t
a
n
d
r
o
i
d
.
o
s
.
L
o
o
p
e
r
.
l
o
o
p
(
L
o
o
p
e
r
.
j
a
v
a
:
164
)
07
−
1816
:
56
:
49.80825902590
I
t
e
s
t
1
:
a
t
a
n
d
r
o
i
d
.
a
p
p
.
A
c
t
i
v
i
t
y
T
h
r
e
a
d
.
m
a
i
n
(
A
c
t
i
v
i
t
y
T
h
r
e
a
d
.
j
a
v
a
:
6494
)
07
−
1816
:
56
:
49.80825902590
I
t
e
s
t
1
:
a
t
j
a
v
a
.
l
a
n
g
.
r
e
f
l
e
c
t
.
M
e
t
h
o
d
.
i
n
v
o
k
e
(
N
a
t
i
v
e
M
e
t
h
o
d
)
07
−
1816
:
56
:
49.80825902590
I
t
e
s
t
1
:
a
t
c
o
m
.
a
n
d
r
o
i
d
.
i
n
t
e
r
n
a
l
.
o
s
.
R
u
n
t
i
m
e
I
n
i
t
H.handleMessage(ActivityThread.java:1589) 07-18 16:56:49.808 2590 2590 I test1 : at android.os.Handler.dispatchMessage(Handler.java:106) 07-18 16:56:49.808 2590 2590 I test1 : at android.os.Looper.loop(Looper.java:164) 07-18 16:56:49.808 2590 2590 I test1 : at android.app.ActivityThread.main(ActivityThread.java:6494) 07-18 16:56:49.808 2590 2590 I test1 : at java.lang.reflect.Method.invoke(Native Method) 07-18 16:56:49.808 2590 2590 I test1 : at com.android.internal.os.RuntimeInit
H.handleMessage(ActivityThread.java:1589)07−1816:56:49.80825902590Itest1:atandroid.os.Handler.dispatchMessage(Handler.java:106)07−1816:56:49.80825902590Itest1:atandroid.os.Looper.loop(Looper.java:164)07−1816:56:49.80825902590Itest1:atandroid.app.ActivityThread.main(ActivityThread.java:6494)07−1816:56:49.80825902590Itest1:atjava.lang.reflect.Method.invoke(NativeMethod)07−1816:56:49.80825902590Itest1:atcom.android.internal.os.RuntimeInitMethodAndArgsCaller.run(RuntimeInit.java:438)
07-18 16:56:49.808 2590 2590 I test1 : at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)