-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlecture-on-android-system-source-code.html
More file actions
555 lines (389 loc) · 20.5 KB
/
lecture-on-android-system-source-code.html
File metadata and controls
555 lines (389 loc) · 20.5 KB
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
<!DOCTYPE html>
<html>
<head>
<!-- [[! Document Settings ]] -->
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<!-- [[! Page Meta ]] -->
<title>记一次Android系统源代码技术分享</title>
<meta name="description" content="与机器,人,神共舞 - 编程,读书,思考,旅行,与机器对话,与人交谈,对神发问,探索,体验人生美丽的风景" />
<meta name="HandheldFriendly" content="True" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="shortcut icon" href="/assets/images/favicon.ico" >
<!-- [[! Styles'n'Scripts ]] -->
<link rel="stylesheet" type="text/css" href="/assets/css/screen.css" />
<link rel="stylesheet" type="text/css"
href="//fonts.googleapis.com/css?family=Merriweather:300,700,700italic,300italic|Open+Sans:700,400" />
<link rel="stylesheet" type="text/css" href="/assets/css/syntax.css" />
<!-- [[! Ghost outputs important style and meta data with this tag ]] -->
<link rel="canonical" href="/" />
<meta name="referrer" content="origin" />
<link rel="next" href="/page2/" />
<meta property="og:site_name" content="与机器,人,神共舞" />
<meta property="og:type" content="website" />
<meta property="og:title" content="与机器,人,神共舞" />
<meta property="og:description" content="编程,读书,思考,旅行,与机器对话,与人交谈,对神发问,探索,体验人生美丽的风景" />
<meta property="og:url" content="/" />
<meta property="og:image" content="/assets/images/cover1.jpg" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="与机器,人,神共舞" />
<meta name="twitter:description" content="编程,读书,思考,旅行,与机器对话,与人交谈,对神发问,探索,体验人生美丽的风景" />
<meta name="twitter:url" content="/" />
<meta name="twitter:image:src" content="/assets/images/cover1.jpg" />
<script type="application/ld+json">
{
"@context": "http://schema.org",
"@type": "Website",
"publisher": "Tao's Page",
"url": "/",
"image": "/assets/images/cover1.jpg",
"description": "编程,读书,思考,旅行,与机器对话,与人交谈,对神发问,探索,体验人生美丽的风景"
}
</script>
<meta name="generator" content="Jekyll 3.0.0" />
<link rel="alternate" type="application/rss+xml" title="与机器,人,神共舞" href="/rss.xml" />
</head>
<body class="home-template nav-closed">
<div class="nav">
<h3 class="nav-title">Menu</h3>
<a href="#" class="nav-close">
<span class="hidden">Close</span>
</a>
<ul>
<li class="nav-home " role="presentation"><a href="/">Home</a></li>
<li class="nav-about " role="presentation"><a href="/about.html">About</a></li>
<li class="nav-fables " role="presentation"><a href="/tag/machine/">Machine</a></li>
<li class="nav-speeches " role="presentation"><a href="/tag/human/">Human</a></li>
<li class="nav-fiction " role="presentation"><a href="/tag/god/">God</a></li>
<li class="nav-author " role="presentation"><a href="/author/hetao/">Author</a></li>
</ul>
<a class="subscribe-button icon-feed" href="/vocab.html">Apps</a>
</div>
<span class="nav-cover"></span>
<div class="site-wrapper">
<!-- [[! Everything else gets inserted here ]] -->
<!-- default -->
<!-- The comment above "< default" means - insert everything in this file into -->
<!-- the [body] of the default.hbs template, which contains our header/footer. -->
<!-- Everything inside the #post tags pulls data from the post -->
<!-- #post -->
<header class="main-header post-head no-cover">
<nav class="main-nav clearfix">
</nav>
</header>
<main class="content" role="main">
<article class="post tag-machine">
<header class="post-header">
<h1 class="post-title">记一次Android系统源代码技术分享</h1>
<section class="post-meta">
<!-- <a href='/'>Tao He</a> -->
<time class="post-date" datetime="2017-11-23">23 Nov 2017</time>
<!-- [[tags prefix=" on "]] -->
on
<a href='/tag/machine'>Machine</a>
</section>
</header>
<section class="post-content">
<p>今年年后换了工作,决定继续做Android开发,到了公司一段时间后,受架构组同学之邀,做一次技术分享,当时感觉很头疼,因为我在Android技术组,如果分享这几年C++的技术经验,显然不合时宜,也对组里的同事没有什么帮助,如果分享Android应用的开发,貌似又在班门弄斧,自己在Android方面本来就是半路出家,实在没有什么可分享的干货,正在为难之际,突然想到在之前的公司有段时间一直在阅读Android系统源代码,一直试图能更深入的了解系统的结构和原理,因此也有了一些心得,正好可以与同事分享,也对大家的开发有所帮助,所以有了这篇小记。</p>
<p>这篇小记有点类似一个ppt,其实就是那次分享我用markdown格式写的一个ppt,是一个我要讲述的一个提纲,防止我讲跑题了。</p>
<h3 id="如何概览">如何概览?</h3>
<ul>
<li>
<p>要见代码 - 要了解如何通过源代码构建Android系统, 了解Android系统的一些基础设施</p>
</li>
<li>
<p>要读代码 - 通过阅读代码,理解Android系统的基本结构和特点</p>
</li>
</ul>
<blockquote>
<p>Reading the fucking source code</p>
</blockquote>
<h4 id="下载编译和运行android系统源代码">下载,编译和运行Android系统源代码</h4>
<h5 id="工程环境">工程环境</h5>
<ul>
<li>
<p>推荐Ubuntu系统</p>
</li>
<li>
<p>Git</p>
</li>
<li>
<p>Java SDK</p>
</li>
<li>
<p>依赖包</p>
</li>
</ul>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo apt-get install flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl
</code></pre></div></div>
<h5 id="下载android系统源代码">下载Android系统源代码</h5>
<ul>
<li>
<p>repo工具</p>
</li>
<li>
<p>参见Google官方文档</p>
</li>
</ul>
<h5 id="编译android系统源代码">编译Android系统源代码</h5>
<p><strong>make it</strong></p>
<p><strong>哪有那么顺利,如果编译错误请Google错误信息,逐个解决之</strong></p>
<p><strong>编译成功后,会在out/target/product/generic/ 目录下生成多个img文件</strong></p>
<h5 id="运行android模拟器">运行Android模拟器</h5>
<ul>
<li>
<p>镜像文件 - zImage system.img userdata.img ramdisk.img</p>
</li>
<li>
<p>设置环境变量</p>
</li>
<li>
<p>运行模拟器</p>
</li>
</ul>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>emulator
</code></pre></div></div>
<h5 id="下载编译和运行android内核源代码">下载,编译和运行Android内核源代码</h5>
<h4 id="jni">JNI</h4>
<ul>
<li>
<p>Java call Native</p>
</li>
<li>
<p>Native call Java</p>
</li>
<li>
<p>静态注册</p>
<ul>
<li>
<p>先编写Java代码,然后编译生成.class文件</p>
</li>
<li>
<p>javah -o output packagename.classname</p>
</li>
</ul>
</li>
<li>
<p>动态注册</p>
</li>
</ul>
<blockquote>
<p>MediaScanner.java</p>
</blockquote>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>private static native final void native_init()
</code></pre></div></div>
<blockquote>
<p>android_media_MediaScanner.cpp</p>
</blockquote>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>static void android_media_MediaScanner_native_init(JNIEnv *env)
static JNINativeMethod gMethods[]
</code></pre></div></div>
<h4 id="天字号进程---init">天字号进程 - init</h4>
<ul>
<li>
<p>Linux系统中用户空间的第一个进程</p>
</li>
<li>
<p>创建zygote</p>
</li>
<li>
<p>属性服务</p>
</li>
</ul>
<blockquote>
<p>init.c</p>
</blockquote>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>int main(int argc, char **argv)
void service_start(struct service *svc, const char *dynamic_args)
</code></pre></div></div>
<blockquote>
<p>parser.c</p>
</blockquote>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>int parse_config_file(const char *fn)
</code></pre></div></div>
<blockquote>
<p>keywords.h</p>
</blockquote>
<blockquote>
<p>init.rc</p>
</blockquote>
<blockquote>
<p>builtins.c</p>
</blockquote>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>int do_class_start(int nargs, char **args)
</code></pre></div></div>
<blockquote>
<p>property_service.c</p>
</blockquote>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>void property_init(void)
</code></pre></div></div>
<blockquote>
<p>libc_init_dynamic.c</p>
</blockquote>
<blockquote>
<p>system_properties.c</p>
</blockquote>
<blockquote>
<p>properties.c</p>
</blockquote>
<h4 id="java世界的盘古---zygote">Java世界的盘古 - Zygote</h4>
<ul>
<li>
<p>zygote - app_process</p>
</li>
<li>
<p>apk程序,其父都是zygote</p>
</li>
<li>
<p>startVm</p>
</li>
<li>
<p>startReg</p>
</li>
</ul>
<blockquote>
<p>app_main.cpp</p>
</blockquote>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>int main(int argc, const char* const argv[])
</code></pre></div></div>
<blockquote>
<p>AndroidRuntime.cpp</p>
</blockquote>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>void AndroidRuntime::start(const char* className, const bool startSystemSerever)
</code></pre></div></div>
<blockquote>
<p>ZygoteInit.java</p>
</blockquote>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>public static void main(String argv[])
private static void registerZygoteSocket()
// preloaded-classes file
private static void preloadClasses()
private static void preloadResources() {
</code></pre></div></div>
<h4 id="zygot的嫡长子--system_server">Zygot的嫡长子 -system_server</h4>
<ul>
<li>
<p>Java世界半边天</p>
</li>
<li>
<p>Java世界的核心Service都在这里启动</p>
</li>
</ul>
<blockquote>
<p>dalvik_system_zygote.c</p>
</blockquote>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>static void Dalvik_dalvik_system_Zygote_forkAndSpecialize(const u4* args, JValue* pResult)
static void Dalvik_dalvik_system_Zygote_forkSystemServer(const u4* args, JValue* pResult)
static void setSignalHandler()
static void sigchldHandler(int s)
</code></pre></div></div>
<blockquote>
<p>RuntimeInit.java</p>
</blockquote>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>public static final void zygoteInit(String[] argv) throws ZygoteInit.MethodAndArgsCaller {
</code></pre></div></div>
<blockquote>
<p>System_Server.java</p>
</blockquote>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>public static void main(String[] args) {
native public static void init1(String[] args);
public static final void init2() {
</code></pre></div></div>
<blockquote>
<p>com_android_server_SystemServer.cpp</p>
</blockquote>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>static void android_server_SystemServer_init1(JNIEnv* env, jobject clazz)
</code></pre></div></div>
<blockquote>
<p>system_init.c</p>
</blockquote>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>extern "C" status_t system_init()
</code></pre></div></div>
<blockquote>
<p>ActivityManagerService.java</p>
</blockquote>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>private final void startProcessLocked(ProcessRecord app,
</code></pre></div></div>
<blockquote>
<p>Process.java</p>
</blockquote>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>public static final int start(final String processClass,
final String niceName,
int uid, int gid, int[] gids,
int debugFlags,
String[] zygoteArgs)
private static int startViaZygote(final String processClass,
final String niceName,
final int uid, final int gid,
final int[] gids,
int debugFlags,
String[] extraArgs)
throws ZygoteStartFailedEx {
private static int zygoteSendArgsAndGetPid(ArrayList<String> args)
throws ZygoteStartFailedEx {
</code></pre></div></div>
<blockquote>
<p>ZygoteConnection.java</p>
</blockquote>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>boolean runOnce() throws ZygoteInit.MethodAndArgsCaller {
</code></pre></div></div>
<h4 id="智能指针---refbase-sp-wp">智能指针 - RefBase sp wp</h4>
</section>
<footer class="post-footer">
<!-- Everything inside the #author tags pulls data from the author -->
<!-- #author-->
<!-- Add Disqus Comments -->
</footer>
</article>
</main>
<aside class="read-next">
<!-- [[! next_post ]] -->
<a class="read-next-story no-cover" href="/policy-and-people-will">
<section class="post">
<h2>政策与民意</h2>
<p>政策,这个词在我们这个国家被普遍使用,几乎人人理解其含义,就连目不识丁的老农都会说出这样的话:“中央又出新政策了”,这个词我们是如此的熟悉,以至于我们常常都不会去想政策到底是什么,它是如何制定出来的?我们普通老百姓是否影响到了政策的制定? 也许一般的理解是老百姓哪能影响到政策的制定,照老农的说法,那是中央出的政策,和我们这些小老百姓有啥关系,这么理解也没错,毕竟在我们这个国家,显然普通民众的权利实在有限,但是此处我并不想讨论政策的制定和出台,只是想探究已出台的,与民生息息相关的这些个政策,到底有没有民意的基础,民意是否影响到了政策的制定? 要讨论这个问题,拿北京这几年的一些政策法规的例子最好不过了。
先说北京房子的限购,以及相关联的所谓的抑制房价过快上涨的各种政策手段,但凡有点经济学常识的人,都知道这些政策只会让房价更高,增加更多购房成本,但是这些政策还是出来了,政府有什么考虑我们不得而知,但是呼吁出台这些政策的民意绝对是存在的,这种呼声绝对不是少数,甚至有一些经济学家也在为这种政策摇旗呐喊,就无怪乎普通民众有这种诉求了。而这种大多数的诉求就成了普遍的民意基础,使这种违背基本经济学常识的政策不再是空中楼阁。房价的这个例子也许会因房价问题本来就错综复杂而变得更加说不清道不明,那可以再看一例:网约车。
在网约车还没有出现之前,我们的选择只有出租车和所谓的黑车,出行体验如何,只要在烈日和寒风中打过出租车的人都应该知道那是一种什么样的服务,自从有了网约车,如滴滴打车后,我们的出行体验有了巨大的改观。那种打车难的时代一去不复返了,但是好景不长,很快政策对网约车出台了一系列不友好政策,之后的打车体验明显不如之前,这种政策也明显违背市场经济规律,但是它照样堂而皇之的出台了,你以为这是出租车利益集团的反扑,但是别忘了,这背后还有很坚实的民意基础,网约车存在的一些问题总是能让很多普通民众认为监管是必须的,政府必须介入才能让他们有安全感,但其实这些问题难道出租车就不存在吗?不希冀于市场竞争,而总幻想依赖政府强力,这种普遍的认知构成了一种可怕的,无望的民意,渗透进我们生活中的方方面面。
这种可怕的认知,在今年年底北京出现的两件重要的事情中更是体现的淋漓尽致,也许这些政策普通民众并不能左右,但民众的普遍认知构成了民意基础,因为在大部分人的认知中并没有达成这样的共识:有些事只能交给市场,政府干预只会扰乱市场;私有财产神圣不可侵犯;贩夫走卒,不高端的人群也有公民权;这些在文明社会都普遍达成的共识并未深入人心。这些个看似荒谬的政策既是权力意志的体现,也少不了那可怕民意的影子。
</p>
</section>
</a>
<!-- [[! /next_post ]] -->
<!-- [[! prev_post ]] -->
<a class="read-next-story prev no-cover" href="/select-qrc-code-library-in-andord">
<section class="post">
<h2>Android开发中二维码库的选用</h2>
<p>在现今的移动App开发中,二维码的使用场景变得越来越普遍,最近我要开发的一个需求就必须生成二维码,自然就面临二维码库选用的问题,因为大名鼎鼎的ZXing的存在,这也本不是什么特别需要考虑的问题。但是因为ZXing的大而全,要在一款只是将二维码作为一个特定使用场景下的一个功能的App,完全引入ZXing就有点过了,所以就面临了ZXing库的裁剪问题。但是裁剪这样一个大而全的多平台支持的库也不是什么简单的事情,所以我也顺便调研了其他的二维码库作为参考:
OnBarCode http://www.onbarcode.com/products/android_barcode/barcodes/qrcode.html#intro
Barcode4j http://barcode4j.sourceforge.net/
QRGenerator
https://github.com/androidmads/QRGenerator
https://androidmads.blogspot.com/2016/07/qr-code-generator-library.html
当然了,这些库实现我的需求都是没有问题的,但是最终我还是在我的项目中选用了ZXing,一来是因为它在业界的广泛使用得到了充分的验证,二来是因为我们项目组其他的同事也会在未来的需求中使用到,所以必须选用一个长期的可靠的的解决方案。当然了,我是选用了一版裁剪后的ZXing库。至于这个库的使用其实没有什么好说的,因为使用起来非常简单,简单的几个事例就能明白如何应用。
</p>
</section>
</a>
<!-- [[! /prev_post ]] -->
</aside>
<!-- /post -->
<footer class="site-footer clearfix">
<section class="copyright"><a href="/">与机器,人,神共舞</a> © 2024</section>
</footer>
</div>
<!-- [[! Ghost outputs important scripts and data with this tag ]] -->
<script type="text/javascript" src="https://code.jquery.com/jquery-1.11.3.min.js"></script>
<!-- [[! The main JavaScript file for Casper ]] -->
<script type="text/javascript" src="/assets/js/jquery.fitvids.js"></script>
<script type="text/javascript" src="/assets/js/index.js"></script>
<!-- Add Google Analytics -->
<!-- Google Analytics Tracking code -->
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-78960009-1', 'auto');
ga('send', 'pageview');
</script>
</body>
</html>