{"id":79,"date":"2015-09-24T08:13:56","date_gmt":"2015-09-24T08:13:56","guid":{"rendered":"https:\/\/boochlin.com\/?p=79"},"modified":"2026-09-16T09:54:17","modified_gmt":"2026-09-16T09:54:17","slug":"android-%e9%96%8b%e7%99%bc%e8%b3%87%e6%ba%90%e6%95%b4%e7%90%86","status":"publish","type":"post","link":"https:\/\/boochlin.com\/?p=79","title":{"rendered":"Android \u597d\u6587\u6574\u7406\uff1a\u5f9e 2015 \u883b\u8352\u6ce5\u6dd6\u5230\u73fe\u4ee3\u5de5\u7a0b\uff0c\u6bbf\u5802\u7d1a\u5927\u795e\u8207\u5de5\u7a0b Blog \u7d42\u6975\u5730\u5716"},"content":{"rendered":"<p>\u9019\u7bc7\u6587\u7ae0\u6700\u65e9\u5beb\u65bc 2015 \u5e74 9 \u6708\u3002<\/p>\n<p>\u56de\u982d\u770b\u7576\u5e74\u7684\u7b46\u8a18\uff0c\u771f\u7684\u6eff\u6eff\u90fd\u662f\u300c\u6642\u4ee3\u7684\u773c\u6dda\u300d\u2014\u2014\u90a3\u6642\u6211\u5011\u9084\u5728\u7528 Eclipse \u8f49 Android Studio \u7684\u75db\u82e6\u9663\u75db\u671f\uff0c\u70ba\u4e86\u4e00\u500b MultiDex 65536 \u65b9\u6cd5\u6578\u9650\u5236\u641e\u5230\u7126\u982d\u721b\u984d\uff0c\u9084\u5728\u5c08\u6848\u88e1\u624b\u628a\u624b\u523b GreenDAO\uff0c\u8b80\u8457 Google I\/O 2015 \u7684 100 \u5929\u6311\u6230\u3002<\/p>\n<p>\u5341\u5e74\u904e\u53bb\u4e86\uff0cAndroid \u65e9\u5df2\u5f9e Dalvik \u865b\u64ec\u6a5f\u9032\u5c55\u5230\u6210\u719f\u7684 ART\u3001\u5f9e Java 7\/8 \u8a9e\u6cd5\u7cd6\u8de8\u8d8a\u5230 Kotlin Coroutines \u8207\u7de8\u8b6f\u5668 IR \u63d2\u4ef6\u3001\u5f9e XML \u547d\u4ee4\u5f0f\u8996\u5716\u5168\u9762\u8f49\u5411 Jetpack Compose \u8072\u660e\u5f0f\u6e32\u67d3\u5f15\u64ce\u3002\u5982\u679c\u73fe\u5728\u9084\u62ff 2015 \u5e74\u90a3\u7a2e\u9ce5\u9ce5\u7684\u7b46\u8a18\u4f86\u4ea4\u5dee\uff0c\u5be6\u5728\u592a\u5c0d\u4e0d\u8d77\u6280\u8853\u8ffd\u6c42\u3002<\/p>\n<p>\u9019\u4e00\u6b21\uff0c\u6211\u5011\u5fb9\u5e95\u6253\u6389\u91cd\u7df4\uff0c\u68b3\u7406\u51fa\u4e00\u4efd\u771f\u6b63\u80fd\u6253\u7a7f\u5e95\u5c64\u7684<strong>\u6bbf\u5802\u7d1a\u5927\u795e\u6587\u7ae0\u8207\u4e16\u754c\u9802\u7d1a Engineering Blog \u7d42\u6975\u5c0e\u8b80\u5730\u5716<\/strong>\u3002<\/p>\n<p>\u62d2\u7d55\u6c34\u6587\u8207\u6d6e\u8e81\u7684 API \u642c\u904b\uff0c\u6bcf\u4e00\u7bc7\u90fd\u76f4\u64ca\u4f4d\u5143\u7d44\u78bc\u8b8a\u63db\u3001IPC \u8a18\u61b6\u9ad4\u6a21\u578b\u3001\u5716\u5f62\u6e32\u67d3\u7ba1\u7dda\u3001\u5354\u7a0b\u72c0\u614b\u6a5f\u8207\u865b\u64ec\u6a5f\u6975\u9650\u512a\u5316\u3002<\/p>\n<hr>\n<h1>\u4e00\u3001 \u6bbf\u5802\u7d1a\u5927\u795e\u8207\u5176\u4e00\u751f\u5fc5\u8b80\u4ee3\u8868\u4f5c<\/h1>\n<h3>1. Jake Wharton (Android \u958b\u6e90\u6559\u7236)<\/h3>\n<ul>\n<li><strong>\u500b\u4eba\u7ad9\u9ede<\/strong>\uff1a<a href=\"https:\/\/jakewharton.com\/\">jakewharton.com<\/a><\/li>\n<li><strong>\u5fc5\u8b80\u795e\u4f5c\u7bc7\u7ae0<\/strong>\uff1a\n<ol>\n<li><strong>\u300aAndroid&#39;s Java 8 Support: Desugaring \u7cfb\u5217 (Parts 1 ~ 4)\u300b<\/strong>\n<ul>\n<li><strong>\u5e95\u5c64\u89c0\u9ede<\/strong>\uff1a\u6df1\u5165 D8\/R8 \u4f4d\u5143\u7d44\u78bc\u812b\u7cd6\uff08Desugaring\uff09\u6a5f\u5236\u3002\u5256\u6790\u7de8\u8b6f\u671f\u5982\u4f55\u5c07 Lambda \u8868\u9054\u5f0f\u8f49\u63db\u70ba\u5408\u6210\u985e\uff08Synthetic Classes\uff09\u3001\u65b9\u6cd5\u5f15\u7528\u7684\u975c\u614b\u8f49\u767c\u3001\u4ecb\u9762\u9810\u8a2d\u65b9\u6cd5\uff08Interface Default Methods\uff09\u5982\u4f55\u964d\u7d1a\u70ba Companion Class \u975c\u614b\u547c\u53eb\uff0c\u4ee5\u53ca <code>try-with-resources<\/code> \u8207 Java 8 API \u5728\u820a\u7248 Android \u4e0a\u7684 Backporting \u7b56\u7565\u3002<\/li>\n<\/ul>\n<\/li>\n<li><strong>\u300aExploring Kotlin\u2019s Hidden Costs\u300b<\/strong>\n<ul>\n<li><strong>\u5e95\u5c64\u89c0\u9ede<\/strong>\uff1a\u89e3\u69cb\u7de8\u8b6f\u5668\u70ba\u958b\u767c\u8005\u4fbf\u5229\u6027\u4ed8\u51fa\u7684\u300c\u96b1\u6027\u904b\u884c\u6642\u4ee3\u50f9\u300d\u2014\u2014\u5305\u62ec Boxing\/Unboxing\u3001\u6cdb\u578b\u985e\u578b\u64e6\u9664\u5f15\u767c\u7684 Synthetic Bridge Methods\u3001\u5167\u90e8\u985e\u5b58\u53d6\u5916\u90e8\u79c1\u6709\u6210\u54e1\u5f15\u767c\u7684 Accessor \u751f\u6210\u3001\u4ee5\u53ca Kotlin \u9810\u8a2d\u53c3\u6578\u751f\u6210\u7684\u984d\u5916 <code>synthetic bitmask<\/code> \u65b9\u6cd5\u3002<\/li>\n<\/ul>\n<\/li>\n<li><strong>\u300aNon-transitive R Classes (app:nonTransitiveRClass)\u300b<\/strong>\n<ul>\n<li><strong>\u5e95\u5c64\u89c0\u9ede<\/strong>\uff1a\u89e3\u6790\u5927\u898f\u6a21\u591a\u6a21\u7d44\u5c08\u6848\u4e2d <code>R.java<\/code> \u7b26\u865f\u81a8\u8139\u8207 AAPT \u91cd\u8907\u7de8\u8b6f\u7684\u6839\u672c\u539f\u56e0\uff0c\u63a8\u52d5 AGP \u963b\u65b7 R \u985e\u8de8\u6a21\u7d44\u50b3\u905e\uff0c\u5927\u5e45\u7e2e\u6e1b DEX \u9ad4\u7a4d\u4e26\u91cb\u653e Gradle \u589e\u91cf\u7de8\u8b6f\u8207\u5feb\u53d6\u80fd\u529b\u3002<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<\/li>\n<li><strong>\u70ba\u4ec0\u9ebc\u5fc5\u8b80\uff08\u5de5\u7a0b\u50f9\u503c\uff09<\/strong>\uff1a<br \/>\nJake Wharton \u64c1\u6709\u300c\u7de8\u8b6f\u671f\u8207\u4f4d\u5143\u7d44\u78bc\u300d\u7684\u4e0a\u5e1d\u8996\u89d2\u3002\u8b80\u4ed6\u7684\u6587\u7ae0\u80fd\u8b93\u4f60\u7a7f\u900f\u8a9e\u6cd5\u7cd6\uff0c\u76f4\u63a5\u770b\u7a7f\u7de8\u8b6f\u5668\u751f\u6210\u4e86\u4ec0\u9ebc DEX \u6307\u4ee4\u3001\u9020\u6210\u4e86\u591a\u5c11\u5806\u914d\u7f6e\u8207\u865b\u64ec\u5206\u6d3e\uff08virtual dispatch\uff09\u958b\u92b7\u3002<\/li>\n<\/ul>\n<hr>\n<h3>2. Roman Elizarov (\u524d Kotlin \u5c08\u6848\u8ca0\u8cac\u4eba\u3001\u5354\u7a0b\u67b6\u69cb\u8a2d\u8a08\u5e2b)<\/h3>\n<ul>\n<li><strong>\u500b\u4eba\u5c08\u6b04<\/strong>\uff1a<a href=\"https:\/\/elizarov.medium.com\/\">elizarov.medium.com<\/a><\/li>\n<li><strong>\u5fc5\u8b80\u795e\u4f5c\u7bc7\u7ae0<\/strong>\uff1a\n<ol>\n<li><strong>\u300aStructured Concurrency\u300b<\/strong>\n<ul>\n<li><strong>\u5e95\u5c64\u89c0\u9ede<\/strong>\uff1a\u63d0\u51fa\u73fe\u4ee3\u4f75\u767c\u7684\u7bc4\u5f0f\u8f49\u79fb\u2014\u2014\u4f75\u767c\u4efb\u52d9\u7d55\u4e0d\u80fd\u662f\u300c\u5c04\u5f8c\u4e0d\u7406\u300d\u7684\u57f7\u884c\u7dd2\u555f\u52d5\u3002\u4efb\u52d9\u7684\u751f\u547d\u9031\u671f\u5fc5\u9808\u7531\u8a9e\u6cd5\u4f5c\u7528\u57df\uff08Lexical Scope\uff09\u56b4\u683c\u754c\u5b9a\uff1b\u5b50\u5354\u7a0b\u751f\u547d\u9031\u671f\u8207\u7236\u5354\u7a0b\u7d81\u5b9a\uff0c\u7570\u5e38\u5411\u4e0b\u50b3\u905e\u8207\u53d6\u6d88\u5411\u4e0a\u7d1a\u806f\uff0c\u7d42\u7d50\u7dda\u7a0b\u6d29\u6f0f\u8207\u6bad\u5c4d\u4e26\u884c\u3002<\/li>\n<\/ul>\n<\/li>\n<li><strong>\u300aCold flows, hot channels \/ Shared flows, broadcast channels\u300b<\/strong>\n<ul>\n<li><strong>\u5e95\u5c64\u89c0\u9ede<\/strong>\uff1a\u5fb9\u5e95\u91d0\u6e05\u8cc7\u6599\u6d41\u7684\u672c\u8cea\u908a\u754c\u3002\u300cFlow \u662f\u51b7\u7684\u300d\uff08\u53ea\u6709 collect \u6642\u624d\u555f\u52d5\u751f\u7522\u8005\uff09\uff1b\u300cChannel \u662f\u71b1\u7684\u300d\uff08\u4f5c\u70ba\u7368\u7acb\u5354\u7a0b\u9593\u50b3\u905e\u8cc7\u6599\u7684\u7ba1\u9053\uff09\u3002\u9032\u4e00\u6b65\u95e1\u8ff0\u4ee5 <code>StateFlow<\/code> \/ <code>SharedFlow<\/code> \u5ee2\u68c4 <code>BroadcastChannel<\/code> \u7684\u67b6\u69cb\u539f\u56e0\uff0c\u8a73\u89e3 <code>replay<\/code> \u5feb\u53d6\u8207\u80cc\u58d3\u6ea2\u51fa\u7b56\u7565\u3002<\/li>\n<\/ul>\n<\/li>\n<li><strong>\u300aThe reason why coroutine exceptions don&#39;t get swallowed\u300b<\/strong>\n<ul>\n<li><strong>\u5e95\u5c64\u89c0\u9ede<\/strong>\uff1a\u63ed\u958b CoroutineExceptionHandler\u3001Job \u968e\u5c64\u8207 <code>SupervisorJob<\/code> \u7684\u771f\u5be6\u908a\u754c\u3002\u89e3\u91cb\u70ba\u4f55\u666e\u901a <code>try-catch<\/code> \u5305\u4e0d\u4f4f\u975e\u672c\u5c64\u7d1a\u7684\u5354\u7a0b\u7570\u5e38\u3001\u4ee5\u53ca root coroutine \u5728 scope \u5167\u5d29\u6f70\u6642\u7684\u64f4\u6563\u93c8\u3002<\/li>\n<\/ul>\n<\/li>\n<li><strong>\u300aBlocking threads, suspending coroutines\u300b<\/strong>\n<ul>\n<li><strong>\u5e95\u5c64\u89c0\u9ede<\/strong>\uff1a\u672c\u8cea\u5c0d\u6bd4 OS \u6838\u5fc3\u57f7\u884c\u7dd2\u963b\u585e\uff08Thread.park\u3001CPU \u4e0a\u4e0b\u6587\u5207\u63db\u3001\u6838\u5fc3\u68e7\u8abf\u5ea6\uff09\u8207\u5354\u7a0b\u639b\u8d77\uff08CPS \u8f49\u63db\u3001\u7522\u751f Continuation \u72c0\u614b\u6a5f\u3001\u975e\u963b\u585e\u91cb\u653e\u7dda\u7a0b\u6c60\uff09\u3002<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<\/li>\n<li><strong>\u70ba\u4ec0\u9ebc\u5fc5\u8b80\uff08\u5de5\u7a0b\u50f9\u503c\uff09<\/strong>\uff1a<br \/>\n\u5beb\u597d Kotlin \u4f75\u767c\u7684\u300c\u8056\u7d93\u300d\u3002\u4e0d\u7406\u89e3 Roman \u7684\u8a2d\u8a08\u54f2\u5b78\uff0c\u5c31\u6c38\u9060\u7121\u6cd5\u5fb9\u5e95\u89e3\u6c7a Android \u958b\u767c\u4e2d\u751f\u547d\u9031\u671f\u6d29\u6f0f\u3001\u4f75\u767c\u7af6\u614b\uff08Race Condition\uff09\u3001\u4ee5\u53ca\u7570\u5e38\u5d29\u6f70\u88ab\u672a\u9810\u671f\u541e\u566c\u7684\u9811\u75be\u3002<\/li>\n<\/ul>\n<hr>\n<h3>3. Romain Guy (Google Android \u5716\u5f62\u5b50\u7cfb\u7d71\u9818\u5c0e\u67b6\u69cb\u5e2b)<\/h3>\n<ul>\n<li><strong>\u500b\u4eba\u7ad9\u9ede<\/strong>\uff1a<a href=\"https:\/\/www.curious-creature.com\/\">curious-creature.com<\/a> \u8207 <a href=\"https:\/\/medium.com\/@romainguy\">Medium @romainguy<\/a><\/li>\n<li><strong>\u5fc5\u8b80\u795e\u4f5c\u7bc7\u7ae0<\/strong>\uff1a\n<ol>\n<li><strong>\u300aAndroid Graphics Pipeline \/ The Road to RenderThread\u300b<\/strong>\n<ul>\n<li><strong>\u5e95\u5c64\u89c0\u9ede<\/strong>\uff1a\u6df1\u5ea6\u89e3\u5256 Android UI \u6e32\u67d3\u5168\u7ba1\u7dda\uff1a\u5f9e View Tree \u904d\u6b77\uff08Measure \/ Layout \/ Draw\uff09\u7522\u51fa DisplayList\uff0c\u5230 RenderThread \u5c07 DisplayList \u8f49\u63db\u70ba GPU \u6307\u4ee4\uff0c\u518d\u7531 Skia \/ HWUI \u6392\u7a0b\u81f3 SurfaceFlinger\uff0c\u900f\u904e BufferQueue \u8207 Hardware Composer (HWC) \u5b8c\u6210\u6700\u7d42 VSYNC \u5408\u6210\u4e0a\u5c4f\u3002<\/li>\n<\/ul>\n<\/li>\n<li><strong>\u300aWide Color Gamut &amp; HDR in Android\u300b<\/strong>\n<ul>\n<li><strong>\u5e95\u5c64\u89c0\u9ede<\/strong>\uff1a\u89e3\u6790 Android 8.0+ \u5f15\u5165\u7684\u5ee3\u8272\u57df\u652f\u63f4\uff08Display P3\u3001sRGB\uff09\u8207 FP16 \u534a\u7cbe\u5ea6\u6d6e\u9ede\u7d0b\u7406\u901a\u9053\uff0c\u95e1\u660e\u8272\u5f69\u7a7a\u9593\u8f49\u63db\u77e9\u9663\u904b\u7b97\u8207 HDR Pipeline \u5c0d\u986f\u5b58\u983b\u5bec\u53ca Render Pass \u7684\u885d\u64ca\u3002<\/li>\n<\/ul>\n<\/li>\n<li><strong>\u300aCompose Render Optimizations &amp; Custom Shaders (AGSL)\u300b<\/strong>\n<ul>\n<li><strong>\u5e95\u5c64\u89c0\u9ede<\/strong>\uff1a\u8b1b\u89e3 Compose \u4e2d <code>graphicsLayer<\/code> \u7684\u786c\u9ad4\u96e2\u5c4f\u5feb\u53d6\uff08Offscreen Buffer\uff09\u6a5f\u5236\u3001RenderNode \u9ad2\u77e9\u5f62\u88c1\u526a\uff0c\u4ee5\u53ca Android 13+ \u900f\u904e AGSL\uff08Android Graphics Shading Language\uff09\u64b0\u5beb\u81ea\u8a02\u8457\u8272\u5668\u4ee5\u96f6 CPU \u958b\u92b7\u5be6\u73fe\u8907\u96dc\u52d5\u6548\u7684\u6280\u6cd5\u3002<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<\/li>\n<li><strong>\u70ba\u4ec0\u9ebc\u5fc5\u8b80\uff08\u5de5\u7a0b\u50f9\u503c\uff09<\/strong>\uff1a<br \/>\n\u60f3\u653b\u514b 60fps\/120fps \u6975\u81f4\u6d41\u66a2\u5ea6\u3001\u6389\u5e40\u5361\u9813\uff08Jank\uff09\u3001\u904e\u5ea6\u7e6a\u88fd\uff08Overdraw\uff09\u6216\u81ea\u8a02\u9ad8\u6548\u80fd\u81ea\u7e6a\u5143\u4ef6\uff0cRomain Guy \u7684\u6587\u7ae0\u662f\u76f4\u901a Android \u5716\u5f62\u6838\u5fc3\u8207 Skia C++ \u5e95\u5c64\u7684\u6b0a\u5a01\u6307\u5357\u3002<\/li>\n<\/ul>\n<hr>\n<h3>4. Manuel Vivo (Google Android \u5b98\u65b9\u67b6\u69cb\u8ca0\u8cac\u4eba)<\/h3>\n<ul>\n<li><strong>\u500b\u4eba\u5c08\u6b04<\/strong>\uff1a<a href=\"https:\/\/medium.com\/@manuelvivo\">Medium @manuelvivo<\/a><\/li>\n<li><strong>\u5fc5\u8b80\u795e\u4f5c\u7bc7\u7ae0<\/strong>\uff1a\n<ol>\n<li><strong>\u300aA safer way to collect flows from Android UI\u300b<\/strong>\n<ul>\n<li><strong>\u5e95\u5c64\u89c0\u9ede<\/strong>\uff1a\u5ba3\u5224 <code>lifecycleScope.launchWhenStarted<\/code> \u6b7b\u5211\uff0c\u5168\u9762\u8f49\u5411 <code>repeatOnLifecycle<\/code>\u3002\u5256\u6790\u5728\u80cc\u666f\u6642 <code>launchWhenStarted<\/code> \u96d6\u7136\u66ab\u505c\u5206\u767c\u4f46\u4e0a\u6e38\u751f\u7522\u8005 Flow \u4f9d\u7136\u5728\u80cc\u5f8c\u6d3b\u8457\u4e26\u6301\u7e8c\u6d88\u8017\u8cc7\u6e90\u7684\u81f4\u547d\u7f3a\u9677\uff1b<code>repeatOnLifecycle<\/code> \u5247\u5728 <code>STOPPED<\/code> \u6642\u5fb9\u5e95\u53d6\u6d88\u5354\u7a0b\u4e26\u5728 <code>STARTED<\/code> \u91cd\u65b0\u555f\u52d5\u3002<\/li>\n<\/ul>\n<\/li>\n<li><strong>\u300aStateFlow and SharedFlow: In-depth Guide\u300b<\/strong>\n<ul>\n<li><strong>\u5e95\u5c64\u89c0\u9ede<\/strong>\uff1a\u5c07 LiveData \u5fb9\u5e95\u9000\u4f11\u7684\u5b98\u65b9\u6307\u5c0e\u3002\u8a73\u89e3 UI State \u8207 One-off UI Event\uff08\u4e00\u6b21\u6027\u4e8b\u4ef6\uff09\u7684\u672c\u8cea\u5340\u5225\uff0c\u62a8\u64ca SingleLiveEvent \u53cd\u6a21\u5f0f\uff0c\u5efa\u7acb\u57fa\u65bc\u4e0d\u53ef\u8b8a State \u8207 ViewModel \u7684\u55ae\u5411\u8cc7\u6599\u6d41\uff08UDF\uff09\u3002<\/li>\n<\/ul>\n<\/li>\n<li><strong>\u300aTesting Coroutines on Android (Turbine &amp; TestDispatchers)\u300b<\/strong>\n<ul>\n<li><strong>\u5e95\u5c64\u89c0\u9ede<\/strong>\uff1a\u7cfb\u7d71\u5316\u89e3\u6790 <code>StandardTestDispatcher<\/code> \u8207 <code>UnconfinedTestDispatcher<\/code> \u7684\u865b\u64ec\u6642\u9593\u8abf\u5ea6\u6a5f\u5236\uff0c\u4ee5\u53ca\u5229\u7528 Cash App \u7684 Turbine \u9032\u884c\u51b7\/\u71b1\u6d41\u6e2c\u8a66\u7684\u6a19\u6e96\u65b9\u6cd5\u8ad6\u3002<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<\/li>\n<li><strong>\u70ba\u4ec0\u9ebc\u5fc5\u8b80\uff08\u5de5\u7a0b\u50f9\u503c\uff09<\/strong>\uff1a<br \/>\n\u73fe\u4ee3 Android \u67b6\u69cb\uff08Modern Android Architecture &#8211; MAD\uff09\u7684\u5b98\u65b9\u6a19\u6e96\u5236\u5b9a\u8005\u3002\u4ed6\u7684\u6587\u7ae0\u662f\u5efa\u7acb\u5927\u578b App \u67b6\u69cb\u5c64\u89e3\u8026\u3001ViewModel \u72c0\u614b\u6cbb\u7406\u8207\u56b4\u8b39\u55ae\u5143\u6e2c\u8a66\u7684\u6700\u4f73\u53c3\u7167\u7cfb\u3002<\/li>\n<\/ul>\n<hr>\n<h3>5. Zac Sweers (Slack \u77e5\u540d Staff Android \u5de5\u7a0b\u5e2b)<\/h3>\n<ul>\n<li><strong>\u500b\u4eba\u7ad9\u9ede<\/strong>\uff1a<a href=\"https:\/\/www.zacsweers.dev\/\">zacsweers.dev<\/a><\/li>\n<li><strong>\u5fc5\u8b80\u795e\u4f5c\u7bc7\u7ae0<\/strong>\uff1a\n<ol>\n<li><strong>\u300aAnatomy of a Kotlin Compiler Plugin (Parts 1 ~ 3)\u300b<\/strong>\n<ul>\n<li><strong>\u5e95\u5c64\u89c0\u9ede<\/strong>\uff1a\u5b8c\u5168\u5256\u6790 Kotlin IR\uff08\u4e2d\u9593\u8868\u793a\u5c64\uff09\u3002\u8b1b\u89e3\u5982\u4f55\u7e5e\u904e KAPT\/KSP\uff0c\u76f4\u63a5\u5728\u7de8\u8b6f\u5668\u5f8c\u7aef IR\uff08Backend IR\uff09\u5c64\u7d1a\u6514\u622a AST\uff0c\u751f\u6210\u5408\u6210\u51fd\u6578\u3001\u4fee\u6539\u985e\u5225\u5143\u6578\u64da\uff0c\u5be6\u73fe\u6975\u81f4\u96f6\u904b\u884c\u6642\u958b\u92b7\u7684\u5143\u7a0b\u5f0f\u8a2d\u8a08\uff08Meta-programming\uff09\u3002<\/li>\n<\/ul>\n<\/li>\n<li><strong>\u300aMoshi vs Kotlinx Serialization: Performance &amp; Architecture\u300b<\/strong>\n<ul>\n<li><strong>\u5e95\u5c64\u89c0\u9ede<\/strong>\uff1a\u6df1\u5ea6\u5c0d\u6bd4\u6d41\u5f0f JSON \u89e3\u6790\u6846\u67b6\u3002\u5256\u6790\u53cd\u5c04\u65b9\u6848\u3001APT \u975c\u614b\u751f\u6210\u4ee3\u78bc\u8207 K2 \u7de8\u8b6f\u671f\u4f4d\u5143\u7d44\u78bc\u751f\u6210\u7684\u4e0d\u540c Memory Footprint \u8207\u541e\u5410\u91cf\u6975\u9650\uff0c\u5256\u6790\u591a\u578b\u5e8f\u5217\u5316\u5728\u52d5\u614b\u53cd\u5e8f\u5217\u5316\u4e2d\u7684\u5e95\u5c64\u6a5f\u5236\u3002<\/li>\n<\/ul>\n<\/li>\n<li><strong>\u300aCircuit: Slack&#39;s Compose-driven Architecture\u300b<\/strong>\n<ul>\n<li><strong>\u5e95\u5c64\u89c0\u9ede<\/strong>\uff1a\u5b8c\u5168\u5254\u9664 Fragment \u6b77\u53f2\u5305\u88b1\uff0c\u5c07 Compose \u63d0\u5347\u70ba\u7b2c\u4e00\u516c\u6c11\u7684\u73fe\u4ee3\u67b6\u69cb\u3002\u5c07 UI\u3001Presenter\u3001Screen \u5fb9\u5e95\u89e3\u8026\uff0c\u4ee5\u7d14 Kotlin \u4ecb\u9762\u7d50\u5408 Compose State \u5b8c\u6210\u72c0\u614b\u6a5f\u9a45\u52d5\uff0c\u5b8c\u7f8e\u8de8\u5e73\u53f0\uff08KMP\uff09\u3002<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<\/li>\n<li><strong>\u70ba\u4ec0\u9ebc\u5fc5\u8b80\uff08\u5de5\u7a0b\u50f9\u503c\uff09<\/strong>\uff1a<br \/>\n\u4ee3\u8868\u6700\u524d\u6cbf\u7684\u300c\u5de5\u5177\u93c8\u8207\u7de8\u8b6f\u99ed\u5ba2\u300d\u601d\u7dad\u3002\u5c0d\u53ad\u5026\u4e86 KAPT \u62d6\u6162\u7de8\u8b6f\u901f\u5ea6\u3001\u60f3\u8981\u81ea\u7814\u7de8\u8b6f\u5916\u639b\u6216\u6253\u9020\u8d85\u5feb\u69cb\u5efa\u7ba1\u7dda\u7684\u67b6\u69cb\u5e2b\u4f86\u8aaa\uff0cZac \u662f\u7d55\u5c0d\u7684\u98a8\u5411\u6a19\u3002<\/li>\n<\/ul>\n<hr>\n<h3>6. Leland Richardson (Jetpack Compose Runtime \u7e3d\u67b6\u69cb\u5e2b)<\/h3>\n<ul>\n<li><strong>\u500b\u4eba\u5c08\u6b04 \/ \u6f14\u8b1b\u8ad6\u8ff0<\/strong>\uff1a<a href=\"https:\/\/medium.com\/@lelandmr\">Medium @lelandmr<\/a> \/ \u6f14\u8b1b <em>Under the Hood of Jetpack Compose<\/em><\/li>\n<li><strong>\u5fc5\u8b80\u795e\u4f5c\u7bc7\u7ae0<\/strong>\uff1a\n<ol>\n<li><strong>\u300aUnder the Hood of Jetpack Compose: Gap Buffers &amp; Slot Table\u300b<\/strong>\n<ul>\n<li><strong>\u5e95\u5c64\u89c0\u9ede<\/strong>\uff1a\u89e3\u69cb Compose Runtime \u7684\u8cc7\u6599\u7d50\u69cb\u5fc3\u81df\u2014\u2014<strong>Slot Table\uff08\u63d2\u69fd\u8868\uff09\u8207 Gap Buffer\uff08\u9593\u9699\u7de9\u885d\u5340\uff09<\/strong>\u3002\u8aaa\u660e\u70ba\u4f55 Compose \u653e\u68c4\u50b3\u7d71\u7684\u7bc0\u9ede\u6a39\uff08Virtual DOM \/ Widget Tree\uff09\uff0c\u6539\u7528\u4e00\u7dad\u9023\u7e8c\u9663\u5217\u7d50\u5408 Gap \u6307\u91dd\u8df3\u8f49\u4f86\u8a18\u9304\u8a18\u61b6\u5316\u72c0\u614b\uff08<code>remember<\/code>\uff09\uff0c\u9054\u5230 O(1) \u5c40\u90e8\u5feb\u53d6\u8207\u6975\u9ad8 CPU Cache \u547d\u4e2d\u7387\u3002<\/li>\n<\/ul>\n<\/li>\n<li><strong>\u300aCompose Compiler: Stability, Changed Flags, and Recomposition Skipping\u300b<\/strong>\n<ul>\n<li><strong>\u5e95\u5c64\u89c0\u9ede<\/strong>\uff1a\u63ed\u793a <code>@Composable<\/code> \u51fd\u6578\u5728\u7de8\u8b6f\u5f8c\u7684\u771f\u5be6\u9762\u76ee\uff1a\u6bcf\u4e00\u500b Composable \u90fd\u88ab\u6ce8\u5165\u4e86 <code>$composer<\/code> \u8207 <code>$changed<\/code>\uff0832-bit \u4f4d\u5143\u63a9\u78bc\uff09\u3002\u7de8\u8b6f\u5668\u900f\u904e\u63a8\u5c0e\u578b\u5225\u7684 <code>@Stable<\/code> \u8207 <code>@Immutable<\/code>\uff0c\u5728\u904b\u884c\u6642\u6bd4\u5c0d <code>$changed<\/code> \u65d7\u6a19\uff0c\u5728\u4e0d\u7528\u57f7\u884c\u51fd\u6578\u672c\u9ad4\u7684\u524d\u63d0\u4e0b\u76f4\u63a5\u8df3\u904e\u91cd\u7d44\uff08Recomposition Skip\uff09\u3002<\/li>\n<\/ul>\n<\/li>\n<li><strong>\u300aSnapshot State System: Multiversion Concurrency Control (MVCC) in UI\u300b<\/strong>\n<ul>\n<li><strong>\u5e95\u5c64\u89c0\u9ede<\/strong>\uff1a\u5256\u6790 Compose \u7684 <code>mutableStateOf<\/code> \u5982\u4f55\u904b\u7528\u8cc7\u6599\u5eab\u9818\u57df\u7684 MVCC \u6a5f\u5236\u3002\u591a\u500b\u57f7\u884c\u7dd2\u5728\u5404\u81ea\u7684 Snapshot \u4e2d\u8b80\u5beb UI \u72c0\u614b\uff0c\u63d0\u4ea4\u6642\u9032\u884c\u885d\u7a81\u6aa2\u6e2c\u4e26\u901a\u77e5\u5168\u57df\u91cd\u7d44\uff0c\u4fdd\u8b49 UI \u57f7\u884c\u7dd2\u8b80\u53d6\u7684\u7d14\u6de8\u5ea6\u3002<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<\/li>\n<li><strong>\u70ba\u4ec0\u9ebc\u5fc5\u8b80\uff08\u5de5\u7a0b\u50f9\u503c\uff09<\/strong>\uff1a<br \/>\n\u4e0d\u61c2 Slot Table\u3001Gap Buffer \u548c Snapshot MVCC\uff0c\u7528 Compose \u5c31\u53ea\u80fd\u505c\u7559\u5728\u5207\u5716\u8abf\u6a23\u5f0f\u7684\u521d\u7d1a\u6c34\u6e96\uff0c\u7121\u6cd5\u5b9a\u4f4d\u7531\u4e0d\u53ef\u7a69\u5b9a\u53c3\u6578\u5f15\u767c\u7684\u300c\u5168\u87a2\u5e55\u591a\u9918\u91cd\u7d44\u300d\uff0c\u66f4\u7121\u6cd5\u5728\u5927\u578b\u5c08\u6848\u4e2d\u99d5\u99ad Compose \u6548\u80fd\u3002<\/li>\n<\/ul>\n<hr>\n<h3>7. \u7cfb\u7d71\u5e95\u5c64\u53e4\u5178\u6559\u79d1\u66f8\u8207\u5167\u6838\u540d\u5bb6<\/h3>\n<h4>\u2460 Gityuan (\u8881\u8f1d\u8f1d)<\/h4>\n<ul>\n<li><strong>\u90e8\u843d\u683c\u7db2\u5740<\/strong>\uff1a<a href=\"https:\/\/gityuan.com\/\">gityuan.com<\/a><\/li>\n<li><strong>\u63a8\u85a6\u5fc5\u8b80\u7cfb\u5217<\/strong>\uff1a\n<ul>\n<li><strong>\u300a\u6df1\u5165\u7406\u89e3 Binder \u9a45\u52d5\u5168\u5957\u5256\u6790 (\u9a45\u52d5\u5c64\u3001IPCThreadState\u3001ProcessState\u3001ServiceManager)\u300b<\/strong><\/li>\n<li><strong>\u300aAndroid \u7cfb\u7d71\u555f\u52d5\u67b6\u69cb (init -&gt; Zygote -&gt; SystemServer -&gt; AMS\/PMS)\u300b<\/strong><\/li>\n<li><strong>\u300a\u6df1\u5165\u7406\u89e3 Handler \u6d88\u606f\u6a5f\u5236 (NativeMessageQueue \u8207 Linux epoll\/eventfd \u5e95\u5c64\u559a\u9192)\u300b<\/strong><\/li>\n<li><strong>\u300aAndroid \u8a18\u61b6\u9ad4\u6cbb\u7406\u8207 Low Memory Killer Daemon (LMKD)\u300b<\/strong><\/li>\n<\/ul>\n<\/li>\n<li><strong>\u6838\u5fc3\u6280\u8853\u89c0\u9ede\u8207\u5de5\u7a0b\u50f9\u503c<\/strong>\uff1a<br \/>\n\u570b\u5167\u5256\u6790 Android Framework \u76f4\u63d2 Linux Kernel \u9a45\u52d5\u5c64\u7684\u300c\u795e\u7d1a\u6307\u5357\u300d\u3002\u4ee5 Binder \u70ba\u4f8b\uff0c\u4ed6\u5c07 <code>mmap<\/code> \u4e00\u6b21\u62f7\u8c9d\u3001\u8a18\u61b6\u9ad4\u7269\u7406\u9801\u5c0d\u9f4a\u3001binder_proc \/ binder_thread \u7684\u7d05\u9ed1\u6a39\u67e5\u627e\u6a5f\u5236\u89e3\u6790\u5f97\u6dcb\u6f13\u76e1\u81f4\u3002\u8981\u6392\u67e5\u6b7b\u9396\uff08Deadlock\uff09\u3001IPC \u7de9\u885d\u5340\u8017\u76e1\uff08<code>TransactionTooLargeException<\/code>\uff09\u3001\u7cfb\u7d71\u670d\u52d9\u5d29\u6f70\u8207 ANR \u5e95\u5c64\u6839\u56e0\uff0cGityuan \u662f\u4e0d\u53ef\u66ff\u4ee3\u7684\u5c0e\u822a\u5716\u3002<\/li>\n<\/ul>\n<h4>\u2461 \u7f85\u6607\u967d (\u8001\u7f85\u7684 Android \u4e4b\u65c5)<\/h4>\n<ul>\n<li><strong>\u90e8\u843d\u683c\u7db2\u5740<\/strong>\uff1a<a href=\"https:\/\/blog.csdn.net\/luoshengyang\">blog.csdn.net\/luoshengyang<\/a>\uff08\u8457\u4f5c\uff1a\u300aAndroid \u7cfb\u7d71\u539f\u59cb\u7a0b\u5f0f\u78bc\u60c5\u666f\u5206\u6790\u300b\uff09<\/li>\n<li><strong>\u5b9a\u4f4d\u8207\u5de5\u7a0b\u6a19\u8a3b<\/strong>\uff1a<br \/>\n<strong>\u3010\u6846\u67b6\u5e95\u5c64\u7d93\u5178\u6559\u79d1\u66f8\u3011<\/strong>\u3002\u96d6\u7136\u5176\u6e90\u78bc\u5206\u6790\u57fa\u6e96\u505c\u7559\u5728\u65e9\u671f Android\uff082.3 ~ 4.x\uff09\uff0c\u4f46 Android \u6838\u5fc3\u67b6\u69cb\u7684\u9aa8\u67b6\u2014\u2014Binder \u9a45\u52d5\u7684 C\/C++ \u63e1\u624b\u6a5f\u5236\u3001Dalvik \u865b\u64ec\u6a5f\u555f\u52d5\u8207 JNI \u975c\u614b\/\u52d5\u614b\u8a3b\u518a\u6d41\u7a0b\u3001ActivityManagerService \u8207 WindowManagerService \u7684\u8077\u8cac\u5283\u5206\u3001AAPT \u8cc7\u6e90\u7de8\u8b6f\u8207 AssetManager \u67e5\u627e\u6f14\u7b97\u6cd5\u2014\u2014\u5176\u56b4\u8b39\u5ea6\u582a\u7a31\u5de5\u696d\u7d1a\u7bc4\u672c\uff0c\u662f\u6b77\u4ee3\u9802\u5c16 Android \u67b6\u69cb\u5e2b\u592f\u5be6\u7cfb\u7d71\u5e95\u5c64\u57fa\u790e\u7684\u7b2c\u4e00\u57fa\u77f3\u3002<\/li>\n<\/ul>\n<h4>\u2462 \u96f7\u9704\u9a4a (\u6c38\u9060\u7684\u97f3\u8996\u983b\u8207\u591a\u5a92\u9ad4\u6bbf\u5802)<\/h4>\n<ul>\n<li><strong>\u90e8\u843d\u683c\u7db2\u5740<\/strong>\uff1a<a href=\"https:\/\/blog.csdn.net\/leixiaohua1020\">blog.csdn.net\/leixiaohua1020<\/a><\/li>\n<li><strong>\u5b9a\u4f4d\u8207\u5de5\u7a0b\u6a19\u8a3b<\/strong>\uff1a<br \/>\n\u570b\u5167\u97f3\u8996\u983b\uff08FFmpeg \/ WebRTC \/ RTMP \/ H.264 \/ AAC\uff09\u9818\u57df\u516c\u8a8d\u7684\u62d3\u8352\u8005\u8207\u5c0e\u5e2b\u3002\u4e0d\u8ad6\u5e95\u5c64 Android MediaCodec \u9084\u662f JNI \u97f3\u8996\u983b\u7ba1\u7dda\uff0c\u96f7\u795e\u7684\u539f\u59cb\u78bc\u8a3b\u89e3\u8207\u7cfb\u7d71\u6027\u67b6\u69cb\u62c6\u89e3\uff0c\u81f3\u4eca\u4ecd\u662f Android \u97f3\u8996\u983b\u958b\u767c\u8207 C\/C++ \u6df7\u5408\u5de5\u7a0b\u7684\u4e00\u751f\u5fc5\u8b80\u8d77\u9ede\u3002<\/li>\n<\/ul>\n<hr>\n<h1>\u4e8c\u3001 \u9802\u7d1a\u4f01\u696d Engineering Blog \u8207\u4ee3\u8868\u4f5c<\/h1>\n<h3>1. Square Corner Blog<\/h3>\n<ul>\n<li><strong>\u90e8\u843d\u683c\u7db2\u5740<\/strong>\uff1a<a href=\"https:\/\/developer.squareup.com\/blog\/\">developer.squareup.com\/blog<\/a><\/li>\n<li><strong>\u5fc5\u8b80\u4ee3\u8868\u4f5c<\/strong>\uff1a\n<ol>\n<li><strong>\u300aLeakCanary: Automating Memory Leak Detection with Shark\u300b<\/strong>\n<ul>\n<li><strong>\u6838\u5fc3\u89c0\u9ede<\/strong>\uff1a\u5c55\u793a\u5982\u4f55\u5229\u7528 <code>WeakReference<\/code> \u8207 <code>ReferenceQueue<\/code> \u81ea\u52d5\u63a2\u6e2c Activity\/Fragment \u92b7\u6bc0\u5f8c\u7684\u7559\u5b58\uff0c\u4e26\u5728 Shark \u5f15\u64ce\u4e2d\u76f4\u63a5\u4ee5\u8a18\u61b6\u9ad4\u6620\u5c04\uff08mmap\uff09\u5c0d HPROF \u9032\u884c\u96f6 OOM \u7684\u5716\u6f14\u7b97\u6cd5\uff08Shortest Path to GC Roots\uff09\u526a\u679d\u641c\u5c0b\u3002<\/li>\n<\/ul>\n<\/li>\n<li><strong>\u300aA Journey into OkHttp\u2019s Interceptor Chain &amp; HTTP\/2 Multiplexing\u300b<\/strong>\n<ul>\n<li><strong>\u6838\u5fc3\u89c0\u9ede<\/strong>\uff1a\u8cac\u4efb\u93c8\u8a2d\u8a08\u6a21\u5f0f\u7684\u6559\u79d1\u66f8\u5be6\u73fe\u3002\u8a73\u7d30\u8aaa\u660e\u9023\u63a5\u6c60\uff08ConnectionPool\uff09\u5982\u4f55\u5728\u591a\u500b\u8acb\u6c42\u9593\u8907\u7528 Socket\u3001\u8655\u7406 TLS \u63e1\u624b\u958b\u92b7\uff0c\u4ee5\u53ca HTTP\/2 \u591a\u8def\u8907\u7528\u7684\u6d41\u91cf\u63a7\u5236\u3002<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<\/li>\n<li><strong>\u5de5\u7a0b\u50f9\u503c<\/strong>\uff1a<br \/>\nSquare \u662f\u958b\u5275\u73fe\u4ee3 Android \u958b\u6e90\u751f\u614b\u7684\u59cb\u7956\uff08Retrofit, OkHttp, LeakCanary, Moshi, Picasso\uff09\u3002\u95b1\u8b80\u5176 Blog \u662f\u638c\u63e1\u300c\u512a\u96c5 API \u8a2d\u8a08\u300d\u3001\u300c\u7121\u611f\u6027\u80fd\u76e3\u63a7\u300d\u8207\u300c\u96f6\u8a18\u61b6\u9ad4\u6d6a\u8cbb\u8a2d\u8a08\u300d\u7684\u6700\u9ad8\u6a19\u6e96\u3002<\/li>\n<\/ul>\n<hr>\n<h3>2. Meta (Facebook) Engineering<\/h3>\n<ul>\n<li><strong>\u90e8\u843d\u683c\u7db2\u5740<\/strong>\uff1a<a href=\"https:\/\/engineering.fb.com\/\">engineering.fb.com<\/a><\/li>\n<li><strong>\u5fc5\u8b80\u4ee3\u8868\u4f5c<\/strong>\uff1a\n<ol>\n<li><strong>\u300aReDex: An Android Bytecode Optimizer\u300b<\/strong>\n<ul>\n<li><strong>\u6838\u5fc3\u89c0\u9ede<\/strong>\uff1a\u958b\u5275\u5927\u898f\u6a21 APK DEX \u512a\u5316\u5148\u6cb3\u3002\u5c55\u793a\u5982\u4f55\u6253\u7834 Java \u985e\u5225\u7de8\u8b6f\u908a\u754c\uff0c\u9032\u884c\u8de8\u985e\u5225\u65b9\u6cd5\u5167\u806f\uff08Cross-class Inlining\uff09\u3001\u6b7b\u4ee3\u78bc\u6d88\u9664\uff08DCE\uff09\u3001\u4ee5\u53ca\u57fa\u65bc\u57f7\u884c\u671f Profile \u91cd\u6392 DEX \u5167\u90e8\u985e\u5225\u8207\u65b9\u6cd5\uff0c\u8b93\u71b1\u4ee3\u78bc\u805a\u96c6\u65bc\u9023\u7e8c\u7269\u7406\u9801\uff0c\u6700\u5927\u5316\u6e1b\u5c11 Linux \u7f3a\u9801\u4e2d\u65b7\uff08Page Fault\uff09\uff0c\u5927\u5e45\u7e2e\u77ed\u51b7\u555f\u52d5\u6642\u9593\u3002<\/li>\n<\/ul>\n<\/li>\n<li><strong>\u300aHermes: An Ahead-of-Time Bytecode Engine Optimized for Android\u300b<\/strong>\n<ul>\n<li><strong>\u6838\u5fc3\u89c0\u9ede<\/strong>\uff1a\u70ba\u884c\u52d5\u88dd\u7f6e\u91cf\u8eab\u8a02\u505a\u7684\u8f15\u91cf\u7d1a JS \u5f15\u64ce\u3002\u62cb\u68c4\u81c3\u816b\u7684 JIT\uff0c\u6539\u63a1 AOT \u9810\u7de8\u8b6f\u4f4d\u5143\u7d44\u78bc\uff0c\u7d50\u5408\u975e\u9023\u7e8c\u5206\u9801\u7684 Garbage Collector\uff0c\u5c07 React Native \u5728\u4f4e\u968e Android \u4e0a\u7684\u51b7\u555f\u52d5\u8207\u8a18\u61b6\u9ad4\u4f54\u7528\u512a\u5316\u5230\u6975\u9650\u3002<\/li>\n<\/ul>\n<\/li>\n<li><strong>\u300aProfilo: High-throughput Android Tracing Library\u300b<\/strong>\n<ul>\n<li><strong>\u6838\u5fc3\u89c0\u9ede<\/strong>\uff1a\u7a81\u7834\u50b3\u7d71 Systrace \u958b\u92b7\u904e\u5927\u7684\u74f6\u9838\u3002\u5229\u7528\u539f\u751f Linux <code>perf_event<\/code>\u3001\u6838\u5fc3\u5c64 ftrace \u8207\u68e7\u6307\u91dd\u5c55\u958b\uff0c\u4ee5\u4e0d\u5230 1% \u7684\u958b\u92b7\u7372\u53d6\u751f\u7522\u74b0\u5883\u4e0b\u7684\u9ad8\u983b\u65b9\u6cd5\u547c\u53eb\u68e7\u8207\u57f7\u884c\u7dd2\u7b49\u5f85\u72c0\u614b\u3002<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<\/li>\n<li><strong>\u5de5\u7a0b\u50f9\u503c<\/strong>\uff1a<br \/>\n\u9762\u5c0d\u5104\u7d1a\u4f7f\u7528\u8005\u8207\u6578\u767e\u842c\u884c\u4ee3\u78bc\u4ea4\u7e54\u7684\u8d85\u5927\u578b App\uff0cMeta Blog \u5c55\u793a\u7684\u662f\u300c\u6253\u7834\u5e38\u898f\u3001\u76f4\u63a5\u4fee\u6539\u4f4d\u5143\u7d44\u78bc\u3001\u91cd\u69cb\u865b\u64ec\u6a5f\u8207\u7de8\u5beb\u6838\u5fc3\u7d1a\u6027\u80fd\u5256\u6790\u5de5\u5177\u300d\u7684\u6975\u9650\u5de5\u7a0b\u5be6\u8e10\u3002<\/li>\n<\/ul>\n<hr>\n<h3>3. Uber Engineering<\/h3>\n<ul>\n<li><strong>\u90e8\u843d\u683c\u7db2\u5740<\/strong>\uff1a<a href=\"https:\/\/www.uber.com\/blog\/engineering\/\">uber.com\/blog\/engineering<\/a><\/li>\n<li><strong>\u5fc5\u8b80\u4ee3\u8868\u4f5c<\/strong>\uff1a\n<ol>\n<li><strong>\u300aArchitecting Mobile Apps at Scale with RIBs\u300b<\/strong>\n<ul>\n<li><strong>\u6838\u5fc3\u89c0\u9ede<\/strong>\uff1aUber \u5fb9\u5e95\u89e3\u8026\u767e\u4eba\u7814\u767c\u5718\u968a\u7684\u8de8\u5e73\u53f0\u67b6\u69cb\u3002\u5b8c\u5168\u5ee2\u68c4\u300c\u4ee5 View\/Activity \u70ba\u4e2d\u5fc3\u300d\u7684\u50b3\u7d71\u6a21\u5f0f\uff0c\u5efa\u7acb\u4ee5\u696d\u52d9\u72c0\u614b\u6a39\uff08Business State Tree\uff09\u70ba\u9a45\u52d5\u7684\u7cfb\u7d71\u67b6\u69cb\uff0c\u5be6\u73fe\u8996\u5716\u8207\u696d\u52d9\u908f\u8f2f\u7684\u7269\u7406\u7d1a\u89e3\u8026\u3002<\/li>\n<\/ul>\n<\/li>\n<li><strong>\u300aMeasuring and Optimizing Android Build Times at Scale\u300b<\/strong>\n<ul>\n<li><strong>\u6838\u5fc3\u89c0\u9ede<\/strong>\uff1a\u8d85\u5927 Monorepo \u69cb\u5efa\u512a\u5316\u7bc4\u672c\u3002\u8a73\u7d30\u5206\u6790\u7de8\u8b6f\u4f9d\u8cf4\u5716\u3001ABI \u8b8a\u66f4\u50b3\u905e\u93c8\u3001\u4ee5\u53ca\u5982\u4f55\u900f\u904e\u9060\u7aef\u69cb\u5efa\u5feb\u53d6\uff08Remote Build Cache\uff09\u4f7f\u5de5\u7a0b\u7de8\u8b6f\u6642\u9593\u5f9e\u6578\u5341\u5206\u9418\u58d3\u5236\u5230\u6578\u5341\u79d2\u3002<\/li>\n<\/ul>\n<\/li>\n<li><strong>\u300aPiranha: Automated Code Refactoring for Stale Feature Flags\u300b<\/strong>\n<ul>\n<li><strong>\u6838\u5fc3\u89c0\u9ede<\/strong>\uff1a\u4ee5\u62bd\u8c61\u8a9e\u6cd5\u6a39\uff08AST\uff09\u975c\u614b\u5206\u6790\u81ea\u52d5\u5316\u6e05\u7406\u5c08\u6848\u4e2d\u6578\u5343\u500b\u904e\u671f AB \u6e2c\u8a66\u8207 Feature Flag\uff0c\u6839\u9664\u5927\u578b\u9577\u671f\u6f14\u9032\u5c08\u6848\u7684\u300c\u4ee3\u78bc\u8150\u5316\u300d\u554f\u984c\u3002<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<\/li>\n<li><strong>\u5de5\u7a0b\u50f9\u503c<\/strong>\uff1a<br \/>\nUber \u5c55\u793a\u4e86\u67b6\u69cb\u62bd\u8c61\u3001\u6a21\u7d44\u908a\u754c\u9694\u96e2\u8207\u5168\u81ea\u52d5\u5316\u4ee3\u78bc\u885b\u751f\u7684\u9802\u5c16\u5de5\u696d\u89e3\u6cd5\u3002<\/li>\n<\/ul>\n<hr>\n<h3>4. Slack Engineering<\/h3>\n<ul>\n<li><strong>\u90e8\u843d\u683c\u7db2\u5740<\/strong>\uff1a<a href=\"https:\/\/slack.engineering\/\">slack.engineering<\/a><\/li>\n<li><strong>\u5fc5\u8b80\u4ee3\u8868\u4f5c<\/strong>\uff1a\n<ol>\n<li><strong>\u300aCircuit: An Architecture for Compose on Android\u300b<\/strong>\n<ul>\n<li><strong>\u6838\u5fc3\u89c0\u9ede<\/strong>\uff1a\u6df1\u5165\u95e1\u660e Compose \u6642\u4ee3\u7684\u771f\u6b63\u67b6\u69cb\u3002\u4e0d\u5c07 Presenter \u4f5c\u70ba ViewModel \u7684\u5305\u88dd\uff0c\u800c\u662f\u5c07\u5176\u62bd\u8c61\u70ba\u63a5\u53d7 State\u3001\u767c\u5c04 Event \u7684\u7d14\u7cb9\u72c0\u614b\u8a08\u7b97\u5668\uff0c\u5fb9\u5e95\u5c07 UI \u8207\u5546\u696d\u908f\u8f2f\u8f49\u70ba\u53ef\u79fb\u690d\u3001\u53ef\u8f15\u6613\u9032\u884c\u55ae\u5143\u6e2c\u8a66\u7684\u9589\u74b0\u3002<\/li>\n<\/ul>\n<\/li>\n<li><strong>\u300aMigrating Slack\u2019s Android App to Jetpack Compose at Scale\u300b<\/strong>\n<ul>\n<li><strong>\u6838\u5fc3\u89c0\u9ede<\/strong>\uff1a\u8a73\u7d30\u8a18\u9304\u5f9e XML \u6df7\u5408\u6a21\u5f0f\u6f38\u9032\u5f0f\u9077\u79fb\u5230 100% Compose \u7684\u5de5\u7a0b\u8def\u7dda\u5716\u3002\u5305\u62ec\u8a2d\u8a08\u7cfb\u7d71\u5c0d\u9f4a\u3001\u4e92\u64cd\u4f5c\u908a\u754c\u6548\u80fd\u640d\u5931\u3001\u4ee5\u53ca\u907f\u514d\u6df7\u5408\u8996\u5716\u983b\u7e41\u6e2c\u91cf Layout \u7684\u5be6\u6230\u7b56\u7565\u3002<\/li>\n<\/ul>\n<\/li>\n<li><strong>\u300aAnvil: Simplifying Dagger 2 Dependency Injection\u300b<\/strong>\n<ul>\n<li><strong>\u6838\u5fc3\u89c0\u9ede<\/strong>\uff1a\u89e3\u6c7a Dagger \u5728\u591a\u6a21\u7d44\u5927\u578b\u5c08\u6848\u4e2d Component \u805a\u5408\u7dad\u8b77\u56f0\u96e3\u8207 KAPT \u7de8\u8b6f\u6975\u6162\u7684\u5229\u5668\u3002\u5229\u7528 Kotlin \u7de8\u8b6f\u5668\u63d2\u4ef6\u81ea\u52d5\u805a\u5408\u4f9d\u8cf4\u8ca2\u737b\uff0c\u514d\u9664\u624b\u52d5\u7dad\u8b77\u5927\u578b Dagger \u6a21\u7d44\u6e05\u55ae\u3002<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<\/li>\n<li><strong>\u5de5\u7a0b\u50f9\u503c<\/strong>\uff1a<br \/>\nSlack \u662f Android \u793e\u7fa4\u4e2d\u6700\u7a4d\u6975\u64c1\u62b1\u73fe\u4ee3\u6280\u8853\u68e7\uff08Kotlin First\u3001Compose Native\u3001KSP\u3001Circuit\uff09\u7684\u6a19\u7aff\u5718\u968a\u3002<\/li>\n<\/ul>\n<hr>\n<h3>5. Android Developers Blog (Google \u5b98\u65b9\u6838\u5fc3)<\/h3>\n<ul>\n<li><strong>\u5b98\u65b9\u7db2\u5740<\/strong>\uff1a<a href=\"https:\/\/android-developers.googleblog.com\/\">android-developers.googleblog.com<\/a> \u8207 <a href=\"https:\/\/medium.com\/androiddevelopers\">Medium @androiddevelopers<\/a><\/li>\n<li><strong>\u5fc5\u8b80\u4ee3\u8868\u4f5c<\/strong>\uff1a\n<ol>\n<li><strong>\u300aBaseline Profiles: Making Apps and Libraries Run Faster with ART Optimization\u300b<\/strong>\n<ul>\n<li><strong>\u6838\u5fc3\u89c0\u9ede<\/strong>\uff1a\u89e3\u9396 Android \u96f2\u7aef Profile \u8207\u672c\u5730 AOT \u7de8\u8b6f\u7684\u6838\u5fc3\u3002\u900f\u904e\u9810\u6e2c\u71b1\u9ede\u8def\u5f91\uff0c\u5c07\u95dc\u9375\u65b9\u6cd5\u5728\u61c9\u7528\u5b89\u88dd\u6216\u5f8c\u53f0\u9592\u7f6e\u6642\u76f4\u63a5\u7de8\u8b6f\u70ba\u672c\u6a5f\u6a5f\u5668\u78bc\uff08OAT\uff09\uff0c\u5fb9\u5e95\u6d88\u9664\u51b7\u555f\u52d5\u6642 JIT \u76f4\u8b6f\u9020\u6210\u7684 CPU \u5c16\u5cf0\uff0c\u4f7f\u555f\u52d5\u901f\u5ea6\u63d0\u5347 30%~40%\u3002<\/li>\n<\/ul>\n<\/li>\n<li><strong>\u300aMacrobenchmark &amp; Perfetto: Measuring What Matters in Production\u300b<\/strong>\n<ul>\n<li><strong>\u6838\u5fc3\u89c0\u9ede<\/strong>\uff1a\u73fe\u4ee3 Android \u6548\u80fd\u57fa\u7dda\u6a19\u6e96\u3002\u5229\u7528 Jetpack Macrobenchmark \u7d50\u5408 Perfetto \u93c8\u8def\u8ffd\u8e64\uff0c\u5c07\u555f\u52d5\u6642\u9593\u3001\u756b\u9762\u5361\u9813\u7387\uff08Frame Janky Rates\uff09\u5168\u9762\u7d0d\u5165 CI\/CD \u81ea\u52d5\u5316\u56de\u6b78\u6e2c\u8a66\u3002<\/li>\n<\/ul>\n<\/li>\n<li><strong>\u300aGuide to App Architecture (Modern Android Architecture)\u300b<\/strong>\n<ul>\n<li><strong>\u6838\u5fc3\u89c0\u9ede<\/strong>\uff1aGoogle \u5b98\u65b9\u6700\u65b0\u67b6\u69cb\u85cd\u5716\uff08UI Layer + Domain Layer + Data Layer\uff09\uff0c\u78ba\u7acb Offline-first\uff08\u96e2\u7dda\u512a\u5148\uff09\u3001\u55ae\u5411\u8cc7\u6599\u6d41\uff08UDF\uff09\u8207\u53ef\u89c0\u5bdf\u8cc7\u6599\u5bb9\u5668\u7684\u5b98\u65b9\u6a19\u6e96\u3002<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<\/li>\n<\/ul>\n<hr>\n<h1>\u4e09\u3001 \u4e94\u5927\u6838\u5fc3\u6280\u8853\u9818\u57df\u7684\u6df1\u5ea6\u5c0e\u8b80\u77e9\u9663<\/h1>\n<pre><code class=\"hljs language-dart\">                               \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n                               \u2502     <span class=\"hljs-title class_\">Android<\/span> \u67b6\u69cb\u8207\u5e95\u5c64\u5de5\u7a0b\u6280\u8853\u5168\u666f\u5730\u5716        \u2502\n                               \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n                                                       \u2502\n         \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n         \u25bc                   \u25bc                         \u25bc                         \u25bc                   \u25bc\n  \u3010\u9818\u57df <span class=\"hljs-number\">1<\/span>\uff1a<span class=\"hljs-title class_\">Kotlin<\/span>\/\u5354\u7a0b\u3011 \u3010\u9818\u57df <span class=\"hljs-number\">2<\/span>\uff1a<span class=\"hljs-title class_\">Compose<\/span>\/\u6e32\u67d3\u3011  \u3010\u9818\u57df <span class=\"hljs-number\">3<\/span>\uff1a\u7de8\u8b6f\/<span class=\"hljs-title class_\">R8<\/span>\/\u67b6\u69cb\u3011  \u3010\u9818\u57df <span class=\"hljs-number\">4<\/span>\uff1a\u6975\u9650\u6548\u80fd\/APM\u3011 \u3010\u9818\u57df <span class=\"hljs-number\">5<\/span>\uff1a\u591a\u5a92\u9ad4\/JNI\u3011\n  - <span class=\"hljs-title class_\">Roman<\/span> <span class=\"hljs-title class_\">Elizarov<\/span>    - <span class=\"hljs-title class_\">Romain<\/span> <span class=\"hljs-title class_\">Guy<\/span>              - <span class=\"hljs-title class_\">Jake<\/span> <span class=\"hljs-title class_\">Wharton<\/span>            - <span class=\"hljs-title class_\">Square<\/span> (<span class=\"hljs-title class_\">Shark<\/span>)        - \u96f7\u9704\u9a4a \/ <span class=\"hljs-title class_\">Oboe<\/span>\n  - <span class=\"hljs-title class_\">Jake<\/span> <span class=\"hljs-title class_\">Wharton<\/span>      - <span class=\"hljs-title class_\">Leland<\/span> <span class=\"hljs-title class_\">Richardson<\/span>       - <span class=\"hljs-title class_\">Zac<\/span> <span class=\"hljs-title class_\">Sweers<\/span> (IR\/KSP)     - <span class=\"hljs-title class_\">Meta<\/span> (<span class=\"hljs-title class_\">Profilo<\/span>\/<span class=\"hljs-title class_\">ReDex<\/span>)  - <span class=\"hljs-title class_\">Google<\/span> <span class=\"hljs-title class_\">Media3<\/span>\n  - <span class=\"hljs-title class_\">Manuel<\/span> <span class=\"hljs-title class_\">Vivo<\/span>       - <span class=\"hljs-title class_\">Jorge<\/span> <span class=\"hljs-title class_\">Castillo<\/span>          - <span class=\"hljs-title class_\">Slack<\/span> (<span class=\"hljs-title class_\">Circuit<\/span>\/<span class=\"hljs-title class_\">Anvil<\/span>)   - <span class=\"hljs-title class_\">Google<\/span> (<span class=\"hljs-title class_\">Macrobench<\/span>)   - <span class=\"hljs-title class_\">Android<\/span> NDK<\/code><\/pre>\n<hr>\n<h3>\u9818\u57df 1\uff1aKotlin \u8a9e\u8a00\u5e95\u5c64\u8207\u5354\u7a0b\u4f75\u767c<\/h3>\n<ul>\n<li><strong>\u5fc5\u8b80\u8cc7\u6e90<\/strong>\uff1a\n<ul>\n<li>Roman Elizarov Medium \u5c08\u6b04<\/li>\n<li><a href=\"https:\/\/github.com\/Kotlin\/KEEP\">Kotlin KEEP \u5354\u7a0b\u539f\u59cb\u8a2d\u8a08\u898f\u7bc4 (Design Document)<\/a><\/li>\n<li>Jake Wharton\u300aExploring Kotlin\u2019s Hidden Costs\u300b<\/li>\n<\/ul>\n<\/li>\n<li><strong>\u6838\u5fc3\u6280\u8853\u8996\u89d2<\/strong>\uff1a\n<ul>\n<li><strong>CPS (Continuation Passing Style) \u8f49\u63db<\/strong>\uff1a\u7de8\u8b6f\u5668\u5c07\u639b\u8d77\u51fd\u6578\u6539\u5beb\u70ba\u5e36\u72c0\u614b\u6a5f\uff08State Machine\uff09\u7684\u666e\u901a\u51fd\u6578\uff0c\u4ee5 <code>label<\/code> \u72c0\u614b\u5207\u63db\u8207\u5806\u7269\u4ef6\u7dad\u8b77\u73fe\u5834\u3002<\/li>\n<li><strong>\u5de5\u4f5c\u7aca\u53d6\u8abf\u5ea6\u5668\uff08Work-stealing Scheduler\uff09<\/strong>\uff1a\u89e3\u6790 <code>Dispatchers.Default<\/code> \u7684 <code>CoroutineScheduler<\/code>\uff0c\u63a2\u7a76\u6838\u5fc3\u57f7\u884c\u7dd2\u5982\u4f55\u5728\u7121\u9396\u4f47\u5217\u4e2d\u5e73\u8861\u9ad8\u4f75\u767c\u4efb\u52d9\u3002<\/li>\n<li><strong>\u7d50\u69cb\u5316\u751f\u547d\u9031\u671f\u6a39<\/strong>\uff1aParent-Child Job \u7d81\u5b9a\u6a5f\u5236\uff0c\u53d6\u6d88\u8a0a\u865f\u5411\u4e0b\u968e\u5c64\u5f0f\u5ee3\u64ad\uff0c\u4efb\u4f55\u672a\u6355\u7372\u7684\u4f8b\u5916\u6253\u7834\u5b50\u6a39\u4e26\u5411\u6839\u90e8\u4e0a\u62cb\u3002<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<hr>\n<h3>\u9818\u57df 2\uff1aJetpack Compose \u8207\u73fe\u4ee3 UI \u6e32\u67d3\u5f15\u64ce<\/h3>\n<ul>\n<li><strong>\u5fc5\u8b80\u8cc7\u6e90<\/strong>\uff1a\n<ul>\n<li>Romain Guy \u5716\u5f62\u6e32\u67d3\u7ba1\u7dda\u5c08\u984c<\/li>\n<li>Leland Richardson\u300aUnder the Hood of Jetpack Compose\u300b<\/li>\n<li>Jorge Castillo\u300aJetpack Compose Internals\u300b<\/li>\n<\/ul>\n<\/li>\n<li><strong>\u6838\u5fc3\u6280\u8853\u8996\u89d2<\/strong>\uff1a\n<ul>\n<li><strong>Slot Table \u8207 Gap Buffer<\/strong>\uff1a\u5229\u7528\u4e00\u7dad\u8a18\u61b6\u9ad4\u7a7a\u9593\u8a18\u9304 Composable \u6a39\u7d50\u69cb\uff0c\u4ee5 Gap \u79fb\u52d5\u7dad\u6301\u5c40\u90e8\u4fee\u6539\u7684 O(1) \u8907\u96dc\u5ea6\u3002<\/li>\n<li><strong>Snapshot MVCC<\/strong>\uff1a\u72c0\u614b\u8b80\u53d6\u8ffd\u8e64\u8207\u5beb\u5165\u9694\u96e2\u6a5f\u5236\uff0c\u5be6\u73fe\u8de8\u57f7\u884c\u7dd2\u72c0\u614b\u539f\u5b50\u6027\u8b8a\u66f4\u8207\u91cd\u7d44\u901a\u77e5\u3002<\/li>\n<li><strong>\u4e09\u968e\u6bb5\u7ba1\u7dda\uff08Composition -&gt; Layout -&gt; Draw\uff09<\/strong>\uff1a\u638c\u63e1\u8df3\u904e Composition \u8207 Layout \u76f4\u63a5\u9032\u5165 Draw \u968e\u6bb5\u7684\u512a\u5316\u624b\u6cd5\uff08\u4f8b\u5982\u50b3\u5165 Lambda \u4f5c\u70ba <code>Modifier.drawWithCache<\/code> \u6216 <code>Modifier.offset { ... }<\/code>\uff09\u3002<\/li>\n<li><strong>Modifier.Node \u65b0\u67b6\u69cb<\/strong>\uff1a\u5168\u9762\u6dd8\u6c70 <code>composed { }<\/code>\uff0c\u6539\u7528\u9ad8\u6548\u7d14\u7269\u4ef6 <code>Modifier.Node<\/code>\uff0c\u907f\u514d\u7121\u8b02\u7684\u8a18\u61b6\u9ad4\u914d\u7f6e\u8207\u91cd\u7d44\u958b\u92b7\u3002<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<hr>\n<h3>\u9818\u57df 3\uff1a\u7cfb\u7d71\u67b6\u69cb\u3001\u7de8\u8b6f\u9ed1\u9b54\u6cd5\u8207 R8\/D8<\/h3>\n<ul>\n<li><strong>\u5fc5\u8b80\u8cc7\u6e90<\/strong>\uff1a\n<ul>\n<li>Zac Sweers\u300aAnatomy of a Kotlin Compiler Plugin\u300b<\/li>\n<li>Meta Engineering\u300aReDex: Making Android Apps Smaller and Faster\u300b<\/li>\n<li>Jake Wharton\u300aAndroid\u2019s Java 8 Support \/ D8 and R8 Optimizations\u300b<\/li>\n<\/ul>\n<\/li>\n<li><strong>\u6838\u5fc3\u6280\u8853\u8996\u89d2<\/strong>\uff1a\n<ul>\n<li><strong>Kotlin IR \u8207 FIR (Frontend IR)<\/strong>\uff1a\u5229\u7528 K2 \u7de8\u8b6f\u5668\u67b6\u69cb\u76f4\u63a5\u6514\u622a AST \u9032\u884c\u4ee3\u78bc\u8b8a\u63db\uff0c\u96f6\u4ee3\u78bc\u751f\u6210\u958b\u92b7\u3002<\/li>\n<li><strong>R8 \/ ProGuard \u6df1\u5ea6\u6700\u4f73\u5316<\/strong>\uff1a\u53ef\u9054\u6027\u5206\u6790\uff08Reachability Graph\uff09\u3001Tree Shaking\u3001\u4f4d\u5143\u7d44\u78bc\u6241\u5e73\u5316\u3001\u591a\u578b\u8abf\u7528\u53bb\u865b\u64ec\u5316\uff08Devirtualization\uff09\u8207\u5167\u806f\uff08Inlining\uff09\u3002<\/li>\n<li><strong>DEX \u4f48\u5c40\u91cd\u6392\uff08DEX Layout Optimization\uff09<\/strong>\uff1a\u5229\u7528 Profile \u6307\u5f15\u5c07\u51b7\u71b1\u4ee3\u78bc\u7269\u7406\u9694\u96e2\u81f3\u4e0d\u540c\u7684 DEX \u5340\u584a\uff0c\u6975\u5927\u964d\u4f4e Page Fault\u3002<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<hr>\n<h3>\u9818\u57df 4\uff1a\u6975\u9650\u6548\u80fd\u3001\u8a18\u61b6\u9ad4\u6cbb\u7406\u8207 APM \u9ad4\u7cfb<\/h3>\n<ul>\n<li><strong>\u5fc5\u8b80\u8cc7\u6e90<\/strong>\uff1a\n<ul>\n<li>Square Blog\u300aLeakCanary 2: Shark &#8211; Fast HPROF Analysis in Pure Kotlin\u300b<\/li>\n<li>Google Developers\u300aBaseline Profiles Architecture and Runtime Impact\u300b<\/li>\n<li>\u5b57\u7bc0\u8df3\u52d5\u300aKOOM \u9ad8\u6027\u80fd\u7dda\u4e0a\u8a18\u61b6\u9ad4\u76e3\u63a7\u5eab\u539f\u7406\u300b\u8207 \u7f8e\u5718\u6280\u8853\u5718\u968a\u300aAndroid \u8a18\u61b6\u9ad4\u6cbb\u7406\u5be6\u8e10\u300b<\/li>\n<\/ul>\n<\/li>\n<li><strong>\u6838\u5fc3\u6280\u8853\u8996\u89d2<\/strong>\uff1a\n<ul>\n<li><strong>\u8a18\u61b6\u9ad4\u5feb\u7167\u7121\u611f\u77e5 Dump \u8207\u88c1\u5207<\/strong>\uff1a\u900f\u904e Fork \u5b50\u9032\u7a0b Dump \u6d88\u9664\u4e3b\u57f7\u884c\u7dd2\u51cd\u7d50\uff1b\u5728 Native \u5c64\u5c0d HPROF \u9032\u884c\u6a94\u6848\u7d50\u69cb\u88c1\u5207\uff08\u904e\u6ffe Bitmap \u8207\u7121\u95dc\u9663\u5217\u8cc7\u6599\uff09\uff0c\u4f7f\u5feb\u7167\u9ad4\u7a4d\u7e2e\u5c0f 80%\u3002<\/li>\n<li><strong>Baseline Profiles AOT \u7de8\u8b6f<\/strong>\uff1a\u5f15\u5c0e ART \u865b\u64ec\u6a5f\u5728\u5b89\u88dd\u671f\u5c07\u71b1\u9ede\u4f4d\u5143\u7d44\u78bc\u9810\u5148\u7de8\u8b6f\u70ba OAT \u672c\u6a5f\u4ee3\u78bc\uff0c\u5fb9\u5e95\u89e3\u6c7a JIT \u6696\u6a5f\u5361\u9813\u3002<\/li>\n<li><strong>ANR \u8207\u6b7b\u9396\u76e3\u63a7<\/strong>\uff1a\u7a81\u7834\u50b3\u7d71 Watchdog \u76f2\u5340\uff0c\u900f\u904e\u76e3\u807d\u7cfb\u7d71 SIGQUIT \u8a0a\u865f\uff08Signal 3\uff09\u6355\u7372 ANR Trace\uff0c\u7d50\u5408\u5167\u6838 Binder \u547c\u53eb\u72c0\u614b\u93c8\u89e3\u6790\u6392\u67e5 IPC \u6b7b\u9396\u3002<\/li>\n<li><strong>Linux PSI (Pressure Stall Information) \u8207 LMKD<\/strong>\uff1a\u7cbe\u6e96\u611f\u77e5\u7cfb\u7d71 CPU\/\u8a18\u61b6\u9ad4\/IO \u627f\u58d3\u72c0\u614b\uff0c\u5728\u9032\u7a0b\u88ab\u7cfb\u7d71 Kill \u4e4b\u524d\u4e3b\u52d5\u89f8\u767c\u5feb\u53d6\u91cb\u653e\u8207\u72c0\u614b\u843d\u5730\u3002<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<hr>\n<h3>\u9818\u57df 5\uff1a\u908a\u7de3\u8a08\u7b97\u3001\u97f3\u8996\u983b\u591a\u5a92\u9ad4\u8207 JNI<\/h3>\n<ul>\n<li><strong>\u5fc5\u8b80\u8cc7\u6e90<\/strong>\uff1a\n<ul>\n<li>\u96f7\u9704\u9a4a\u300a\u6700\u7c21\u55ae\u7684\u57fa\u65bc FFmpeg \u7684\u884c\u52d5\u7aef\u591a\u5a92\u9ad4\u7cfb\u5217\u300b<\/li>\n<li>Google Oboe \u5718\u968a\u300aReal-Time Audio in Android: AAudio &amp; OpenSL ES Best Practices\u300b<\/li>\n<li>Android NDK \u5b98\u65b9\u6587\u6a94\u300aAndroid JNI Tips: Local\/Global Reference Table Management\u300b<\/li>\n<li>Romain Guy\u300aHardware Buffers (AHardwareBuffer) &amp; Zero-Copy Texture Sharing\u300b<\/li>\n<\/ul>\n<\/li>\n<li><strong>\u6838\u5fc3\u6280\u8853\u8996\u89d2<\/strong>\uff1a\n<ul>\n<li><strong>JNI \u8a18\u61b6\u9ad4\u6a21\u578b\u8207\u96f6\u62f7\u8c9d<\/strong>\uff1a\u6df1\u5165\u5256\u6790 JVM \u672c\u5730\u5f15\u7528\u8868\uff08Local Reference Table\uff0c512 \u9650\u5236\uff09\u6ea2\u51fa\u6839\u56e0\uff1b\u5229\u7528 <code>GetDirectBufferAddress<\/code> \u76f4\u63a5\u8b93 Native C++ \u5b58\u53d6 Java \u5806\u5916\u8a18\u61b6\u9ad4\uff0c\u5be6\u73fe\u8996\u8a0a\u5f71\u683c\u96f6\u62f7\u8c9d\u50b3\u8f38\u3002<\/li>\n<li><strong>\u786c\u89e3\u78bc\u8207\u6e32\u67d3\u76f4\u901a\uff08Zero-Copy Direct Pipeline\uff09<\/strong>\uff1aMediaCodec \u89e3\u78bc\u70ba <code>SurfaceTexture<\/code> \/ <code>AHardwareBuffer<\/code>\uff0c\u8de8\u9032\u7a0b\u5171\u4eab\u986f\u5b58\u6307\u6a19\u76f4\u63a5\u905e\u4ea4 Vulkan\/OpenGL ES \u6e32\u67d3\uff0c\u5b8c\u5168\u7e5e\u958b CPU \u8a18\u61b6\u9ad4\u5f80\u8fd4\u3002<\/li>\n<li><strong>\u4f4e\u5ef6\u9072\u97f3\u8a0a\u5b50\u7cfb\u7d71<\/strong>\uff1a\u7e5e\u904e Java AudioTrack\uff0c\u76f4\u9023 <code>AAudio<\/code> \/ <code>Oboe<\/code> \u7684 Memory Mapped (MMAP) \u5171\u4eab\u97f3\u8a0a\u7de9\u885d\u5340\uff0c\u5c07\u97f3\u8a0a\u5f80\u8fd4\u5ef6\u9072\u58d3\u5236\u5230 10ms \u4ee5\u5167\u3002<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<hr>\n<h1>\u56db\u3001 \u7e3d\u7d50\uff1a\u8cc7\u6df1\u67b6\u69cb\u5e2b\u7684\u4e00\u751f\u9032\u968e\u8def\u5f91<\/h1>\n<p>\u6536\u85cf\u4e86\u4e00\u5806\u5927\u795e\u6587\u7ae0\uff0c\u6700\u6015\u7684\u5c31\u662f\u300c\u5168\u5728\u6536\u85cf\u593e\u5403\u7070\u300d\u3002\u8981\u771f\u6b63\u5403\u900f\u9019\u5f35\u5168\u666f\u5730\u5716\uff0c\u5efa\u8b70\u4f9d\u5faa\u4ee5\u4e0b\u4e94\u500b\u968e\u68af\u7531\u6dfa\u5165\u6df1\u63a8\u9032\uff1a<\/p>\n<ol>\n<li><strong>Level 1\uff08\u7cfb\u7d71\u7269\u7406\u5e95\u5c64\uff09<\/strong>\uff1a\u5148\u8b80\u61c2 Gityuan \u7684 Binder \u9a45\u52d5\u8207\u7cfb\u7d71\u555f\u52d5\u67b6\u69cb\uff0c\u914d\u5408\u8001\u7f85\u7684\u6e90\u78bc\u5206\u6790\u6846\u67b6\uff0c\u5728\u8166\u4e2d\u5efa\u7acb Android OS \u7684\u5168\u666f\u7269\u7406\u6c99\u76e4\u3002<\/li>\n<li><strong>Level 2\uff08\u8a9e\u6cd5\u7cd6\u8207\u4f75\u767c\u672c\u8cea\uff09<\/strong>\uff1a\u901a\u8b80 Roman Elizarov \u7684\u5354\u7a0b\u67b6\u69cb\u8207 Jake Wharton \u7684\u4f4d\u5143\u7d44\u78bc\u812b\u7cd6\u7cfb\u5217\uff0c\u770b\u900f\u9ad8\u7d1a\u8a9e\u6cd5\u7cd6\u80cc\u5f8c\u7684\u904b\u884c\u6642\u4ee3\u50f9\u3002<\/li>\n<li><strong>Level 3\uff08\u73fe\u4ee3 UI \u6e32\u67d3\u5f15\u64ce\uff09<\/strong>\uff1a\u4ee5 Leland Richardson \u7684 Slot Table \u8207 Romain Guy \u7684\u5716\u5f62\u7ba1\u7dda\u70ba\u5207\u5165\u9ede\uff0c\u5fb9\u5e95\u653b\u514b Compose \u6e32\u67d3\u8207\u91cd\u7d44\u6548\u80fd\u3002<\/li>\n<li><strong>Level 4\uff08\u5de5\u696d\u5316\u67b6\u69cb\u8996\u91ce\uff09<\/strong>\uff1a\u7814\u8b80 Square\u3001Meta\u3001Slack\u3001Uber \u7684\u5de5\u7a0b\u535a\u5ba2\uff0c\u5b78\u7fd2\u8d85\u5927\u898f\u6a21\u5de5\u7a0b\u4e0b\u7684\u6a21\u7d44\u5316\u3001\u7de8\u8b6f\u9ed1\u9b54\u6cd5\u3001AST \u81ea\u52d5\u5316\u91cd\u69cb\u8207\u96f6 OOM \u76e3\u63a7\u8a2d\u8a08\u3002<\/li>\n<li><strong>Level 5\uff08\u6df1\u5165\u786c\u9ad4\u8207 C++ \u908a\u7de3\u76f4\u901a\uff09<\/strong>\uff1a\u4ee5\u96f7\u795e\u97f3\u8996\u983b\u8207 Android NDK \u6700\u4f73\u5be6\u8e10\u70ba\u7db1\uff0c\u638c\u63e1\u8de8\u5c64\u8a18\u61b6\u9ad4\u96f6\u62f7\u8c9d\u3001\u591a\u5a92\u9ad4\u786c\u89e3\u7ba1\u7dda\u8207\u908a\u7de3\u7aef\u904b\u7b97\u6392\u7a0b\u3002<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>\u9019\u7bc7\u6587\u7ae0\u6700\u65e9\u5beb\u65bc 2015 \u5e74 9 \u6708\u3002 \u56de\u982d\u770b\u7576\u5e74\u7684\u7b46\u8a18\uff0c\u771f\u7684\u6eff\u6eff\u90fd\u662f\u300c\u6642\u4ee3\u7684\u773c\u6dda\u300d\u2014\u2014\u90a3\u6642\u6211\u5011\u9084\u5728\u7528 Ec [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[169],"tags":[180,253,135],"_links":{"self":[{"href":"https:\/\/boochlin.com\/index.php?rest_route=\/wp\/v2\/posts\/79"}],"collection":[{"href":"https:\/\/boochlin.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/boochlin.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/boochlin.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/boochlin.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=79"}],"version-history":[{"count":5,"href":"https:\/\/boochlin.com\/index.php?rest_route=\/wp\/v2\/posts\/79\/revisions"}],"predecessor-version":[{"id":1418,"href":"https:\/\/boochlin.com\/index.php?rest_route=\/wp\/v2\/posts\/79\/revisions\/1418"}],"wp:attachment":[{"href":"https:\/\/boochlin.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=79"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/boochlin.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=79"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/boochlin.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=79"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}