{"id":139,"date":"2024-08-25T12:58:58","date_gmt":"2024-08-25T04:58:58","guid":{"rendered":"https:\/\/newstrong.xyz\/?p=139"},"modified":"2024-08-25T12:58:58","modified_gmt":"2024-08-25T04:58:58","slug":"android-%e6%80%a7%e8%83%bd%e4%bc%98%e5%8c%96%ef%bc%9a-%e5%90%af%e5%8a%a8%e4%bc%98%e5%8c%96%e7%90%86%e8%ae%ba%e4%b8%8e%e5%ae%9e%e8%b7%b5-3","status":"publish","type":"post","link":"https:\/\/newstrong.top\/index.php\/2024\/08\/25\/android-%e6%80%a7%e8%83%bd%e4%bc%98%e5%8c%96%ef%bc%9a-%e5%90%af%e5%8a%a8%e4%bc%98%e5%8c%96%e7%90%86%e8%ae%ba%e4%b8%8e%e5%ae%9e%e8%b7%b5-3\/","title":{"rendered":"Android \u6027\u80fd\u4f18\u5316\uff1a \u542f\u52a8\u4f18\u5316\u7406\u8bba\u4e0e\u5b9e\u8df5"},"content":{"rendered":"<p>\u672c\u6587\u7ae0\u603b\u7ed3\u4e86\u76ee\u524d\u5e02\u9762\u4e0a\u5e38\u89c1\u7684\u4e00\u4e9b\u542f\u52a8\u4f18\u5316\u5e38\u7528\u624b\u6bb5\uff0c\u5f00\u53d1\u548c\u9762\u8bd5\u5fc5\u5907\u54e6\u3002\u9996\u5148\u8981\u505a\u5e94\u7528\u542f\u52a8\u4f18\u5316\uff0c\u4f60\u5f97\u5bf9\u5e94\u7528\u542f\u52a8\u6d41\u7a0b\u6709\u4e2a\u6574\u4f53\u751a\u81f3\u7ec6\u5316\u7684\u4e86\u89e3\u3002<\/p>\n<p><em>1<\/em><\/p>\n<p>\u5e94\u7528\u542f\u52a8\u5168\u8def\u5f84\u5206\u6790<\/p>\n<p>\u5e94\u7528\u542f\u52a8\u8fc7\u7a0b\u6574\u4f53\u5206\u4e3a\u4e24\u5927\u9636\u6bb5\uff1a<strong>Application\u542f\u52a8 \u9636\u6bb5\u3001Activity \u542f\u52a8\u9636\u6bb5<\/strong>\u3002<\/p>\n<h3><strong>Application\u542f\u52a8\u9636\u6bb5<\/strong><\/h3>\n<p>1.\u70b9\u51fb\u684c\u9762\u5e94\u7528\u56fe\u6807\u8fd9\u4e2a\u65f6\u5019\u4f1a\u89e6\u53d1Launcher\u00a0app\u7684item\u4e8b\u4ef6\uff0cAMS\u9996\u5148\u4f1a\u5224\u65ad\u5f53\u524d\u5e94\u7528\u8fdb\u7a0bProcessRecord\u662f\u5426\u5b58\u5728\uff0c\u4e0d\u5b58\u5728\uff0c\u5219\u4f1a\u8bf7\u6c42zygote\u8fdb\u7a0b\u53bb\u521b\u5efa\u5bf9\u5e94\u7684app\u8fdb\u7a0b\uff0capp\u8fdb\u7a0b\u7531zygote\u5b75\u5316\u51fa\u6765\u540e\uff0c\u9996\u5148\u4f1a\u6267\u884cActivityThread\u7684main\u65b9\u6cd5\uff0c<strong>\u8fd9\u91cc\u53ef\u4ee5\u770b\u6210\u662f\u5355\u4e2a\u8fdb\u7a0b\u7684\u5165\u53e3\u65b9\u6cd5<\/strong>\uff0c\u548cjava\u4e2d\u7684main\u65b9\u6cd5\u4e00\u6837\u3002<\/p>\n<p>2.\u5728main\u65b9\u6cd5\u4e2d\uff0c\u4f1a<strong>\u521b\u5efa\u6d88\u606f\u5faa\u73af\u548c\u4e3b\u7ebf\u7a0bHandler<\/strong>\uff0c\u63a5\u7740\u4f1a\u8c03\u7528AMS\u7684attachApplication\u5e76\u4f20\u5165\u5f53\u524d\u5e94\u7528\u7684binder\u5bf9\u8c61\uff0c\u7528\u4e8eAMS\u548c\u5f53\u524d\u5e94\u7528\u8fdb\u7a0b\u4ea4\u4e92\u3002<\/p>\n<p>3.AMS\u7684attachApplication\u4e2d\u4f1a\u521b\u5efa\u4e00\u4e2aProcessRecord\u7528\u4e8e\u8bb0\u5f55\u5f53\u524d\u8fdb\u7a0b\u72b6\u6001\u3002\u5e76\u56de\u8c03thread.bindApplication\u7684\u65b9\u6cd5\uff0c\u5c06\u5f53\u524d\u8fdb\u7a0b\u72b6\u6001\u4fe1\u606f\u4f20\u9012\u7ed9\u5e94\u7528\u8fdb\u7a0b\u3002<\/p>\n<p>4.\u5e94\u7528\u8fdb\u7a0b\u5728\u53d7\u5230AMS\u7684bindApplication\u65b9\u6cd5\u540e\uff0c\u5c06\u8fdb\u7a0b\u4fe1\u606f\u5b58\u50a8\u5728\u4e00\u4e2aAppBindData\u5bf9\u8c61\u4e2d\uff0c\u5e76\u4f7f\u7528Handler\u4f20\u9012\uff0c\u6700\u7ec8\u4f1a\u6267\u884c\u5230ActivityThread\u7684handleBindApplication\u3002<strong>\u8fd9\u4e2a\u65f6\u95f4\u70b9\u5c31\u53ef\u4ee5\u770b\u505a\u662f\u5e94\u7528\u8fdb\u7a0b\u542f\u52a8\u5f00\u59cb\u65f6\u95f4\u3002<\/strong><\/p>\n<p>5.\u5728handleBindApplication\u4e2d\u8c03\u7528\u00a0data.info.makeApplication()\uff0c\u8fd9\u4e2a\u65b9\u6cd5\u5185\u90e8\u4f1a\u521b\u5efa\u5e94\u7528context\u4e14\u4f7f\u7528\u53cd\u5c04\u521b\u5efaApplication\uff0c\u5e76\u4f9d\u6b21\u8c03\u7528Application\u7684attach\uff0cattach\u65b9\u6cd5\u4f1a\u8c03\u7528attachBaseContext\u65b9\u6cd5\uff0c<strong>\u8fd9\u4e5f\u662f\u5e94\u7528\u7684\u6700\u65e9\u52a0\u8f7d\u65f6\u673a<\/strong>\u3002<\/p>\n<p>6.\u5728handleBindApplication\u4e2dmakeApplication\u521b\u5efaapplication\u540e\uff0c\u4f1a\u7ee7\u7eed\u6267\u884cinstallContentProviders\uff0c\u8fd9\u4e2a\u65b9\u6cd5\u5185\u90e8\u6267\u884cinstallProvider\uff0cinstallProvider\u65b9\u6cd5\u4e2d\u4f1a\u4f7f\u7528\u53cd\u5c04\u521b\u5efa\u8fdb\u7a0b\u4e2d\u7684ContentProvider\uff0c\u4e5f\u5c31\u662f\u6e05\u5355\u4e2d\u7684ContentProvider\u3002\u5e76\u56de\u8c03ContentProvider\u5bf9\u8c61\u7684attachInfo\uff0c\u5728attachInfo\u4e2d\u4f1a\u5c06\u6e05\u5355\u4e2d\u7684\u5c5e\u6027\u8d4b\u503c\u7ed9\u5f53\u524dContentProvider\u5bf9\u8c61\u3002\u5e76\u8c03\u7528ContentProvider\u7684onCreate\u65b9\u6cd5\u3002\u5f88\u591a\u4e09\u65b9sdk\u5728\u8fd9\u91cc\u8fdb\u884c\u4e00\u4e9b\u521d\u59cb\u5316\u64cd\u4f5c\uff0c\u53ef\u80fd\u5bfc\u81f4\u542f\u52a8\u8017\u65f6\u7684\u4e0d\u53ef\u63a7\uff0c\u9700\u8981\u6309\u5177\u4f53case\u4f18\u5316\u3002<\/p>\n<p>7.\u6700\u540e\u6267\u884capplication\u7684onCreate\u65b9\u6cd5\u3002<strong>\u8fd9\u91cc\u662f\u5f88\u591a\u4e09\u65b9\u5e93\u548c\u4e1a\u52a1\u521d\u59cb\u5316\u4e4b\u5904\uff0c\u4e5f\u662f\u542f\u52a8\u4f18\u5316\u6700\u4e3b\u8981\u4f18\u5316\u70b9\uff0c\u53ef\u901a\u8fc7\u5f02\u6b65\uff0c\u6309\u9700\uff0c\u9884\u52a0\u8f7d\u7b49\u65b9\u5f0f\u8fdb\u884c\u4f18\u5316<\/strong>\u3002<\/p>\n<p>\u770bApplication\u542f\u52a8\u56fe\uff1a<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/newstrong.xyz\/wp-content\/uploads\/2024\/08\/frc-a382e785a552a89b414d3ad2eb73f7af.png\" alt=\"\" \/><\/p>\n<p>Activity\u542f\u52a8\u6d41\u7a0b1<\/p>\n<p>\u8fd9\u91cc\u6211\u4eec\u63d0\u53d6\u5e94\u7528\u53ef\u89e6\u53ca\u70b9\uff1a<strong>\u6309\u65f6\u95f4\u987a\u5e8f\uff1a<\/strong><\/p>\n<p><strong>1.Application\u7684<code>attachBaseContext<\/code>\u65b9\u6cd5\u3002<\/strong><\/p>\n<p><strong>2.ContentProvider\u7684<code>attachInfo\u4ee5\u53caonCreate<\/code>\u65b9\u6cd5\u3002<\/strong><\/p>\n<p><strong>3.Application\u7684<code>onCreate<\/code>\u65b9\u6cd5\u3002<\/strong><\/p>\n<h3><strong>Activity\u542f\u52a8\u9636\u6bb5<\/strong><\/h3>\n<p>1.\u56de\u5230Application\u6b65\u9aa4\u5206\u67903\uff1aAMS\u56de\u8c03thread.bindApplication\u7684\u65b9\u6cd5\u540e\uff0c<strong>\u5728bindApplication\u7684\u65b9\u6cd5\u6267\u884c\u5b8c\u6210\u540e<\/strong>\uff0c\u4f1a\u7ee7\u7eed\u56de\u8c03mStackSupervisor.attachApplicationLocked(app)\u8fd9\u4e2a\u65b9\u6cd5\u4e2d\uff1a\u83b7\u53d6\u5f53\u524d\u8fdb\u7a0b\u7684\u7b2c\u4e00\u4e2a\u975eLauncherActivity\uff0c\u7136\u540e\u8c03\u7528realStartActivityLocked\u53bb\u542f\u52a8\u6839Activity\u3002<\/p>\n<p>2.\u7136\u540e\u5c31\u662f<strong>\u521b\u5efaActivity\uff0c\u5e76\u6267\u884cActivity\u751f\u547d\u5468\u671f\uff0cOnCreate\u65b9\u6cd5\u662f\u9996\u5c4f\u4e1a\u52a1\u4f18\u5316\u7684\u4e3b\u8981\u573a\u666f\u4e5f\u662f\u5f00\u542f\u5e76\u53d1\u7684\u4e3b\u8981\u65f6\u673a\uff0c\u5176\u4e2d\u4f1a\u6267\u884csetContentView<\/strong>\uff0c\u8fd9\u91cc\u4f1a\u89e6\u53d1DecorView\u00a0\u7684\u00a0install\uff0c\u53bb<strong>\u89e3\u6790xml\u6570\u636e\uff0c\u5e76\u8f6c\u6362\u4e3aView<\/strong>\u3002\u8fd9\u91cc\u662f\u4e00\u4e2a\u8017\u65f6\u64cd\u4f5c\u3002<strong>\u53ef\u91c7\u7528\u5f02\u6b65 Inflate \u914d\u5408 X2C\uff08\u7f16\u8bd1\u671f\u5c06 xml \u5e03\u5c40\u8f6c\u4ee3\u7801\uff09\u5e76\u63d0\u5347\u76f8\u5e94\u5f02\u6b65\u7ebf\u7a0b\u4f18\u5148\u7ea7\u7684\u65b9\u6cd5\u7efc\u5408\u4f18\u5316<\/strong>\u3002<\/p>\n<p>3.\u6700\u540e\u5c31\u662fView\u7684\u6e32\u67d3\u64cd\u4f5c\uff0c\u5305\u62ecView\u7684<strong>\u4e09\u5927measure\uff0clayout\uff0cdraw<\/strong>\u3002\u53ef\u5c1d\u8bd5\u4ece\u5c42\u7ea7\uff0c\u5e03\u5c40\uff0c\u6e32\u67d3\u4e0a\u53d6\u5f97\u4f18\u5316\u6536\u76ca\u3002<\/p>\n<p>\u770bActivity\u542f\u52a8\u5b8c\u6574\u56fe\uff1a<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/newstrong.xyz\/wp-content\/uploads\/2024\/08\/frc-6ef3933baa5a40c541613481d1359fa7.png\" alt=\"\" \/><\/p>\n<p>Activity\u542f\u52a8\u6d41\u7a0b<\/p>\n<p>\u540c\u6837\u6211\u4eec\u63d0\u53d6\u5e94\u7528Activity\u53ef\u89e6\u53ca\u70b9\uff1a\u6309\u65f6\u95f4\u987a\u5e8f\uff1a<\/p>\n<p>1.setContentView\u3002<\/p>\n<p>2.view\u7684\u4e09\u5927\u6b65\u9aa4\u4ee5\u53ca\u6e32\u67d3\u8fc7\u7a0b\u3002<\/p>\n<p>\u603b\u7ed3\u4e0b\u6211\u4eec\u5e94\u7528\u53ef\u4f18\u5316\u8def\u5f84\u3002<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/newstrong.xyz\/wp-content\/uploads\/2024\/08\/frc-27ee7b2ada4ff2180a63f3da6b100a46.jpeg\" alt=\"\" \/><\/p>\n<p>\u542f\u52a8\u4f18\u5316\u5168\u8def\u5f84\\<br \/>\n\u8fd9\u91cc\u7ecf\u8fc7\u5bf9\u5e94\u7528\u542f\u52a8\u5168\u6d41\u7a0b\u5206\u6790\uff0c\u63d0\u53d6\u51fa\u4e86\u5e94\u7528\u7684\u4e00\u4e9b\u53ef\u89e6\u53ca\u70b9\uff0c\u8fd9\u4e9b\u53ef\u89e6\u53ca\u70b9\u5c31\u662f\u6211\u4eec\u542f\u52a8\u4f18\u5316\u8fc7\u7a0b\u4e2d\u5e94\u7528\u53ef\u4f18\u5316\u90e8\u5206\u3002<\/p>\n<p><em>2<\/em><\/p>\n<p>\u5e94\u7528\u542f\u52a8\u8017\u65f6\u5f52\u56e0<\/p>\n<p>\u542f\u52a8\u8017\u65f6\u4e3b\u8981\u662f\u7531\u4ee5\u4e0b\u51e0\u65b9\u9762\u7ec4\u6210\uff1a<\/p>\n<p>1.CPU time\uff1a\u6307\u4e0d\u5408\u7406\u7684\u5360\u7528CPU\u65f6\u95f4\u7247\u3002\u4e3e\u4f8b\uff1a<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a01.<strong>\u4e00\u4e2a\u4f4e\u6548\u7684\u904d\u5386\u7b97\u6cd5<\/strong>\uff0c\u53ef\u901a\u8fc7\u4f7f\u7528\u66f4\u52a0\u9ad8\u6548\u7684\u7b97\u6cd5\u5982\u7a7a\u95f4\u6362\u65f6\u95f4\u7684\u65b9\u5f0f\u3002<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a02.<strong>\u7c7b\u52a0\u8f7d\u8fc7\u7a0b<\/strong>\uff1a\u53ef\u901a\u8fc7\u7c7b\u91cd\u6392\u4f18\u5316\u3002<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a03.<strong>\u53cd\u5c04<\/strong>\uff1a\u53cd\u5c04\u4e5f\u662f\u4e00\u4e2a\u76f8\u5bf9\u8017\u65f6\u8fc7\u7a0b\u3002<\/p>\n<p>2.CPU Scheduler\uff1a\u4e3b\u7ebf\u7a0b\u83b7\u53d6\u4e0d\u5230\u8db3\u591f\u7684Cpu\u65f6\u95f4\u7247\uff0c\u8fd9\u79cd\u60c5\u51b5\u6bd4\u8f83\u5c11\u89c1\uff0c\u6bd5\u7adf\u4e3b\u7ebf\u7a0b\u4f18\u5148\u7ea7\u4e5f\u6bd4\u8f83\u9ad8\u3002\u6709\u4e2a\u7279\u6b8a\u60c5\u51b5\uff1a\u5c31\u662f\u6e32\u67d3\uff0c\u6e32\u67d3\u662f\u9700\u8981 RenderThread \u63d0\u4ea4 GPU \u7684\u6e32\u67d3\u547d\u4ee4\uff0c\u800c RenderThread \u5e76\u6ca1\u6709\u4e3b\u7ebf\u7a0b\u90a3\u4e48\u9ad8\u7684\u4f18\u5148\u7ea7\uff0c\u56e0\u6b64\u6bd4\u8f83\u5bb9\u6613\u53d7 CPU \u7684\u8d1f\u8f7d\u7684\u5f71\u54cd\uff0c\u5bfc\u81f4\u6e32\u67d3\u8017\u65f6\u8fd9\u79cd\u60c5\u51b5\u8fd8\u662f\u9700\u8981\u8003\u8651\u964d\u4f4eCpu\u8d1f\u8f7d\u8fdb\u884c\u4f18\u5316\u6216\u8005\u63d0\u5347RenderThread\u7684\u4f18\u5148\u7ea7\u3002<\/p>\n<p>3.IO Wait\uff1a\u8bfb\u53d6\u8d44\u6e90\u548c\u6587\u4ef6\uff0c\u7c7b\u52a0\u8f7d\u7b49\u8fc7\u7a0b\u4ea7\u751f\u7684IO\u8017\u65f6\u95ee\u9898\u3002<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0<strong>\u00a0\u00a0\u00a0\u5bf9\u4e8e\u8d44\u6e90\u8bfb\u53d6<\/strong>\uff1a\u53ef\u4ee5\u4f7f\u7528\u9884\u52a0\u8f7d\uff0c\u8d44\u6e90\u91cd\u6392\uff0c\u8d44\u6e90\u5f02\u6b65\u52a0\u8f7d\u7684\u65b9\u6848\u8fdb\u884c\u4f18\u5316\u3002<\/p>\n<p>\u00a0\u00a0\u00a0<strong>\u00a0\u00a0\u00a0\u00a0\u5bf9\u4e8e\u7c7b\u52a0\u8f7d<\/strong>\uff1a\u4f7f\u7528\u9884\u52a0\u8f7d\uff0c\u7c7b\u91cd\u6392\u7684\u65b9\u6848\u3002<\/p>\n<p>4.Lock Wait: \u4e5f\u662f\u4e3b\u8981\u9488\u5bf9\u4e3b\u7ebf\u7a0b\uff0c\u6307\u5176\u5904\u4e8e\u7b49\u9501\u72b6\u6001\u3002\\<br \/>\n\u4e00\u822c\u65b9\u6848\uff1a<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0<strong>\u00a0\u00a0\u00a0\u00a0\u65b9\u68481<\/strong>\uff1a\u52a0\u5feb\u4e1a\u52a1\u9501\u6267\u884c\u8fc7\u7a0b\u3002<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<strong>\u00a0\u00a0\u65b9\u68482<\/strong>\uff1a\u79fb\u9664\u4e3b\u7ebf\u7a0b\u7684\u9501\u3002<\/p>\n<p>5.binder\u591a\u8fdb\u7a0b\uff1a\u8fdb\u7a0b\u95f4\u901a\u8baf\u4e5f\u662f\u4e00\u4e2a\u8017\u65f6\u8fc7\u7a0b\uff0c\u975e\u5fc5\u8981\u6761\u4ef6\u4e0b\u5c3d\u91cf\u5c11\u4f7f\u7528\u591a\u8fdb\u7a0b\u3002<\/p>\n<p>\u8fd9\u91cc\u4f7f\u7528View\u7684\u6784\u5efa\u548c\u6e32\u67d3\u8fc7\u7a0b\u4e3a\u4f8b\u6765\u8bb2\u89e3\u4e0b\u5e94\u7528\u542f\u52a8\u8017\u65f6\u5f52\u56e0\u6b65\u9aa4\uff1a<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/newstrong.xyz\/wp-content\/uploads\/2024\/08\/frc-b8cfc160a3d701b14089a11a19ef0fba.jpeg\" alt=\"\" \/><\/p>\n<p>\u542f\u52a8\u8017\u65f6\u5206\u6790\\<br \/>\nUI\u6784\u5efa\u9636\u6bb5\uff1a<\/p>\n<p>1.\u8bfb\u53d6xml\u6587\u4ef6\u4fe1\u606f\uff0c\u5b58\u5728IO Wait\u3002<\/p>\n<p>2.\u6839\u636eTAG\u53bb\u89e3\u6790xml\u4e2d\u7684\u8282\u70b9\uff0c\u5b58\u5728\u5faa\u73af\u5d4c\u5957\u9012\u5f52\u3002<\/p>\n<p>3.\u6839\u636eclass\u7684name\u4f7f\u7528\u53cd\u5c04\u521b\u5efaview\u5b9e\u4f8b\u6700\u540e\u751f\u6210View\u6811\uff0c\u5b58\u5728\u53cd\u5c04\u3002<\/p>\n<p>\u6570\u636e\u7ed1\u5b9a\u9636\u6bb5\uff1a<\/p>\n<p>1.\u5bf9\u6570\u636e\u8fdb\u884c\u8bf7\u6c42\uff0c\u89e3\u6790\uff0c\u9002\u914d\uff0c\u8fd9\u90e8\u5206\u6d89\u53ca\u5230\u7f51\u7edcIO Wait\uff0c\u5982\u4f7f\u7528JSON\u89e3\u6790\u6210Data Class\u5bf9\u8c61\uff0c\u50cfRetrofit\u7684\u4f7f\u7528\u8fc7\u7a0b\uff0c\u8fd8\u4f1a\u6d89\u53ca\u5230\u53cd\u5c04\u4ee5\u53ca\u5faa\u73af\u5d4c\u5957\u7684\u6570\u636e\u7c7b\u7b49\uff0c\u4f1a\u589e\u52a0CPU time\u3002<\/p>\n<p>2.\u66f4\u65b0UI\u3002<\/p>\n<p>View\u7684\u663e\u793a\uff1a<\/p>\n<p>1.\u6700\u5e38\u89c1\u7684\u5c31\u662fView\u7684\u7ed8\u5236\u4e09\u5927\u6b65\u9aa4measure,layout,draw\u3002\u8fd9\u4e09\u5927\u6b65\u9aa4\u4f1a\u5b58\u5728xml\u5e03\u5c40\u6587\u4ef6\u7684\u6587\u4ef6\u6811\u904d\u5386\uff0c\u5b58\u5728\u4e00\u5b9aCpu Time\u8017\u65f6\u3002<\/p>\n<p>2.\u4f7f\u7528RenderThread\u7ebf\u7a0b\u5c061\u4e2d\u7ed8\u5236\u597d\u7684\u6570\u636e\u63d0\u4f9b\u7ed9GPU\u53bb\u6e32\u67d3\uff0c\u8fd9\u91cc\u6d89\u53ca\u5230\u8fdb\u7a0b\u95f4\u901a\u8baf\u3002<\/p>\n<p><em>3<\/em><\/p>\n<p>\u5e94\u7528\u542f\u52a8\u8017\u65f6\u73b0\u72b6\u5206\u6790<\/p>\n<p>\u4f7f\u7528Profile \u5de5\u5177\u5bf9\u5e94\u7528\u542f\u52a8\u8fc7\u7a0b\u6253\u70b9\u5206\u6790\uff1a\\<br \/>\n\u5de5\u5177\uff1a<strong>TraceView\u3001Systrace\u3001Android Profiler \uff0c\u6296\u97f3Rhea<\/strong><\/p>\n<h3><strong>Systrace<\/strong><\/h3>\n<p>\u7528\u6765\u8bb0\u5f55\u5f53\u524d\u5e94\u7528\u7684\u7cfb\u7edf\u4ee5\u53ca\u5e94\u7528(\u4f7f\u7528Trace\u7c7b\u6253\u70b9)\u7684\u5404\u9636\u6bb5\u8017\u65f6\u4fe1\u606f\u5305\u62ec\u7ed8\u5236\u4fe1\u606f\u3002<\/p>\n<p>\u4f7f\u7528\u65b9\u5f0f\uff1a<\/p>\n<pre><code>Trace.beginSection(&quot;MyApp.onCreate_1&quot;);alt(200);Trace.endSection();<\/code><\/pre>\n<p><img decoding=\"async\" src=\"https:\/\/newstrong.xyz\/wp-content\/uploads\/2024\/08\/frc-a8896402a9028551fe3d39e7a51f257b.png\" alt=\"\" \/><\/p>\n<p>systrace\u622a\u56fe<\/p>\n<h3><strong>TraceView<\/strong><\/h3>\n<p>\u7528\u6765\u8bb0\u5f55\u5f53\u524d\u5f53\u524d\u5e94\u7528\u7684\u65b9\u6cd5\u8017\u65f6\u8def\u5f84\uff0c\u53ef\u4ee5\u9009\u53d6\u5f00\u59cb\u548c\u7ed3\u675f\u4f4d\u7f6e\uff0c\u53ea\u5728Debug\u72b6\u6001\u4e0b\u6709\u6548\uff0c\u9700\u8981\u4f7f\u7528Debug\u7c7b\u8fdb\u884c\u6253\u70b9\u8bb0\u5f55\u3002<\/p>\n<h3><strong>Android Profiler<\/strong><\/h3>\n<p>studio\u81ea\u5e26\u7684\u6027\u80fd\u5206\u6790\u5229\u5668\u3002\u4e0d\u4ec5\u53ef\u4ee5\u5206\u6790\u5f53\u524d\u5e94\u7528\u7684CPU\u4f7f\u7528\u7387\uff0c\u8fd8\u53ef\u4ee5\u8bb0\u5f55\u5f53\u524d\u5e94\u7528\u7684\u5185\u5b58\u4f7f\u7528\u65b9\u5f0f\u3002\\<br \/>\n\u53ef\u4ee5\u76f4\u63a5\u66ff\u4ee3TraceView\u8bb0\u5f55\u65b9\u6cd5\u8017\u65f6\u4fe1\u606f\u3002<\/p>\n<p>\u4f7f\u7528\u65b9\u5f0f\uff1a<\/p>\n<pre><code>Debug.startMethodTracing();back(100);alt(200);Debug.stopMethodTracing();<\/code><\/pre>\n<p><img decoding=\"async\" src=\"https:\/\/newstrong.xyz\/wp-content\/uploads\/2024\/08\/frc-be9891b92b60ca8ba8d49b224105c74c.png\" alt=\"\" \/><\/p>\n<p>androidprofile<\/p>\n<h3><strong>Rhea<\/strong><\/h3>\n<p>\u5b57\u8282\u81ea\u7814\u7684\u65b0\u4e00\u4ee3\u5168\u80fd\u578b\u6027\u80fd\u5206\u6790\u5de5\u5177\uff0c\u529f\u80fd\u5f3a\u5927\uff0c\u4e14\u6027\u80fd\u635f\u8017\u4f4e\u3002\u7f3a\u70b9\u5c31\u662f\u8fd8\u4e0d\u652f\u6301windows\u83b7\u53d6html\u6587\u4ef6\u3002\\<br \/>\n\u5730\u5740\uff1a<em><a href=\"https:\/\/juejin.cn\/post\/7052625610295738382\">https:\/\/juejin.cn\/post\/7052625610295738382<\/a><\/em><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/newstrong.xyz\/wp-content\/uploads\/2024\/08\/frc-fdd8bfd46b2d86ef3b24731b4bd57647.png\" alt=\"\" \/><\/p>\n<p>\u6253\u70b9\u5de5\u5177\u5bf9\u6bd4<\/p>\n<p><em>4<\/em><\/p>\n<p>\u5e94\u7528\u542f\u52a8\u5e38\u89c1\u8017\u65f6\u4f18\u5316<\/p>\n<p>\u4f18\u5316\u8fc7\u7a0b\u4e3b\u8981\u5206\u4e3a\uff1a<strong>\u4e3b\u7ebf\u7a0b\u76f4\u63a5\u4f18\u5316\u3001\u540e\u53f0\u7ebf\u7a0b\u95f4\u63a5\u4f18\u5316\u3001\u5168\u5c40\u4f18\u5316<\/strong>\u3002<\/p>\n<h3><strong>4.1\uff1a\u4e3b\u7ebf\u7a0b\u76f4\u63a5\u4f18\u5316<\/strong><\/h3>\n<p>\u6309\u5e94\u7528\u542f\u52a8\u751f\u547d\u5468\u671f\u4f18\u5316\u65b9\u6848<\/p>\n<h4><strong>4.1.1\uff1a4.x\u673a\u578b\u5b58\u5728MutilDex\u95ee\u9898\uff0c<\/strong><\/h4>\n<p>4.x\u4f4e\u7248\u672c\u673a\u578b\u4e2d Dalvik \u865a\u62df\u673a\u53ea\u80fd\u6267\u884c\u7ecf\u8fc7\u4f18\u5316\u540e\u7684 odex \u6587\u4ef6\uff0c\u800c4.x\u8bbe\u5907\u4e3a\u4e86\u52a0\u5feb\u5b89\u88c5\u65f6\u95f4\uff0c\u5bf9\u4e8e\u5206\u5305\u591adex\u7684\u60c5\u51b5\u4e0b\uff0c\u5b89\u88c5\u65f6\u53ea\u4f1a\u4f18\u5316\u7b2c\u4e00\u4e2adex\u6587\u4ef6\u4e3aodex\uff0c\u8fd9\u5c31\u5bfc\u81f4\u5176\u4ed6\u5b50\u5305\u9700\u8981\u5728Application\u7684attachBaseContext\u65b9\u6cd5\u4e2d\u8c03\u7528MutilDex.install\u6765\u4f18\u5316\u5269\u4f59\u7684dex\u6587\u4ef6\u6210\u4e3aodex\u3002\u8fd9\u662f\u4e2a\u76f8\u5f53\u8017\u65f6\u7684\u8fc7\u7a0b\u3002<\/p>\n<p>\u4f18\u5316\u65b9\u6848\uff1a<a href=\"https:\/\/mp.weixin.qq.com\/s?__biz=MzI1MzYzMjE0MQ==&amp;mid=2247485522&amp;idx=1&amp;sn=cddfb1c64642b53ee51ca00ce3c696ca&amp;scene=21#wechat_redirect\">\u6296\u97f3BoostMultiDex\u4f18\u5316\u5b9e\u8df5,Android\u4f4e\u7248\u672c\u4e0aAPP\u9996\u6b21\u542f\u52a8\u65f6\u95f4\u51cf\u5c1180%<\/a><\/p>\n<p>\u4f18\u5316\u6b65\u9aa4\uff1a<\/p>\n<p>1.\u9996\u5148\u4ece APK \u4e2d\u89e3\u538b\u83b7\u53d6\u539f\u59cb\u7684\u975e\u9996\u4e2a dex \u6587\u4ef6\u7684\u5b57\u8282\u7801\u3002<\/p>\n<p>2.\u8c03\u7528\u00a0<strong>Dalvik_dalvik_system_DexFile_openDexFile_bytearray<\/strong>\uff0c\u9010\u4e2a\u4f20\u5165\u4e4b\u524d\u4ece APK \u83b7\u53d6\u7684 DEX \u5b57\u8282\u7801\uff0c\u5b8c\u6210 DEX \u52a0\u8f7d\uff0c\u5f97\u5230\u5408\u6cd5\u7684 DexFile \u5bf9\u8c61\u3002<\/p>\n<p>3.\u5c06 DexFile \u90fd\u6dfb\u52a0\u5230 APP \u7684 PathClassLoader \u7684 DexPathList \u91cc\u3002<\/p>\n<p>4.\u5ef6\u540e\u5f02\u6b65\u5bf9\u975e\u9996\u4e2a dex \u8fdb\u884c odex \u4f18\u5316\u3002<\/p>\n<p>\u539f\u7406\uff1a<strong>\u5728\u542f\u52a8\u9636\u6bb5\u7ed5\u8fc7dex\u8f6codex\uff0c\u76f4\u63a5\u8ba9Dalvik \u865a\u62df\u673a\u52a0\u8f7d\u672a\u7ecf\u4f18\u5316\u7684dex\u6587\u4ef6\uff0c\u7136\u540e\u5728\u540e\u53f0\u5c06dex\u4f18\u5316\u4e3aodex\u6587\u4ef6\u3002\u9700\u8981\u5bf9java\u865a\u62df\u673a\u6709\u4e00\u5b9a\u7684\u8ba4\u77e5<\/strong>\u3002<\/p>\n<h4><strong>4.1.2\uff1aContentProvider\u4f18\u5316<\/strong><\/h4>\n<p>\u524d\u9762\u5728\u542f\u52a8\u6d41\u7a0b\u5206\u6790\u4e2d\u6211\u4eec\u8bf4\u5230\uff1aApplication\u7684attachBaseContext\u65b9\u6cd5\u6267\u884c\u5b8c\u540e\uff0c\u4f1a\u6267\u884cinstallProvider\u65b9\u6cd5\uff0c\u5e76\u6700\u7ec8\u6267\u884c\u5f53\u524d\u5e94\u7528\u6e05\u5355\u4e2d\u58f0\u660e\u7684\u6240\u6709ContentProvider\u7684onCreate\u65b9\u6cd5\u3002\u8fd9\u91cc\u4f1a\u6709\u4e00\u4e9b\u7b2c\u4e09\u65b9\u5e93\u7684\u521d\u59cb\u5316\u4f1a\u653e\u5230\u8fd9\u91cc\u9762\u3002<strong>\u5982\u679c\u662f\u6211\u4eec\u81ea\u5df1\u7684ContentProvider\u53ef\u4ee5\u901a\u8fc7\u903b\u8f91\u4f18\u5316\u6765\u964d\u4f4e\u8017\u65f6\uff0c\u5982\u679c\u662f\u7b2c\u4e09\u65b9\u5e93\u7684\u521d\u59cb\u5316\uff0c\u5219\u53ef\u4ee5\u8003\u8651\u4f7f\u7528\u4e0b\u9762\u7684\u65b9\u5f0f\u8fdb\u884c\u4f18\u5316<\/strong>\u3002<\/p>\n<p>\u6211\u4eec\u4ee5FileProvider\u4f18\u5316\u4e3a\u4f8b\uff1a<\/p>\n<blockquote>\n<p>FileProvider \u662f Android7.0\u00a0\u5f15\u5165\u7684\u7528\u4e8e\u8fdb\u884c\u6587\u4ef6\u8bbf\u95ee\u6743\u9650\u63a7\u5236\u7684\u7ec4\u4ef6\uff1a<\/p>\n<\/blockquote>\n<p>7.0\u524d\u6211\u4eec\u8bbf\u95eeuri\u65b9\u5f0f\u76f4\u63a5\u901a\u8fc7\uff1a<\/p>\n<pre><code>Uri.fromFile(new\u00a0File(filePath));<\/code><\/pre>\n<p>7.0\u4e4b\u540e\u6211\u4eec\u4f7f\u7528:<\/p>\n<pre><code>FileProvider.getUriForFile(context,\u00a0context.getPackageName()\u00a0+\u00a0&quot;.fileprovider&quot;,new\u00a0File(filePath));<\/code><\/pre>\n<p>FileProvider\u7ee7\u627fContentProvider\uff0c\u6309\u524d\u9762\u5206\u6790\u6211\u4eec\u6765\u770b\u4ed6\u7684attachInfo\u65b9\u6cd5\uff1a<\/p>\n<pre><code>public\u00a0void\u00a0attachInfo(@NonNull\u00a0Context\u00a0context,\u00a0@NonNull\u00a0ProviderInfo\u00a0info)\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0super.attachInfo(context,\u00a0info);\u00a0\u00a0\u00a0\u00a0\/\/\u00a0Check\u00a0our\u00a0security\u00a0attributes\u00a0\u00a0\u00a0\u00a0if\u00a0(info.exported)\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0throw\u00a0new\u00a0SecurityException(&quot;Provider\u00a0must\u00a0not\u00a0be\u00a0exported&quot;);\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0if\u00a0(!info.grantUriPermissions)\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0throw\u00a0new\u00a0SecurityException(&quot;Provider\u00a0must\u00a0grant\u00a0uri\u00a0permissions&quot;);\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0mStrategy\u00a0=\u00a0getPathStrategy(context,\u00a0info.authority.split(&quot;;&quot;)[0]);}\u8fdb\u5165getPathStrategy\uff1aprivate\u00a0static\u00a0PathStrategy\u00a0getPathStrategy(Context\u00a0context,\u00a0String\u00a0authority)\u00a0{\u00a0\u00a0\u00a0\u00a0PathStrategy\u00a0strat;\u00a0\u00a0\u00a0\u00a0synchronized\u00a0(sCache)\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0strat\u00a0=\u00a0sCache.get(authority);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if\u00a0(strat\u00a0==\u00a0null)\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0try\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0strat\u00a0=\u00a0parsePathStrategy(context,\u00a0authority);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0catch\u00a0(IOException\u00a0e)\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0throw\u00a0new\u00a0IllegalArgumentException(\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&quot;Failed\u00a0to\u00a0parse\u00a0&quot;\u00a0+\u00a0META_DATA_FILE_PROVIDER_PATHS\u00a0+\u00a0&quot;\u00a0meta-data&quot;,\u00a0e);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0catch\u00a0(XmlPullParserException\u00a0e)\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0throw\u00a0new\u00a0IllegalArgumentException(\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&quot;Failed\u00a0to\u00a0parse\u00a0&quot;\u00a0+\u00a0META_DATA_FILE_PROVIDER_PATHS\u00a0+\u00a0&quot;\u00a0meta-data&quot;,\u00a0e);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0sCache.put(authority,\u00a0strat);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0return\u00a0strat;}<\/code><\/pre>\n<p>\u5927\u90e8\u5206\u8017\u65f6\u65b9\u6cd5\u5c31\u96c6\u4e2d\u5728parsePathStrategy\u65b9\u6cd5\u4e2d\uff0c\u56e0\u4e3a\u8981\u53bb<strong>\u89e3\u6790xml\u6587\u4ef6\u8def\u5f84\u548c\u6587\u4ef6\u8bfb\u5199\u64cd\u4f5c\uff0c\u4f1a\u6709\u4e00\u5b9aIO\u548cCPU\u65f6\u95f4\u7247\u7684\u6d88\u8017\u3002<\/strong><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/newstrong.xyz\/wp-content\/uploads\/2024\/08\/frc-c00642daa6fbe995e7563363644cb84c.jpeg\" alt=\"\" \/><\/p>\n<p>FileProvider\u8017\u65f6\u5206\u6790\\<br \/>\n\u4e3a\u4e86\u4f18\u5316\u8fd9\u90e8\u5206\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u5b57\u8282\u7801\u63d2\u6869\u7684\u65b9\u5f0f\uff1a<\/p>\n<p><strong>1.\u5728attachInfo\u6267\u884cgetPathStrategy\u524d\uff0c\u63d2\u5165info.grantUriPermissions\u4e3afalse\uff0c\u5e76\u5728\u5916\u90e8\u6355\u83b7\u8fd9\u4e2a\u5f02\u5e38\uff0c\u8fd9\u6837\u5c31\u4f1a\u629b\u51faSecurityException\u800c\u4e0d\u4f1a\u6267\u884c\u4e0b\u9762\u7684getPathStrategy\u65b9\u6cd5\u3002<\/strong><\/p>\n<p><strong>2.\u5bf9 FileProvider \u7684 query\u3001getType\u3001openFile \u7b49\u65b9\u6cd5\u8fdb\u884c\u63d2\u6869\uff0c\u5728\u8c03\u7528\u539f\u65b9\u6cd5\u4e4b\u524d\u9996\u5148\u8fdb\u884c getPathStrategy \u7684\u521d\u59cb\u5316\uff0c\u5b8c\u6210\u521d\u59cb\u5316\u4e4b\u540e\u518d\u8c03\u7528\u539f\u59cb\u5b9e\u73b0\u3002<\/strong><\/p>\n<h4><strong>4.1.3\uff1aApplication \u7684 onCreate \u9636\u6bb5\u4f18\u5316<\/strong><\/h4>\n<p>Application \u7684 onCreate \u5176\u5b9e\u662f\u6574\u4e2aapp\u4f18\u5316\u7684\u5927\u5934\uff0c\u5927\u90e8\u5206\u7684\u7b2c\u4e09\u65b9\u521d\u59cb\u5316\u5de5\u4f5c\u4ee5\u53ca\u81ea\u8eab\u4e1a\u52a1\u76f8\u5173\u7684\u542f\u52a8\u4efb\u52a1\u90fd\u4f1a\u96c6\u4e2d\u5728\u8fd9\u91cc\u9762\u3002<\/p>\n<p>\u4efb\u52a1\u91cd\u6784\uff1a\u4efb\u52a1\u91cd\u6784\u5176\u5b9e\u5c31\u662f\u5bf9\u4efb\u52a1\u7684\u4e00\u4e2a\u5220\u51cf\u548c\u91cd\u6392\u7684\u64cd\u4f5c\uff0c\u6211\u4eec\u57fa\u4e8e\u4ee5\u4e0b\u539f\u5219\uff1a<\/p>\n<pre><code>-\u00a01.Application\u00a0\u4e2d\u7684\u4efb\u52a1\u5e94\u5f53\u662f\u5168\u5c40\u6838\u5fc3\u4efb\u52a1\uff0c\u5c31\u662f\u4e00\u5b9a\u8981\u8fd9\u4e2a\u65f6\u5019\u6267\u884c\u7684-\u00a02.Application\u00a0\u521b\u5efa\u65f6\u5e94\u5f53\u5c3d\u91cf\u51cf\u5c11\u7f51\u7edc\u8bf7\u6c42\u64cd\u4f5c\uff0c\u7f51\u7edc\u8bf7\u6c42\u4f1a\u8c03\u7528IO\u7ebf\u7a0b\u6267\u884c\u4e0b\u8f7d\uff0c\u4f1a\u5360\u7528\u8f83\u591aCPU\u65f6\u95f4\u7247\u4fe1\u606f\u3002-\u00a03.Application\u00a0\u521b\u5efa\u65f6\u4e0d\u5141\u8bb8\u6709\u5f3a\u4e1a\u52a1\u76f8\u5173\u7684\u4efb\u52a1-\u00a04.Application\u00a0\u521b\u5efa\u65f6\u5c3d\u91cf\u51cf\u5c11\u6709\u00a0Json\u00a0\u89e3\u6790\u5904\u7406\u548c\u00a0IO\u00a0\u64cd\u4f5c\u7684\u5de5\u4f5c<\/code><\/pre>\n<p>\u901a\u8fc7\u4e0a\u9762\u51e0\u4e2a\u539f\u5219\uff0c\u53ef\u4ee5\u5c06\u5e94\u7528\u4e2d\u5927\u90e8\u5206\u542f\u52a8\u4efb\u52a1\u5220\u9664\u6216\u8005\u5206\u5230\u5f02\u6b65\u4efb\u52a1\u4e2d\u3002\u6700\u540e\u4efb\u52a1\u4e3b\u8981\u5206\u4e3a\uff1a\u57fa\u7840\u5e93\u521d\u59cb\u5316\u4efb\u52a1\uff0c\u529f\u80fd\u914d\u7f6e\u4efb\u52a1\u548c\u5168\u5c40\u914d\u7f6e\u4efb\u52a1\u3002<\/p>\n<ul>\n<li>\n<ul>\n<li>\n<p><strong>\u57fa\u7840\u5e93\u521d\u59cb\u5316\u4efb\u52a1<\/strong>\uff1a\u4e3b\u8981\u662f\u5bf9\u7f51\u7edc\u5e93\uff0c\u65e5\u5fd7\u5e93\u7b49\u57fa\u7840\u5e93\u8fdb\u884c\u521d\u59cb\u5316\u914d\u7f6e\uff0c\u6211\u4eec\u6700\u7ec8\u76ee\u6807\u662f\u5728\u542f\u52a8\u9636\u6bb5\u5220\u9664\u8fd9\u4e9b\u4efb\u52a1\u3002\u9996\u5148\u8fd9\u4e9b\u4efb\u52a1\u4f1a\u6709\u4e9b\u8017\u65f6\uff0c\u5220\u9664\u4e86\u53c8\u53ef\u80fd\u4f1a\u5f71\u54cd\u529f\u80fd\u7684\u7a33\u5b9a\u6027\u3002<\/p>\n<p><strong>\u4e3b\u8981\u4f18\u5316\u65b9\u5f0f<\/strong>\uff1a\u5bf9\u4efb\u52a1\u8fdb\u884c\u539f\u5b50\u5316\u6539\u9020\uff0c\u5bf9\u4e8e\u9700\u8981\u5411sdk\u4e2d\u6ce8\u5165context,callback\u7b49\u5404\u7c7b\u53c2\u6570\u7684\u5b9e\u73b0\uff0c\u6539\u4e3a\u6309\u9700\u8c03\u7528\u3002<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\u00a0\u00a0\u00a0 1.\u5bf9\u81ea\u5df1\u5199\u7684\u4ee3\u7801\uff0c\u5982\u679c\u9700\u8981\u8bbe\u7f6econtext\uff0ccallback\u7b49\uff0c\u53ef\u4ee5\u5728\u9700\u8981\u7684\u65f6\u5019\uff0c\u5224\u65ad\u53c2\u6570\u662f\u5426\u5b58\u5728\uff0c\u7136\u540e\u53bb\u5e94\u7528\u5c42\u83b7\u53d6\uff0c\u6700\u540e\u4fdd\u5b58\u5728\u5185\u5b58\u4e2d\uff0c\u65b9\u4fbf\u4e0b\u6b21\u4f7f\u7528\u3002<\/p>\n<p>\u00a0\u00a0\u00a0 2.\u5bf9\u7b2c\u4e09\u65b9sdk\u4e2d\u7684context\uff0ccallback\u9700\u6c42\uff0c\u53ef\u4ee5\u5bf9\u4e09\u65b9sdk\u518d\u5c01\u88c5\u7684\u65b9\u5f0f\uff0c\u7136\u540e\u4f7f\u75281\u4e2d\u7684\u65b9\u5f0f\u8fdb\u884c\u5904\u7406\uff0c\u8fbe\u5230\u6309\u9700\u83b7\u53d6\u3002<\/p>\n<ul>\n<li>\n<p><strong>\u529f\u80fd\u914d\u7f6e\u4efb\u52a1<\/strong>\uff1a\u4e3b\u8981\u662f\u5bf9\u4e00\u4e9b\u5168\u5c40\u76f8\u5173\u7684\u4e1a\u52a1\u529f\u80fd\u7684\u524d\u7f6e\u914d\u7f6e\uff0c\u4f8b\u5982\u5bf9\u9996\u9875\u4e1a\u52a1\u6570\u636e\u7f13\u5b58\u7684\u9884\u52a0\u8f7d\u7b49\uff0c\u79fb\u9664\u5b83\u4eec\u4f1a\u9020\u6210\u4e1a\u52a1\u6709\u635f\u3002<\/p>\n<p>\u8fd9\u91cc\u53ef\u4ee5\u4f7f\u7528\u4e1a\u52a1\u964d\u7ea7\u6216\u8005\u4e1a\u52a1\u6253\u6563\u7684\u65b9\u5f0f\u8fdb\u884c\u5904\u7406\uff0c\u5982\u4e00\u4e2a\u7f51\u7edc\u8bf7\u6c42\u8bf7\u6c42\u5305\u542b\u4e00\u4e9b\u57fa\u7840\u6570\u636e\uff0c\u8fd8\u5305\u542b\u4e00\u4e9b\u56fe\u7247\u6570\u636e\uff0c\u53ef\u4ee5\u5c06\u8fd9\u4e2a\u7f51\u7edc\u8bf7\u6c42\u5206\u6210\u4e24\u4e2a\u63a5\u53e3\uff0c\u4f18\u5148\u53bb\u83b7\u53d6\\<br \/>\n\u57fa\u7840\u6570\u636e\uff0c\u518d\u53bb\u83b7\u53d6\u56fe\u7247\u6570\u636e\uff0c\u56fe\u7247\u6570\u636e\u53c8\u53ef\u4ee5\u5206\u4e3a\u524d\u53f0\u53ef\u89c1\u56fe\u7247\u548c\u540e\u53f0\u4e0d\u53ef\u89c1\u56fe\u7247\uff0c\u8fd9\u4e9b\u90fd\u53ef\u4ee5\u6392\u5217\u5148\u540e\u987a\u5e8f\u8fdb\u884c\u5904\u7406\uff0c\u5c3d\u91cf\u8ba9\u9996\u9875\u4f18\u5148\u5c55\u793a\u3002<\/p>\n<\/li>\n<li>\n<p><strong>\u5168\u5c40\u914d\u7f6e\u4efb\u52a1<\/strong>\uff1a\u4e3b\u8981\u662f\u5bf9\u4e8e\u5168\u5c40 UI \u914d\u7f6e\uff0c\u6587\u4ef6\u8def\u5f84\u7684\u5904\u7406\u64cd\u4f5c\uff0c\u5b83\u4eec\u5360\u6bd4\u5c11\uff0c\u8017\u65f6\u5c11\uff0c\u662f\u9996\u9875\u521b\u5efa\u7684\u524d\u7f6e\u4efb\u52a1\uff0c\u4f18\u5316\u65b9\u9762\u53ef\u4ee5\u6682\u4e0d\u5904\u7406\u3002<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u4efb\u52a1\u6392\u5e03<\/strong>\uff1a\u4efb\u52a1\u91cd\u6784\u597d\u540e\u5c31\u662f\u5bf9\u4efb\u52a1\u7684\u6392\u5e03\uff1a\u5176\u6838\u5fc3\u5c31\u662f\u5904\u7406\u597d\u4efb\u52a1\u7684\u524d\u540e\u4f9d\u8d56\u95ee\u9898\uff0c\u8fd9\u5c31\u8981\u6c42\u5f00\u53d1\u8005\u5bf9\u4e1a\u52a1\u6709\u8f83\u5f3a\u7684\u7406\u89e3\uff0c\u7531\u4e8e\u6bcf\u4e2a\u5e94\u7528\u7684\u60c5\u51b5\u90fd\u4e0d\u4e00\u81f4\uff0c\u8fd9\u91cc\u5c31\u4e0d\u4e3e\u4f8b\u4e86\u3002<\/p>\n<p><strong>\u8fd9\u91cc\u63d0\u51e0\u4e2a\u5173\u4e8eApplication\u7684onCreate\u9636\u6bb5\u542f\u52a8\u4efb\u52a1\u7684\u4f18\u5316\u65b9\u6848<\/strong>\uff1a<\/p>\n<h5><strong>1.\u7ebf\u7a0b\u4f18\u5316\u57fa\u7840\u65b9\u6848\uff1a<\/strong><\/h5>\n<ul>\n<li>\n<p>\u4e25\u7981\u4f7f\u7528new Thread\u7684\u65b9\u5f0f\u521b\u5efa\u5bf9\u8c61\uff0c\u8fd9\u79cd\u65b9\u5f0f\u521b\u5efa\u7684\u5bf9\u8c61\uff0c\u5982\u679c\u7ebf\u7a0b\u4e00\u76f4\u6ca1\u5904\u7406\u5b8c\u6216\u8005\u5904\u7406\u7f13\u6162\uff0c\u6700\u76f4\u89c2\u7684\u611f\u53d7\u5c31\u662f\u754c\u9762\u5361\u987f\u3002\u63a8\u8350\u4f7f\u7528\u7ebf\u7a0b\u6c60\u7684\u65b9\u5f0f\u5904\u7406\u3002<\/p>\n<\/li>\n<li>\n<p>\u63d0\u4f9b\u57fa\u7840\u7ebf\u7a0b\u6c60\u4f9b\u5404\u4e2a\u4e1a\u52a1\u4f7f\u7528\uff0c\u4e0d\u8981\u8ba9\u5404\u4e2a\u4e1a\u52a1\u7ef4\u62a4\u5404\u81ea\u7684\u7ebf\u7a0b\u6c60\uff0c\u9632\u6b62\u7ebf\u7a0b\u8fc7\u591a\uff0c\u5360\u7528\u8fc7\u591aCPU\u65f6\u95f4\u3002<\/p>\n<\/li>\n<li>\n<p>\u6839\u636e\u4efb\u52a1\u7c7b\u578b\u9009\u62e9\u5408\u9002\u7684\u5f02\u6b65\u65b9\u5f0f\uff1a\u4f18\u5148\u7ea7\u4f4e\uff0c\u957f\u65f6\u95f4\u6267\u884c\uff0cHandlerThread\uff1b\u5b9a\u65f6\u6267\u884c\u8017\u65f6\u4efb\u52a1\uff0c\u7ebf\u7a0b\u6c60\u3002<\/p>\n<\/li>\n<li>\n<p>\u521b\u5efa\u7ebf\u7a0b\u5fc5\u987b\u547d\u540d\uff0c\u4ee5\u65b9\u4fbf\u5b9a\u4f4d\u7ebf\u7a0b\u5f52\u5c5e\uff0c\u5728\u8fd0\u884c\u671f Thread.currentThread().setName \u4fee\u6539\u540d\u5b57\u3002<\/p>\n<\/li>\n<li>\n<p>\u5173\u952e\u5f02\u6b65\u4efb\u52a1\u76d1\u63a7\uff0c\u6ce8\u610f\u5f02\u6b65\u4e0d\u7b49\u4e8e\u4e0d\u8017\u65f6\uff0c\u5efa\u8bae\u4f7f\u7528AOP\u7684\u65b9\u5f0f\u6765\u505a\u76d1\u63a7\u3002<\/p>\n<\/li>\n<li>\n<p>\u91cd\u89c6\u4f18\u5148\u7ea7\u8bbe\u7f6e\uff08\u6839\u636e\u4efb\u52a1\u5177\u4f53\u60c5\u51b5\uff09\uff0cProcess.setThreadPriority() \u53ef\u4ee5\u8bbe\u7f6e\u591a\u6b21\u3002<\/p>\n<\/li>\n<\/ul>\n<h5><strong>2.\u7ebf\u7a0b\u6536\u655b<\/strong><\/h5>\n<p>\u7531\u4e8e\u9879\u76ee\u9700\u6c42\u8d8a\u6765\u8d8a\u591a\uff0c\u5404\u4e1a\u52a1\u5c42\uff0csdk\u5c42\u90fd\u4f1a\u4f7f\u7528\u5230\u591a\u4e2a\u7ebf\u7a0b\uff0c\u4e3a\u4e86\u907f\u514d\u7ebf\u7a0b\u81a8\u80c0\uff0c\u8fc7\u591a\u7684\u7ebf\u7a0b\u62a2\u5360CPU\uff0c\u751a\u81f3\u4f1a\u5bfc\u81f4\u4e3b\u7ebf\u7a0b\u5361\u987f\uff0c\u5f71\u54cd\u7528\u6237\u4f53\u9a8c\u3002\u9700\u8981\u8fdb\u884c\u7ebf\u7a0b\u6536\u655b\uff0c\u90a3\u4e48\u6536\u655b\u7b2c\u4e00\u6b65\u5c31\u662f\u8981\u5b9a\u4f4d\u7ebf\u7a0b\u5f52\u5c5e\u3002<\/p>\n<p>1.<strong>\u7ebf\u7a0b\u9501\u5b9a<\/strong>\uff1a\u627eHook\u70b9\uff1a\u6784\u9020\u51fd\u6570\u6216\u8005\u7279\u5b9a\u65b9\u6cd5\uff0c\u5982Thread\u7684\u6784\u9020\u51fd\u6570\u3002<\/p>\n<p>\u8fd9\u91cc\u6211\u4eec\u76f4\u63a5\u4f7f\u7528\u7ef4\u6570\u7684 epic \u5bf9Thread\u8fdb\u884cHook\u3002\u5728attachBaseContext\u4e2d\u8c03\u7528DexposedBridge.hookAllConstructors\u65b9\u6cd5\u5373\u53ef\uff0c\u5982\u4e0b\u6240\u793a\uff1a<\/p>\n<pre><code>DexposedBridge.hookAllConstructors(Thread.class,\u00a0new\u00a0XC_MethodHook()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0@Override\u00a0protected\u00a0void\u00a0afterHookedMethod\uff08MethodHookParam\u00a0param\uff09throws\u00a0Throwable\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0super.afterHookedMethod(param);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Thread\u00a0thread\u00a0=\u00a0(Thread)\u00a0param.thisObject;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0LogUtils.i(&quot;stack\u00a0&quot;\u00a0+\u00a0Log.getStackTraceString(new\u00a0Throwable());\u00a0\u00a0\u00a0\u00a0});<\/code><\/pre>\n<p>\u4ecelog\u627e\u5230\u7ebf\u7a0b\u521b\u5efa\u4fe1\u606f\uff0c\u6839\u636e\u5806\u6808\u4fe1\u606f\u8ddf\u76f8\u5173\u4e1a\u52a1\u65b9\u6c9f\u901a\u89e3\u51b3\u65b9\u6848\u3002<\/p>\n<p>2.<strong>\u7ebf\u7a0b\u6536\u655b<\/strong>\uff1a\u6839\u636e\u7ebf\u7a0b\u521b\u5efa\u5806\u6808\u8003\u91cf\u5408\u7406\u6027\uff0c\u4f7f\u7528\u7edf\u4e00\u7ebf\u7a0b\u5e93\u3002\u90a3\u4e48\u5982\u4f55\u7edf\u4e00\u7ebf\u7a0b\u5e93\uff1f<\/p>\n<p><strong>\u7edf\u4e00\u7ebf\u7a0b\u5e93\u65f6\u533a\u5206\u4efb\u52a1\u7c7b\u578b\uff1a<\/strong><\/p>\n<ul>\n<li>\n<p><strong>IO\u5bc6\u96c6\u578b\u4efb\u52a1<\/strong>\uff1aIO\u5bc6\u96c6\u578b\u4efb\u52a1\u4e0d\u6d88\u8017CPU\uff0c\u6838\u5fc3\u6c60\u53ef\u4ee5\u5f88\u5927\u3002\u5e38\u89c1\u7684IO\u5bc6\u96c6\u578b\u4efb\u52a1\u5982\u6587\u4ef6\u8bfb\u53d6\u3001\u5199\u5165\uff0c\u7f51\u7edc\u8bf7\u6c42\u7b49\u7b49\u3002<\/p>\n<\/li>\n<li>\n<p><strong>CPU\u5bc6\u96c6\u578b\u4efb\u52a1<\/strong>\uff1a\u6838\u5fc3\u6c60\u5927\u5c0f\u548cCPU\u6838\u5fc3\u6570\u76f8\u5173\u3002\u5e38\u89c1\u7684CPU\u5bc6\u96c6\u578b\u4efb\u52a1\u5982\u6bd4\u8f83\u590d\u6742\u7684\u8ba1\u7b97\u64cd\u4f5c\uff0c\u6b64\u65f6\u9700\u8981\u4f7f\u7528\u5927\u91cf\u7684CPU\u8ba1\u7b97\u5355\u5143\u3002<\/p>\n<\/li>\n<\/ul>\n<p>\u7edf\u4e00\u7ebf\u7a0b\u5e93\u4ee3\u7801\u5b9e\u73b0\uff1a<\/p>\n<pre><code>public\u00a0class\u00a0DispatcherExecutor\u00a0{\u00a0\u00a0\u00a0\u00a0\/**\u00a0\u00a0\u00a0\u00a0\u00a0*\u00a0CPU\u00a0\u5bc6\u96c6\u578b\u4efb\u52a1\u7684\u7ebf\u7a0b\u6c60\u00a0\u00a0\u00a0\u00a0\u00a0*\/\u00a0\u00a0\u00a0\u00a0private\u00a0static\u00a0ThreadPoolExecutor\u00a0sCPUThreadPoolExecutor;\u00a0\u00a0\u00a0\u00a0\/**\u00a0\u00a0\u00a0\u00a0\u00a0*\u00a0IO\u00a0\u5bc6\u96c6\u578b\u4efb\u52a1\u7684\u7ebf\u7a0b\u6c60\u00a0\u00a0\u00a0\u00a0\u00a0*\/\u00a0\u00a0\u00a0\u00a0private\u00a0static\u00a0ExecutorService\u00a0sIOThreadPoolExecutor;\u00a0\u00a0\u00a0\u00a0\/**\u00a0\u00a0\u00a0\u00a0\u00a0*\u00a0\u5f53\u524d\u8bbe\u5907\u53ef\u4ee5\u4f7f\u7528\u7684\u00a0CPU\u00a0\u6838\u6570\u00a0\u00a0\u00a0\u00a0\u00a0*\/\u00a0\u00a0\u00a0\u00a0private\u00a0static\u00a0final\u00a0int\u00a0CPU_COUNT\u00a0=\u00a0Runtime.getRuntime().availableProcessors();\u00a0\u00a0\u00a0\u00a0\/**\u00a0\u00a0\u00a0\u00a0\u00a0*\u00a0\u7ebf\u7a0b\u6c60\u6838\u5fc3\u7ebf\u7a0b\u6570\uff0c\u5176\u6570\u91cf\u57282\u00a0~\u00a05\u8fd9\u4e2a\u533a\u57df\u5185\u00a0\u00a0\u00a0\u00a0\u00a0*\/\u00a0\u00a0\u00a0\u00a0private\u00a0static\u00a0final\u00a0int\u00a0CORE_POOL_SIZE\u00a0=\u00a0Math.max(2,\u00a0Math.min(CPU_COUNT\u00a0-\u00a01,\u00a05));\u00a0\u00a0\u00a0\u00a0\/**\u00a0\u00a0\u00a0\u00a0\u00a0*\u00a0\u7ebf\u7a0b\u6c60\u7ebf\u7a0b\u6570\u7684\u6700\u5927\u503c\uff1a\u8fd9\u91cc\u6307\u5b9a\u4e3a\u4e86\u6838\u5fc3\u7ebf\u7a0b\u6570\u7684\u5927\u5c0f\u00a0\u00a0\u00a0\u00a0\u00a0*\/\u00a0\u00a0\u00a0\u00a0private\u00a0static\u00a0final\u00a0int\u00a0MAXIMUM_POOL_SIZE\u00a0=\u00a0CORE_POOL_SIZE;\u00a0\u00a0\u00a0\u00a0\/**\u00a0\u00a0\u00a0\u00a0*\u00a0\u7ebf\u7a0b\u6c60\u4e2d\u7a7a\u95f2\u7ebf\u7a0b\u7b49\u5f85\u5de5\u4f5c\u7684\u8d85\u65f6\u65f6\u95f4\uff0c\u5f53\u7ebf\u7a0b\u6c60\u4e2d\u00a0\u00a0\u00a0\u00a0*\u00a0\u7ebf\u7a0b\u6570\u91cf\u5927\u4e8ecorePoolSize\uff08\u6838\u5fc3\u7ebf\u7a0b\u6570\u91cf\uff09\u6216\u00a0\u00a0\u00a0\u00a0*\u00a0\u8bbe\u7f6e\u4e86allowCoreThreadTimeOut\uff08\u662f\u5426\u5141\u8bb8\u7a7a\u95f2\u6838\u5fc3\u7ebf\u7a0b\u8d85\u65f6\uff09\u65f6\uff0c\u00a0\u00a0\u00a0\u00a0*\u00a0\u7ebf\u7a0b\u4f1a\u6839\u636ekeepAliveTime\u7684\u503c\u8fdb\u884c\u6d3b\u6027\u68c0\u67e5\uff0c\u4e00\u65e6\u8d85\u65f6\u4fbf\u9500\u6bc1\u7ebf\u7a0b\u3002\u00a0\u00a0\u00a0\u00a0*\u00a0\u5426\u5219\uff0c\u7ebf\u7a0b\u4f1a\u6c38\u8fdc\u7b49\u5f85\u65b0\u7684\u5de5\u4f5c\u3002\u00a0\u00a0\u00a0\u00a0*\/\u00a0\u00a0\u00a0\u00a0private\u00a0static\u00a0final\u00a0int\u00a0KEEP_ALIVE_SECONDS\u00a0=\u00a05;\u00a0\u00a0\u00a0\u00a0\/**\u00a0\u00a0\u00a0\u00a0*\u00a0\u521b\u5efa\u4e00\u4e2a\u57fa\u4e8e\u94fe\u8868\u8282\u70b9\u7684\u963b\u585e\u961f\u5217\u00a0\u00a0\u00a0\u00a0*\/\u00a0\u00a0\u00a0\u00a0private\u00a0static\u00a0final\u00a0BlockingQueue\u00a0S_POOL_WORK_QUEUE\u00a0=\u00a0new\u00a0LinkedBlockingQueue&lt;&gt;();\u00a0\u00a0\u00a0\u00a0\/**\u00a0\u00a0\u00a0\u00a0\u00a0*\u00a0\u7528\u4e8e\u521b\u5efa\u7ebf\u7a0b\u7684\u7ebf\u7a0b\u5de5\u5382\u00a0\u00a0\u00a0\u00a0\u00a0*\/\u00a0\u00a0\u00a0\u00a0private\u00a0static\u00a0final\u00a0DefaultThreadFactory\u00a0S_THREAD_FACTORY\u00a0=\u00a0new\u00a0DefaultThreadFactory();\u00a0\u00a0\u00a0\u00a0\/**\u00a0\u00a0\u00a0\u00a0\u00a0*\u00a0\u7ebf\u7a0b\u6c60\u6267\u884c\u8017\u65f6\u4efb\u52a1\u65f6\u53d1\u751f\u5f02\u5e38\u6240\u9700\u8981\u505a\u7684\u62d2\u7edd\u6267\u884c\u5904\u7406\u00a0\u00a0\u00a0\u00a0\u00a0*\u00a0\u6ce8\u610f\uff1a\u4e00\u822c\u4e0d\u4f1a\u6267\u884c\u5230\u8fd9\u91cc\u00a0\u00a0\u00a0\u00a0\u00a0*\/\u00a0\u00a0\u00a0\u00a0private\u00a0static\u00a0final\u00a0RejectedExecutionHandler\u00a0S_HANDLER\u00a0=\u00a0new\u00a0RejectedExecutionHandler()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0@Override\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0void\u00a0rejectedExecution(Runnable\u00a0r,\u00a0ThreadPoolExecutor\u00a0executor)\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Executors.newCachedThreadPool().execute(r);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0};\u00a0\u00a0\u00a0\u00a0\/**\u00a0\u00a0\u00a0\u00a0\u00a0*\u00a0\u83b7\u53d6CPU\u7ebf\u7a0b\u6c60\u00a0\u00a0\u00a0\u00a0\u00a0*\u00a0\u00a0\u00a0\u00a0\u00a0*\u00a0@return\u00a0CPU\u7ebf\u7a0b\u6c60\u00a0\u00a0\u00a0\u00a0\u00a0*\/\u00a0\u00a0\u00a0\u00a0public\u00a0static\u00a0ThreadPoolExecutor\u00a0getCPUExecutor()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0sCPUThreadPoolExecutor;\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\/**\u00a0\u00a0\u00a0\u00a0\u00a0*\u00a0\u83b7\u53d6IO\u7ebf\u7a0b\u6c60\u00a0\u00a0\u00a0\u00a0\u00a0*\u00a0\u00a0\u00a0\u00a0\u00a0*\u00a0@return\u00a0IO\u7ebf\u7a0b\u6c60\u00a0\u00a0\u00a0\u00a0\u00a0*\/\u00a0\u00a0\u00a0\u00a0public\u00a0static\u00a0ExecutorService\u00a0getIOExecutor()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0sIOThreadPoolExecutor;\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\/**\u00a0\u00a0\u00a0\u00a0\u00a0*\u00a0\u5b9e\u73b0\u4e00\u4e2a\u9ed8\u8ba4\u7684\u7ebf\u7a0b\u5de5\u5382\u00a0\u00a0\u00a0\u00a0\u00a0*\/\u00a0\u00a0\u00a0\u00a0private\u00a0static\u00a0class\u00a0DefaultThreadFactory\u00a0implements\u00a0ThreadFactory\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0private\u00a0static\u00a0final\u00a0AtomicInteger\u00a0POOL_NUMBER\u00a0=\u00a0new\u00a0AtomicInteger(1);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0private\u00a0final\u00a0ThreadGroup\u00a0group;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0private\u00a0final\u00a0AtomicInteger\u00a0threadNumber\u00a0=\u00a0new\u00a0AtomicInteger(1);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0private\u00a0final\u00a0String\u00a0namePrefix;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0DefaultThreadFactory()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0SecurityManager\u00a0s\u00a0=\u00a0System.getSecurityManager();\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0group\u00a0=\u00a0(s\u00a0!=\u00a0null)\u00a0?\u00a0s.getThreadGroup()\u00a0:\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Thread.currentThread().getThreadGroup();\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0namePrefix\u00a0=\u00a0&quot;TaskDispatcherPool-&quot;\u00a0+\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0POOL_NUMBER.getAndIncrement()\u00a0+\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&quot;-Thread-&quot;;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0@Override\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0Thread\u00a0newThread(Runnable\u00a0r)\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/\u00a0\u6bcf\u4e00\u4e2a\u65b0\u521b\u5efa\u7684\u7ebf\u7a0b\u90fd\u4f1a\u5206\u914d\u5230\u7ebf\u7a0b\u7ec4group\u5f53\u4e2d\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Thread\u00a0t\u00a0=\u00a0new\u00a0Thread(group,\u00a0r,\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0namePrefix\u00a0+\u00a0threadNumber.getAndIncrement(),\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a00);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if\u00a0(t.isDaemon())\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/\u00a0\u975e\u5b88\u62a4\u7ebf\u7a0b\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0t.setDaemon(false);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/\u00a0\u8bbe\u7f6e\u7ebf\u7a0b\u4f18\u5148\u7ea7\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if\u00a0(t.getPriority()\u00a0!=\u00a0Thread.NORM_PRIORITY)\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0t.setPriority(Thread.NORM_PRIORITY);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0t;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0static\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0sCPUThreadPoolExecutor\u00a0=\u00a0new\u00a0ThreadPoolExecutor(\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0CORE_POOL_SIZE,\u00a0MAXIMUM_POOL_SIZE,\u00a0KEEP_ALIVE_SECONDS,\u00a0TimeUnit.SECONDS,\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0S_POOL_WORK_QUEUE,\u00a0S_THREAD_FACTORY,\u00a0S_HANDLER);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/\u00a0\u8bbe\u7f6e\u662f\u5426\u5141\u8bb8\u7a7a\u95f2\u6838\u5fc3\u7ebf\u7a0b\u8d85\u65f6\u65f6\uff0c\u7ebf\u7a0b\u4f1a\u6839\u636ekeepAliveTime\u7684\u503c\u8fdb\u884c\u6d3b\u6027\u68c0\u67e5\uff0c\u4e00\u65e6\u8d85\u65f6\u4fbf\u9500\u6bc1\u7ebf\u7a0b\u3002\u5426\u5219\uff0c\u7ebf\u7a0b\u4f1a\u6c38\u8fdc\u7b49\u5f85\u65b0\u7684\u5de5\u4f5c\u3002\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0sCPUThreadPoolExecutor.allowCoreThreadTimeOut(true);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/\u00a0IO\u5bc6\u96c6\u578b\u4efb\u52a1\u7ebf\u7a0b\u6c60\u76f4\u63a5\u91c7\u7528CachedThreadPool\u6765\u5b9e\u73b0\uff0c\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/\u00a0\u5b83\u6700\u591a\u53ef\u4ee5\u5206\u914dInteger.MAX_VALUE\u4e2a\u975e\u6838\u5fc3\u7ebf\u7a0b\u7528\u6765\u6267\u884c\u4efb\u52a1\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0sIOThreadPoolExecutor\u00a0=\u00a0Executors.newCachedThreadPool(S_THREAD_FACTORY);\u00a0\u00a0\u00a0\u00a0}}<\/code><\/pre>\n<p>\u7ebf\u7a0b\u5e93\u4f7f\u7528\u65b9\u5f0f\uff1a<\/p>\n<pre><code>\/\/\u00a0\u5982\u679c\u5f53\u524d\u6267\u884c\u7684\u4efb\u52a1\u662fCPU\u5bc6\u96c6\u578b\u4efb\u52a1\uff0c\u5219\u4ece\u57fa\u7840\u7ebf\u7a0b\u6c60\u7ec4\u4ef6\/\/\u00a0DispatcherExecutor\u4e2d\u83b7\u53d6\u5230\u7528\u4e8e\u6267\u884c\u00a0CPU\u00a0\u5bc6\u96c6\u578b\u4efb\u52a1\u7684\u7ebf\u7a0b\u6c60DispatcherExecutor.getCPUExecutor().execute(YourRunable());\/\/\u00a0\u5982\u679c\u5f53\u524d\u6267\u884c\u7684\u4efb\u52a1\u662fIO\u5bc6\u96c6\u578b\u4efb\u52a1\uff0c\u5219\u4ece\u57fa\u7840\u7ebf\u7a0b\u6c60\u7ec4\u4ef6\/\/\u00a0DispatcherExecutor\u4e2d\u83b7\u53d6\u5230\u7528\u4e8e\u6267\u884c\u00a0IO\u00a0\u5bc6\u96c6\u578b\u4efb\u52a1\u7684\u7ebf\u7a0b\u6c60DispatcherExecutor.getIOExecutor().execute(YourRunable());<\/code><\/pre>\n<h5><strong>3.\u5f02\u6b65\u542f\u52a8\u5668<\/strong>\uff1a<\/h5>\n<p>\u542f\u52a8\u5668\u6838\u5fc3\u601d\u60f3\uff1a<strong>\u5145\u5206\u5229\u7528CPU\u591a\u6838\uff0c\u81ea\u52a8\u68b3\u7406\u4efb\u52a1\u987a\u5e8f<\/strong>\u3002<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/newstrong.xyz\/wp-content\/uploads\/2024\/08\/frc-c21e975171604d3dbaad7331fe76030e.jpeg\" alt=\"\" \/><\/p>\n<p>\u542f\u52a8\u5668\\<br \/>\n\u542f\u52a8\u5668\u6d41\u7a0b\uff1a\\<br \/>\n\u542f\u52a8\u5668\u7684\u4e3b\u9898\u6d41\u7a0b\u4e3b\u8981\u5206\u4e3a\u4e3b\u7ebf\u7a0b\u4e0e\u5e76\u53d1\u4e24\u4e2a\u533a\u57df\u5757\u3002\u800c head task\u4e0etail task \u4ec5\u4ec5\u662f\u7528\u4e8e\u5904\u7406\u542f\u52a8\u524d\/\u542f\u52a8\u540e\u7684\u4e00\u4e9b\u901a\u7528\u4efb\u52a1\uff0c\u4f8b\u5982\u6211\u4eec\u53ef\u4ee5\u5728head task\u4e2d\u505a\u4e00\u4e9b\u83b7\u53d6\u901a\u7528\u4fe1\u606f\u7684\u64cd\u4f5c\uff0c\u5728tail task\u53ef\u4ee5\u505a\u4e00\u4e9blog\u8f93\u51fa\u3001\u6570\u636e\u4e0a\u62a5\u7b49\u64cd\u4f5c\u3002<\/p>\n<p>1\u3001\u4efb\u52a1Task\u5316\uff0c\u6bcf\u4e2a\u4efb\u52a1\u90fd\u5bf9\u5e94\u4e00\u4e2aTask\u3002<\/p>\n<p>2\u3001\u6839\u636e\u4efb\u52a1\u5c5e\u6027\u4ee5\u53ca\u524d\u540e\u4f9d\u8d56\u5173\u7cfb\u5c06\u4efb\u52a1\u6392\u5217\u4e3a\u4e00\u4e2a\u6709\u5411\u65e0\u73af\u56fe\u3002<\/p>\n<p>3\u3001\u6839\u636e\u6709\u5411\u65e0\u73af\u56fe\u7684\u4efb\u52a1\u5148\u540e\u987a\u5e8f\u4f9d\u6b21\u6267\u884cTask\u3002<\/p>\n<p>\u5f02\u6b65\u521d\u59cb\u5316\u57fa\u7840\u4ee3\u7801\uff1a<\/p>\n<pre><code>\/\/\u00a01.\u521d\u59cb\u5316\u4efb\u52a1\u5206\u53d1\u5668TaskDispatcher.init(this)\/\/\u00a02.\u6dfb\u52a0\u5e76\u5f00\u59cb\u6267\u884c\u521d\u59cb\u5316\u4efb\u52a1val\u00a0dispatcher\u00a0=\u00a0TaskDispatcher.createInstance()\/\/3.\u7ed9\u542f\u52a8\u5668\u6dfb\u52a0\u4efb\u52a1dispatcher\u00a0\u00a0\u00a0\u00a0.addTask(InitAMapTask())\u00a0\u00a0\u00a0\u00a0\/\/\u00a0\u9ad8\u5fb7\u00a0SDK\u00a0\u521d\u59cb\u5316\u4efb\u52a1\u00a0\u00a0\u00a0\u00a0.addTask(InitStethoTask())\u00a0\u00a0\/\/\u00a0Stetho\u00a0\u521d\u59cb\u5316\u4efb\u52a1\u00a0\u00a0\u00a0\u00a0.addTask(InitWeexTask())\u00a0\u00a0\u00a0\u00a0\/\/\u00a0weex\u00a0\u521d\u59cb\u5316\u4efb\u52a1\u00a0\u00a0\u00a0\u00a0.addTask(InitBuglyTask())\u00a0\u00a0\u00a0\/\/\u00a0Bugly\u00a0\u521d\u59cb\u5316\u4efb\u52a1\u00a0\u00a0\u00a0\u00a0.addTask(InitFrescoTask())\u00a0\u00a0\/\/\u00a0Frescode\u00a0\u521d\u59cb\u5316\u4efb\u52a1\u00a0\u00a0\u00a0\u00a0.addTask(InitJPushTask())\u00a0\u00a0\u00a0\/\/\u00a0\u6781\u5149\u63a8\u9001\u00a0SDK\u00a0\u521d\u59cb\u5316\u4efb\u52a1\u00a0\u00a0\u00a0\u00a0.addTask(InitUmengTask())\u00a0\u00a0\u00a0\/\/\u00a0\u53cb\u76df\u00a0SDK\u00a0\u521d\u59cb\u5316\u4efb\u52a1\u00a0\u00a0\u00a0\u00a0.addTask(GetDeviceIdTask())\u00a0\/\/\u00a0\u83b7\u53d6\u8bbe\u5907\u00a0ID\u00a0\u521d\u59cb\u5316\u4efb\u52a1\u00a0\u00a0\u00a0\u00a0.addTask(DelayInitTaskA())\u00a0\u00a0\/\/\u00a0\u5ef6\u8fdf\u521d\u59cb\u5316\u4efb\u52a1\u00a0A\u00a0\u00a0\u00a0\u00a0.addTask(DelayInitTaskB())\u00a0\u00a0\/\/\u00a0\u5ef6\u8fdf\u521d\u59cb\u5316\u4efb\u52a1\u00a0B\u00a0\u00a0\u00a0\u00a0.start()\/\/4.\u7b49\u5f85\u9700\u8981wait\u7684\u4efb\u52a1\u6267\u884c\u5b8c\u6bd5\u624d\u7ee7\u7eed\u5411\u4e0b\u6267\u884cdispatcher.await()<\/code><\/pre>\n<p>\u6ce8\u91ca1\uff1ainit<\/p>\n<pre><code>fun\u00a0init(context:\u00a0Context)\u00a0{\u00a0\u00a0\u00a0\u00a0Companion.context\u00a0=\u00a0context\u00a0\u00a0\u00a0\u00a0sHasInit\u00a0=\u00a0true\u00a0\u00a0\u00a0\u00a0isMainProcess\u00a0=\u00a0Utils.isMainProcess(Companion.context)}<\/code><\/pre>\n<p>\u53ea\u662f\u521d\u59cb\u5316\u4e86\u4e00\u4e9b\u542f\u52a8\u5668\u9700\u8981\u7684\u57fa\u7840\u53c2\u6570\u3002<\/p>\n<p>\u6ce8\u91ca2\uff1acreateInstance<\/p>\n<pre><code>\/**\u00a0*\u00a0\u6ce8\u610f\uff1a\u6bcf\u6b21\u83b7\u53d6\u7684\u90fd\u662f\u65b0\u5bf9\u8c61\u00a0*\/@JvmStaticfun\u00a0createInstance():\u00a0TaskDispatcher\u00a0{\u00a0\u00a0\u00a0\u00a0if\u00a0(!sHasInit)\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0throw\u00a0RuntimeException(&quot;must\u00a0call\u00a0TaskDispatcher.init\u00a0first&quot;)\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0return\u00a0TaskDispatcher()}<\/code><\/pre>\n<p>\u6ce8\u91ca3\uff1a\u8fd9\u91cc\u7ed9\u542f\u52a8\u5668\u6dfb\u52a0\u4e86\u4e00\u7cfb\u5217\u7684Task\uff0c\u5305\u62ec\u5f02\u6b65\u548c\u975e\u5f02\u6b65\u7684\u3002<\/p>\n<p>\u8fd9\u91cc\u6211\u4eec\u6765\u5206\u6790\u4e0bTask\u5982\u4f55\u5f02\u6b65\u5e76\u53d1\u6267\u884c\u7684\uff1f\u5206\u6790\u9700\u6c42\uff1a<\/p>\n<p>&#8211;\u00a0\u53ef\u4ee5\u533a\u5206\u4e3b\u7ebf\u7a0b\u4efb\u52a1\u548c\u5f02\u6b65\u4efb\u52a1\u3002<\/p>\n<p>&#8211;\u00a0\u9700\u8981\u6709\u524d\u540e\u4f9d\u8d56\u5173\u7cfb\uff0c\u5c31\u662f\u8bf4\u4e00\u4e2a\u4efb\u52a1\u53ef\u80fd\u9700\u8981\u7b49\u5f85\u5176\u4ed6\u4efb\u52a1\u6267\u884c\u5b8c\u540e\u624d\u4f1a\u6267\u884c\u5f53\u524d\u4efb\u52a1\u3002<\/p>\n<p><strong>1.\u5b9a\u4e49\u4e00\u4e2a\u4efb\u52a1\u63a5\u53e3<\/strong><\/p>\n<pre><code>\/\/\u00a0\u4efb\u52a1\u63a5\u53e3interface\u00a0ITask\u00a0{\u00a0\u00a0\u00a0\u00a0\/**\u00a0\u00a0\u00a0\u00a0\u00a0*\u00a0Task\u4e3b\u4efb\u52a1\u6267\u884c\u5b8c\u6210\u4e4b\u540e\u9700\u8981\u6267\u884c\u7684\u4efb\u52a1\u00a0\u00a0\u00a0\u00a0\u00a0*\/\u00a0\u00a0\u00a0\u00a0fun\u00a0getTailRunnable():\u00a0Runnable?\u00a0\u00a0\u00a0\u00a0fun\u00a0setTaskCallBack(callBack:\u00a0TaskCallBack)\u00a0\u00a0\u00a0\u00a0fun\u00a0needCall():\u00a0Boolean\u00a0\u00a0\u00a0\u00a0\/**\u00a0\u00a0\u00a0\u00a0\u00a0*\u00a0\u4f18\u5148\u7ea7\u7684\u8303\u56f4\uff0c\u53ef\u6839\u636eTask\u91cd\u8981\u7a0b\u5ea6\u53ca\u5de5\u4f5c\u91cf\u6307\u5b9a\uff1b\u4e4b\u540e\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u51b3\u5b9a\u662f\u5426\u6709\u5fc5\u8981\u653e\u66f4\u5927\u00a0\u00a0\u00a0\u00a0\u00a0*\/\u00a0\u00a0\u00a0\u00a0@IntRange(\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0from\u00a0=\u00a0Process.THREAD_PRIORITY_FOREGROUND.toLong(),\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0to\u00a0=\u00a0Process.THREAD_PRIORITY_LOWEST.toLong()\u00a0\u00a0\u00a0\u00a0)\u00a0\u00a0\u00a0\u00a0fun\u00a0priority():\u00a0Int\u00a0\u00a0\u00a0\u00a0fun\u00a0run()\u00a0\u00a0\u00a0\u00a0\/**\u00a0\u00a0\u00a0\u00a0\u00a0*\u00a0Task\u6267\u884c\u6240\u5728\u7684\u7ebf\u7a0b\u6c60\uff0c\u53ef\u6307\u5b9a\uff0c\u4e00\u822c\u9ed8\u8ba4\u00a0\u00a0\u00a0\u00a0\u00a0*\/\u00a0\u00a0\u00a0\u00a0fun\u00a0runOn():\u00a0Executor?\u00a0\u00a0\u00a0\u00a0\/**\u00a0\u00a0\u00a0\u00a0\u00a0*\u00a0\u4f9d\u8d56\u5173\u7cfb\u00a0\u00a0\u00a0\u00a0\u00a0*\/\u00a0\u00a0\u00a0\u00a0fun\u00a0dependsOn():\u00a0Listout\u00a0Task?&gt;?&gt;?\u00a0\u00a0\u00a0\u00a0\/**\u00a0\u00a0\u00a0\u00a0\u00a0*\u00a0\u5f02\u6b65\u7ebf\u7a0b\u6267\u884c\u7684Task\u662f\u5426\u9700\u8981\u5728\u88ab\u8c03\u7528await\u7684\u65f6\u5019\u7b49\u5f85\uff0c\u9ed8\u8ba4\u4e0d\u9700\u8981\u00a0\u00a0\u00a0\u00a0\u00a0*\/\u00a0\u00a0\u00a0\u00a0fun\u00a0needWait():\u00a0Boolean\u00a0\u00a0\u00a0\u00a0\/**\u00a0\u00a0\u00a0\u00a0\u00a0*\u00a0\u662f\u5426\u5728\u4e3b\u7ebf\u7a0b\u6267\u884c\u00a0\u00a0\u00a0\u00a0\u00a0*\/\u00a0\u00a0\u00a0\u00a0fun\u00a0runOnMainThread():\u00a0Boolean\u00a0\u00a0\u00a0\u00a0\/**\u00a0\u00a0\u00a0\u00a0\u00a0*\u00a0\u53ea\u662f\u5728\u4e3b\u8fdb\u7a0b\u6267\u884c\u00a0\u00a0\u00a0\u00a0\u00a0*\/\u00a0\u00a0\u00a0\u00a0fun\u00a0onlyInMainProcess():\u00a0Boolean}<\/code><\/pre>\n<p>\u8bf4\u660e\uff1a<\/p>\n<ul>\n<li>\n<p>\u63a5\u53e3\u4f7f\u7528runOnMainThread\u8868\u793a\u662f\u5426\u662f\u4e3b\u7ebf\u7a0b\u4efb\u52a1\u8fd8\u662f\u5f02\u6b65\u7ebf\u7a0b\u4efb\u52a1\u3002<\/p>\n<\/li>\n<li>\n<p>\u63a5\u53e3\u4f7f\u7528dependsOn\u6765\u589e\u52a0\u4f9d\u8d56\u5173\u7cfb\u3002<\/p>\n<\/li>\n<\/ul>\n<pre><code>\/**\u00a0*\u00a0\u9700\u8981\u5728getDeviceId\u4e4b\u540e\u6267\u884c\u00a0*\/class\u00a0InitJPushTask\u00a0:\u00a0Task()\u00a0{\u00a0\u00a0\u00a0\u00a0override\u00a0fun\u00a0dependsOn():\u00a0Listout\u00a0Task?&gt;&gt;?\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0val\u00a0task:\u00a0MutableListout\u00a0Task?&gt;&gt;\u00a0=\u00a0ArrayList()\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0task.add(GetDeviceIdTask::class.java)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0task\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0override\u00a0fun\u00a0run()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0JPushInterface.init(mContext)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0val\u00a0app\u00a0=\u00a0mContext\u00a0as\u00a0MyApplication\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0JPushInterface.setAlias(mContext,\u00a00,\u00a0app.deviceId)\u00a0\u00a0\u00a0\u00a0}}<\/code><\/pre>\n<p>\u5728\u542f\u52a8\u4e00\u4e2a\u4efb\u52a1\u4e4b\u524d\u4f1a\u4f18\u5148\u5224\u65ad\u4f9d\u8d56\u4efb\u52a1\u662f\u5426\u6267\u884c\u5b8c\u6bd5\uff0c\u5982\u679c\u6ca1\u6709\u6267\u884c\u4f1a\u7b49\u5f85\u4f9d\u8d56\u4efb\u52a1\u6267\u884c\u5b8c\u6bd5\uff0c\u7136\u540e\u518d\u53bb\u6267\u884c\u5f53\u524dTask\uff0c\u6267\u884c\u5b8c\u5f53\u524dTask\u540e\u4f1a\u6e05\u9664\u548c\u5f53\u524dTask\u76f8\u5173\u7684\u72b6\u6001\u3002<\/p>\n<pre><code>\u00a0override\u00a0fun\u00a0run()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/\u7ed9\u5e94\u7528\u6253\u70b9\u76d1\u63a7\u6bcf\u4e2a\u4efb\u52a1\u7684\u8017\u65f6\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Trace.beginSection(mTask.javaClass.simpleName)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/\u8bbe\u7f6e\u7ebf\u7a0b\u4f18\u5148\u7ea7\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Process.setThreadPriority(mTask.priority())\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/\u7b49\u5f85\u4f9d\u8d56\u4efb\u52a1\u6267\u884c\u5b8c\u6bd5\uff0c\u5185\u90e8\u4f1a\u4e00\u76f4await\u4f4f\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0mTask.waitToSatisfy()\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/\u00a0\u6267\u884cTask\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0mTask.isRunning\u00a0=\u00a0true\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0mTask.run()\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/\u00a0\u6267\u884cTask\u7684\u5c3e\u90e8\u4efb\u52a1\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0val\u00a0tailRunnable\u00a0=\u00a0mTask.getTailRunnable()\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0tailRunnable?.run()\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/\u6267\u884c\u5b8c\u6bd5\u540e\u6807\u8bb0\u8be5\u4efb\u52a1\u5df2\u5b8c\u6210\u5e76\u5c06\u4f9d\u8d56\u4ed6\u7684\u4efb\u52a1\u7684countdown -1\uff1b\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if\u00a0(!mTask.needCall()\u00a0||\u00a0!mTask.runOnMainThread())\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0printTaskLog(startTime,\u00a0waitTime)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0TaskStat.markTaskDone()\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0mTask.isFinished\u00a0=\u00a0true\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0mTaskDispatcher.satisfyChildren(mTask)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0mTaskDispatcher.markTaskDone(mTask)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0DispatcherLog.i(mTask.javaClass.simpleName\u00a0+\u00a0&quot;\u00a0finish&quot;)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Trace.endSection()\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u770bsatisfyChildren\u548cmarkTaskDone\u00a0\u00a0\u00a0\u00a0\u00a0\/**\u00a0\u00a0\u00a0\u00a0\u00a0*\u00a0\u901a\u77e5Children\u4e00\u4e2a\u524d\u7f6e\u4efb\u52a1\u5df2\u5b8c\u6210\u00a0\u00a0\u00a0\u00a0\u00a0*\/\u00a0\u00a0\u00a0\u00a0fun\u00a0satisfyChildren(launchTask:\u00a0Task)\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0val\u00a0arrayList\u00a0=\u00a0mDependedHashMap[launchTask.javaClass]\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if\u00a0(arrayList\u00a0!=\u00a0null\u00a0&amp;&amp;\u00a0arrayList.size\u00a0&gt;\u00a00)\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0for\u00a0(task\u00a0in\u00a0arrayList)\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0task.satisfy()\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\/\/\u6539\u53d8\u5f53\u524dtask\u5728\u67b6\u6784\u4e2d\u7ed9\u7684\u72b6\u6001\uff1a\u5982\u6dfb\u52a0\u5230\u6267\u884c\u5b8c\u6210\u961f\u5217\uff0c\u5220\u9664\u5728mNeedWaitTasks\u7684task\uff0c\u5c06\u7b49\u5f85mCountDownLatch\uff0cmNeedWaitCount\u8ba1\u6570\u5668\u503c\u51cf1.\u00a0\u00a0\u00a0\u00a0fun\u00a0markTaskDone(task:\u00a0Task)\u00a0{\u00a0\u00a0\u00a0\u00a0if\u00a0(needWait(task))\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0mFinishedTasks.add(task.javaClass)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0mNeedWaitTasks.remove(task)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0mCountDownLatch!!.countDown()\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0mNeedWaitCount.getAndDecrement()\u00a0\u00a0\u00a0\u00a0}\u00a0}<\/code><\/pre>\n<p>\u8fd9\u91cc\u6709\u4e2aneedWait\u662f\u5e94\u7528\u5728\u67d0\u4e2a\u65f6\u523b\u9700\u8981\u7b49\u5f85\u4f4f\u4efb\u52a1\u6267\u884c\u5b8c\u6210\u624d\u80fd\u7ee7\u7eed\u5411\u4e0b\uff0c\u8fd9\u4e2a\u65f6\u523b\u5c31\u662f\u4e00\u5f00\u59cb\u7684\u6ce8\u91ca4\u5904dispatcher.await<\/p>\n<pre><code>@UiThreadfun\u00a0await()\u00a0{\u00a0\u00a0\u00a0\u00a0try\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if\u00a0(mNeedWaitCount.get()\u00a0&gt;\u00a00)\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if\u00a0(mCountDownLatch\u00a0==\u00a0null)\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0throw\u00a0RuntimeException(&quot;You\u00a0have\u00a0to\u00a0call\u00a0start()\u00a0before\u00a0call\u00a0await()&quot;)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/\u00a0\u7b49\u5f85\u00a010\u00a0\u79d2\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0mCountDownLatch?.await(WAIT_TIME.toLong(),\u00a0TimeUnit.MILLISECONDS)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0}\u00a0catch\u00a0(e:\u00a0InterruptedException)\u00a0{\u00a0\u00a0\u00a0\u00a0}}\u00a0\u00a0\u00a0\u00a0\u00a0\/**\u00a0*\u00a0\u9700\u8981\u7b49\u5f85\u7684\u4efb\u52a1\u6570\u00a0*\/private\u00a0val\u00a0mNeedWaitCount\u00a0=\u00a0AtomicInteger()\u00a0\/\/<\/code><\/pre>\n<p><strong>\u5176\u5b9e\u5c31\u662f\u6839\u636emNeedWaitCount\u7684count\u503c\u6765\u5224\u65ad\u662f\u5426\u9700\u8981\u7b49\u5f85\uff0c\u5927\u4e8e0\u8bf4\u660e\u8fd8\u6709\u4efb\u52a1\u9700\u8981\u7b49\u5f85\u3002\u8c03\u7528mCountDownLatch\u7684await\u8fdb\u884c\u7b49\u5f85\u3002mCountDownLatch\u7684\u521d\u59cb\u503c\u5c31\u662fmNeedWaitCount\u7684\u4e2a\u6570\uff0c \u6bcf\u6b21\u6267\u884c\u5b8c\u4e00\u4e2a\u4efb\u52a1\u540e\u4f1a\u6267\u884cmarkTaskDone\u65b9\u6cd5\uff0c\u5e76\u5c06mNeedWaitCount\u548cmCountDownLatch\u503c\u90fd\u51cf1\uff0c \u8fd9\u6837\u5728\u89c4\u5b9a\u8d85\u65f6\u65f6\u95f4\u5185\u4efb\u52a1\u6267\u884c\u5b8c\u6bd5\u5c31\u53ef\u4ee5\u7ee7\u7eed\u5411\u540e\u6267\u884c\uff0c\u6ca1\u6709\u6267\u884c\u5b8c\u6bd5\u8d85\u65f6\u540e\u4e5f\u4f1a\u7ee7\u7eed\u5411\u540e\u6267\u884c\u3002<\/strong><\/p>\n<blockquote>\n<p>\u53ef\u4ee5\u770b\u5230\u5f02\u6b65\u542f\u52a8\u5668\u7684\u6838\u5fc3\u662f\u4e00\u5b9a\u8981\u4e86\u89e3\u4efb\u52a1\u7684\u4f9d\u8d56\u5173\u7cfb\uff0c\u5bf9\u4efb\u52a1\u5c5e\u6027\u7684\u9700\u8981\u6709\u4e00\u5b9a\u6df1\u523b\u4e86\u89e3\u3002<\/p>\n<\/blockquote>\n<p>\u8fd9\u91cc\u8fd8\u6709\u4e2a\u6ce8\u610f\u70b9\uff1a<strong>\u5c31\u662f\u4efb\u52a1\u7684\u62d3\u6251\u6392\u5e8f\u751f\u6210\u4e00\u4e2a\u6709\u5411\u65e0\u73af\u56fe<\/strong>\u3002<\/p>\n<p>\u5728Dispatcher\u7684start\u65b9\u6cd5\u4e2d\uff1a<\/p>\n<pre><code>mAllTasks\u00a0=\u00a0TaskSortUtil.getSortResult(mAllTasks,\u00a0mClsAllTasks)<\/code><\/pre>\n<p>\u5728getSortResult\u4e2d:<\/p>\n<pre><code>\u00a0\/**\u00a0*\u00a0\u4efb\u52a1\u7684\u6709\u5411\u65e0\u73af\u56fe\u7684\u62d3\u6251\u6392\u5e8f\u00a0*\/@Synchronizedfun\u00a0getSortResult(\u00a0\u00a0\u00a0\u00a0originTasks:\u00a0List&lt;Task&gt;,\u00a0\u00a0\u00a0\u00a0clsLaunchTasks:\u00a0List&lt;Class&lt;out\u00a0Task&gt;&gt;):\u00a0MutableList\u00a0{\u00a0\u00a0\u00a0\u00a0val\u00a0makeTime\u00a0=\u00a0System.currentTimeMillis()\u00a0\u00a0\u00a0\u00a0val\u00a0dependSet:\u00a0MutableSet&lt;Int&gt;\u00a0=\u00a0ArraySet()\u00a0\u00a0\u00a0\u00a0val\u00a0graph\u00a0=\u00a0Graph(originTasks.size)\u00a0\u00a0\u00a0\u00a0for\u00a0(i\u00a0in\u00a0originTasks.indices)\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0val\u00a0task\u00a0=\u00a0originTasks[i]\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0val\u00a0list\u00a0=\u00a0task.dependsOn()\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if\u00a0(task.isSend\u00a0||\u00a0list\u00a0==\u00a0null\u00a0||\u00a0list.isEmpty())\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0continue\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0for\u00a0(cls\u00a0in\u00a0task.dependsOn()!!)\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0val\u00a0indexOfDepend\u00a0=\u00a0getIndexOfTask(originTasks,\u00a0clsLaunchTasks,\u00a0cls)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0check(indexOfDepend\u00a0&gt;=\u00a00)\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0task.javaClass.simpleName\u00a0+\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&quot;\u00a0depends\u00a0on\u00a0&quot;\u00a0+\u00a0cls.simpleName\u00a0+\u00a0&quot;\u00a0can\u00a0not\u00a0be\u00a0found\u00a0in\u00a0task\u00a0list\u00a0&quot;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0dependSet.add(indexOfDepend)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0graph.addEdge(indexOfDepend,\u00a0i)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0val\u00a0indexList:\u00a0List&lt;Int&gt;\u00a0=\u00a0graph.topologicalSort()\u00a0\u00a0\u00a0\u00a0val\u00a0newTasksAll\u00a0=\u00a0getResultTasks(originTasks,\u00a0dependSet,\u00a0indexList)\u00a0\u00a0\u00a0\u00a0DispatcherLog.i(&quot;task\u00a0analyse\u00a0cost\u00a0makeTime\u00a0&quot;\u00a0+\u00a0(System.currentTimeMillis()\u00a0-\u00a0makeTime))\u00a0\u00a0\u00a0\u00a0printAllTaskName(newTasksAll)\u00a0\u00a0\u00a0\u00a0return\u00a0newTasksAll}<\/code><\/pre>\n<h5><strong>4.\u5ef6\u8fdf\u521d\u59cb\u5316\uff1a<\/strong><\/h5>\n<p>\u6838\u5fc3\u601d\u60f3\uff1a\u5229\u7528IdleHandler\u7279\u6027\uff0c\u5728CPU\u7a7a\u95f2\u65f6\u6267\u884c\uff0c\u5bf9\u5ef6\u8fdf\u4efb\u52a1\u8fdb\u884c\u5206\u6279\u521d\u59cb\u5316\u3002\u5ef6\u8fdf\u542f\u52a8\u5668\u53ef\u4ee5\u52a0\u8f7d\u4e00\u4e9b\u975e\u5373\u65f6\u6027\u7684\u4efb\u52a1\uff0c\u5982\u754c\u9762\u4e0a\u7684\u67d0\u4e9bUI\u66f4\u65b0\u3002\u4ee3\u7801\u8bb2\u89e3\uff1a<\/p>\n<pre><code>\/**\u00a0*\u00a0\u5ef6\u8fdf\u521d\u59cb\u5316\u5206\u53d1\u5668\u00a0*\/public\u00a0class\u00a0DelayInitDispatcher\u00a0{\u00a0\u00a0\u00a0\u00a0private\u00a0Queue\u00a0mDelayTasks\u00a0=\u00a0new\u00a0LinkedList&lt;&gt;();\u00a0\u00a0\u00a0\u00a0private\u00a0MessageQueue.IdleHandler\u00a0mIdleHandler\u00a0=\u00a0new\u00a0\u00a0\u00a0\u00a0\u00a0MessageQueue.IdleHandler()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0@Override\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0boolean\u00a0queueIdle()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/\u00a0\u5206\u6279\u6267\u884c\u7684\u597d\u5904\u5728\u4e8e\u6bcf\u4e00\u4e2atask\u5360\u7528\u4e3b\u7ebf\u7a0b\u7684\u65f6\u95f4\u76f8\u5bf9\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/\u00a0\u6765\u8bf4\u5f88\u77ed\u6682\uff0c\u5e76\u4e14\u6b64\u65f6CPU\u662f\u7a7a\u95f2\u7684\uff0c\u8fd9\u4e9b\u80fd\u66f4\u6709\u6548\u5730\u907f\u514dUI\u5361\u987f\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if(mDelayTasks.size()&gt;0){\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Task\u00a0task\u00a0=\u00a0mDelayTasks.poll();\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0new\u00a0DispatchRunnable(task).run();\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0!mDelayTasks.isEmpty();\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0};\u00a0\u00a0\u00a0\u00a0public\u00a0DelayInitDispatcher\u00a0addTask(Task\u00a0task){\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0mDelayTasks.add(task);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0this;\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0public\u00a0void\u00a0start(){\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Looper.myQueue().addIdleHandler(mIdleHandler);\u00a0\u00a0\u00a0\u00a0}}<\/code><\/pre>\n<p>\u4ee3\u7801\u5f88\u7b80\u5355\uff0c\u5c31\u662f\u5c06\u9700\u8981\u542f\u52a8\u7684\u5ef6\u8fdf\u4efb\u52a1\u4f7f\u7528addTask\u7684\u65b9\u5f0f\u52a0\u5165\u5373\u53ef\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u8fbe\u5230\u5728Cpu\u7a7a\u95f2\u65f6\u6bb5\u53bb\u6267\u884c\u8fd9\u4e9b\u4efb\u52a1\u3002\u4f7f\u7528\u7684\u8bdd\u53ef\u4ee5\u5728SplashActivity\u7684onWindowFocusChanged\u8fdb\u884c\u4efb\u52a1\u6dfb\u52a0\u3002<\/p>\n<pre><code>@Overridepublic\u00a0void\u00a0onWindowFocusChanged(boolean\u00a0hasFocus)\u00a0{\u00a0\u00a0\u00a0\u00a0super.onWindowFocusChanged(hasFocus);\u00a0\u00a0\u00a0\u00a0GlobalHandler.getInstance().getHandler().post((Runnable)\u00a0()\u00a0-&gt;\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if\u00a0(hasFocus)\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0DelayInitDispatcher\u00a0delayInitDispatcher\u00a0=\u00a0new\u00a0DelayInitDispatcher();\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0delayInitDispatcher.addTask(new\u00a0InitOtherTask())\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.start();\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0});}<\/code><\/pre>\n<h4><strong>4.1.4\uff1aActivity\u9636\u6bb5\u4f18\u5316<\/strong><\/h4>\n<p>\u8fd9\u91cc\u4e3e\u4e24\u4e2a\u4f18\u5316\u4f8b\u5b50\u3002<\/p>\n<h5><strong>1.Splash \u4e0e Main \u5408\u5e76<\/strong><\/h5>\n<p>SplashActivity\u4e3b\u8981\u627f\u8f7d\u7740\u5e7f\u544a\u3001\u6d3b\u52a8\u7b49\u5f00\u5c4f\u76f8\u5173\u903b\u8f91\u3002\u4e00\u822c\u542f\u52a8\u6d41\u7a0b\u4e3a\uff1a<\/p>\n<ul>\n<li>\n<p>\u8fdb\u5165 SplashActivity\uff0c\u5728 SplashActivity \u4e2d\u5224\u65ad\u5f53\u524d\u662f\u5426\u6709\u5f85\u5c55\u793a\u7684\u5f00\u5c4f\uff1b<\/p>\n<\/li>\n<li>\n<p>\u5982\u679c\u6709\u5f85\u5c55\u793a\u7684\u5f00\u5c4f\u5219\u5c55\u793a\u5f00\u5c4f\uff0c\u7b49\u5f85\u5f00\u5c4f\u5c55\u793a\u7ed3\u675f\u518d\u8df3\u8f6c\u5230 MainActivity\uff0c\u5982\u679c\u6ca1\u6709\u5f00\u5c4f\u5219\u76f4\u63a5\u8df3\u8f6c\u5230 MainActivity\u3002<\/p>\n<\/li>\n<\/ul>\n<p><img decoding=\"async\" src=\"https:\/\/newstrong.xyz\/wp-content\/uploads\/2024\/08\/frc-cdad170cd3bdbf8819b9050b1fa332fe.jpeg\" alt=\"\" \/><\/p>\n<p>\u4e24\u4e2aActivity\u5408\u5e76\u56fe\\<br \/>\n\u5408\u5e76\u540e\u6536\u76ca\uff1a<\/p>\n<ul>\n<li>\n<p>\u5408\u5e76\u524d\u9700\u8981\u7ecf\u8fc7\u4e24\u6b21Activity\u7684\u542f\u52a8\uff0c\u5408\u5e76\u540e\u53ea\u6709\u4e00\u6b21\uff0c\u51cf\u5c11\u4e00\u6b21\u542f\u52a8\u65f6\u95f4\u3002<\/p>\n<\/li>\n<li>\n<p>\u5229\u7528\u8bfb\u53d6\u5f00\u5c4f\u4fe1\u606f\u7684\u65f6\u95f4\uff0c\u505a\u4e00\u4e9b\u4e0eActivity\u5f3a\u5173\u8054\u7684\u5e76\u53d1\u4efb\u52a1\uff0c\u6bd4\u5982\u5f02\u6b65View\u9884\u52a0\u8f7d\u7b49\u3002<\/p>\n<\/li>\n<\/ul>\n<p>\u6211\u4eec\u6765\u770b\u6296\u97f3app\u662f\u8fdb\u884c\u5408\u5e76\u7684,\u6211\u4eec\u5728\u5408\u5e76\u8fc7\u7a0b\u4e2d\u4e5f\u53ef\u4ee5\u6309\u8fd9\u4e2a\u601d\u8def\u6765\u5206\u6790\u3002\u6296\u97f3\u5728\u5408\u5e76\u4e24\u8005\u7684\u8fc7\u7a0b\u4e2d\uff0c\u6709\u4e24\u4e2a\u95ee\u9898\uff1a<\/p>\n<ul>\n<li>\n<p>\u5408\u5e76\u540e\u5982\u4f55\u89e3\u51b3\u5916\u90e8\u901a\u8fc7 Activity \u540d\u79f0\u8df3\u8f6c\u7684\u95ee\u9898\uff1b<\/p>\n<\/li>\n<li>\n<p>\u5982\u4f55\u89e3\u51b3 LaunchMode \u4e0e\u591a\u5b9e\u4f8b\u7684\u95ee\u9898\u3002<\/p>\n<\/li>\n<\/ul>\n<p>\u7b2c 1 \u4e2a\u95ee\u9898\u6bd4\u8f83\u5bb9\u6613\u89e3\u51b3\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7 <strong>activity-alias+targetActivity \u5c06 SplashActivity \u6307\u5411 MainActivity \u89e3\u51b3<\/strong>\u3002<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/newstrong.xyz\/wp-content\/uploads\/2024\/08\/frc-33938313ae6cda5305d260a0011933b2.jpeg\" alt=\"\" \/><\/p>\n<p>Activityalia\\<br \/>\n\u63a5\u4e0b\u6765\u6211\u4eec\u6765\u770b\u4e00\u4e0b\u7b2c\u4e8c\u4e2a\u95ee\u9898\u3002<\/p>\n<p><strong>launchMode \u95ee\u9898\uff1a<\/strong><\/p>\n<p>\u5728 Splash \u4e0e Main \u5408\u5e76\u4e4b\u524d\uff0cSplashActivity \u4e0e MainActivity \u7684 LaunchMode \u5206\u522b\u662f standard \u548c sinngletask\u3002\u8fd9\u79cd\u60c5\u51b5\u4e0b\u6211\u4eec\u80fd\u591f\u786e\u4fdd MainActivity \u53ea\u6709\u4e00\u4e2a \u5b9e\u4f8b\uff0c\u5e76\u4e14\u5728\u6211\u4eec\u4ece\u5e94\u7528 home \u51fa\u53bb\u518d\u6b21\u8fdb\u5165\u65f6\uff0c\u80fd\u591f\u91cd\u65b0\u56de\u5230\u4e4b\u524d\u7684\u9875\u9762\u3002<\/p>\n<p>\u5c06 SplashActivity \u4e0e MainActivity \u5408\u5e76\u4ee5\u540e\uff0c\u6211\u4eec\u7684 launcher Activity \u53d8\u6210\u4e86 MainActivity\uff0c<strong>\u5982\u679c\u7ee7\u7eed\u4f7f\u7528 singletask \u8fd9\u4e2a launchMode\uff0c\u5f53\u6211\u4eec\u4ece\u4e8c\u7ea7\u9875\u9762 home \u51fa\u53bb\u518d\u6b21\u70b9\u51fb icon \u8fdb\u5165\u65f6\uff0c\u6211\u4eec\u5c06\u65e0\u6cd5\u56de\u5230\u4e8c\u7ea7\u9875\u9762\uff0c\u800c\u4f1a\u56de\u5230 Main \u9875\u9762<\/strong>\uff0c\u56e0\u6b64\u5408\u5e76\u540e MainActivity \u7684 launch mode \u5c06\u4e0d\u518d\u80fd\u591f\u4f7f\u7528 singletask\u3002\u7ecf\u8fc7\u8c03\u7814\uff0c\u6211\u4eec\u6700\u7ec8\u9009\u62e9\u4e86\u4f7f\u7528 singletop \u4f5c\u4e3a\u6211\u4eec\u7684 launchMode\u3002<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/newstrong.xyz\/wp-content\/uploads\/2024\/08\/frc-8bbaca34c78aa44207cf9ba0f9940856.jpeg\" alt=\"\" \/><\/p>\n<p>\u5408\u5e76\u65b9\u6cd5\\<br \/>\n\u591a\u5b9e\u4f8b\u95ee\u9898\uff1a<\/p>\n<ul>\n<li><strong>\u5185\u90e8\u542f\u52a8\u591a\u5b9e\u4f8b\u7684\u95ee\u9898<\/strong><\/li>\n<\/ul>\n<p>\u4f7f\u7528 singletop \u867d\u7136\u80fd\u591f\u89e3\u51b3 home \u51fa\u53bb\u518d\u6b21\u8fdb\u5165\u65e0\u6cd5\u56de\u5230\u4e4b\u524d\u9875\u9762\u7684\u95ee\u9898\uff0c\u4f46\u662f\u968f\u4e4b\u800c\u6765\u7684\u662f MainActivity \u591a\u5b9e\u4f8b\u7684\u95ee\u9898\u3002\u5728\u6296\u97f3\u7684\u903b\u8f91\u4e2d\u5b58\u5728\u4e00\u4e9b\u4e0e MainActivity \u751f\u547d\u5468\u671f\u5f3a\u5173\u8054\u7684\u903b\u8f91\uff0c\u5982\u679c MainActivity \u5b58\u5728\u591a\u4e2a\u5b9e\u4f8b\uff0c\u8fd9\u90e8\u5206\u903b\u8f91\u5c06\u4f1a\u53d7\u5230\u5f71\u54cd\uff0c\u540c\u65f6\u591a\u4e2a MainActivity \u7684\u5b9e\u73b0\uff0c\u4e5f\u4f1a\u5bfc\u81f4\u6211\u4eec\u4e0d\u5fc5\u8981\u7684\u8d44\u6e90\u5f00\u9500\uff0c\u4e0e\u9884\u671f\u662f\u4e0d\u7b26\u7684\uff0c\u56e0\u6b64\u6211\u4eec\u5e0c\u671b\u80fd\u591f\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u3002<\/p>\n<p>\u9488\u5bf9\u8fd9\u4e2a\u95ee\u9898\u6211\u4eec\u7684\u89e3\u51b3\u65b9\u6848\u662f\uff0c<strong>\u5bf9\u4e8e\u5e94\u7528\u5185\u6240\u6709\u542f\u52a8 MainActivity \u7684 Intent \u589e\u52a0 FLAG_ACTIVITY_NEW_TASK \u4e0e FLAG_ACTIVITY_CLEAR_TOP \u7684 flag\uff0c\u4ee5\u5b9e\u73b0\u7c7b\u4f3c\u4e8e singletask \u7684 clear top \u7684\u7279\u6027\u3002<\/strong><\/p>\n<p>\u7ecf\u8fc7\u5206\u6790\uff0c\u6211\u4eec\u53d1\u73b0\u5728\u8fd9\u90e8\u5206\u7cfb\u7edf\u4e0a\uff0c\u5373\u4f7f\u901a\u8fc7 activity-alias+targetActivity \u65b9\u5f0f\u5c06 SplashActivity \u6307\u5411\u4e86 MainActivity\uff0c\u4f46\u662f\u5728 AMS \u4fa7\u5b83\u4ecd\u7136\u8ba4\u4e3a\u542f\u52a8\u7684\u662fSplashActivity\uff0c\u540e\u7eed\u518d\u542f\u52a8 MainActivity \u65f6\u4f1a\u8ba4\u4e3a\u4e4b\u524d\u662f\u4e0d\u5b58\u5728 MainActivity \u7684\uff0c\u56e0\u6b64\u4f1a\u518d\u6b21\u542f\u52a8\u4e00\u4e2a MainActivity\u3002<\/p>\n<p><strong>\u9488\u5bf9\u8fd9\u4e2a\u95ee\u9898\u6211\u4eec\u7684\u89e3\u51b3\u65b9\u6848\u662f\uff0c\u4fee\u6539\u542f\u52a8 MainActivity Intent \u7684 Component \u4fe1\u606f\uff0c\u5c06\u5176\u6539\u4ece MainActivity \u6539\u4e3a SplashActivity\uff0c\u8fd9\u6837\u6211\u4eec\u5c31\u5f7b\u5e95\u89e3\u51b3\u4e86\u5185\u90e8\u542f\u52a8 MainActivity \u5bfc\u81f4\u7684\u591a\u5b9e\u4f8b\u7684\u95ee\u9898\u3002<\/strong><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/newstrong.xyz\/wp-content\/uploads\/2024\/08\/frc-7b31b9b04e8a5603dc70a098b49e6573.jpeg\" alt=\"\" \/><\/p>\n<p>\u5408\u5e76\u540e\\<br \/>\n\u4e3a\u4e86\u5c3d\u53ef\u80fd\u5c11\u7684\u4fb5\u5165\u4e1a\u52a1\uff0c\u540c\u65f6\u4e5f\u9632\u6b62\u540e\u7eed\u8fed\u4ee3\u518d\u51fa\u73b0\u5185\u90e8\u542f\u52a8\u5bfc\u81f4 MainActivity \u95ee\u9898\uff0c\u6211\u4eec\u5bf9 Context startActivity \u7684\u8c03\u7528\u8fdb\u884c\u4e86\u63d2\u6869\u3002\u5bf9\u4e8e\u542f\u52a8 MainActivity \u7684\u8c03\u7528\uff0c\u5728\u5b8c\u6210\u5411 Intent \u4e2d\u6dfb\u52a0 flag \u548c\u66ff\u6362 Component \u4fe1\u606f\u540e\u518d\u8c03\u7528\u539f\u6709\u5b9e\u73b0\u3002\u4e4b\u6240\u4ee5\u9009\u62e9\u63d2\u6869\u65b9\u5f0f\u5b9e\u73b0\uff0c\u662f\u56e0\u4e3a\u6296\u97f3\u7684\u4ee3\u7801\u7ed3\u6784\u6bd4\u8f83\u590d\u6742\uff0c\u5b58\u5728\u591a\u4e2a\u57fa\u7c7b Activity\uff0c\u4e14\u90e8\u5206\u57fa\u7c7b Activity \u65e0\u6cd5\u76f4\u63a5\u4fee\u6539\u5230\u4ee3\u7801\u3002\u5bf9\u4e8e\u6ca1\u6709\u8fd9\u65b9\u9762\u95ee\u9898\u7684\u4e1a\u52a1\uff0c\u53ef\u4ee5\u901a\u8fc7\u91cd\u5199\u57fa\u7c7b Activtity \u53ca Application \u7684 startActivity \u65b9\u6cd5\u7684\u65b9\u5f0f\u5b9e\u73b0\u3002<\/p>\n<ul>\n<li><strong>\u5916\u90e8\u542f\u52a8\u591a\u5b9e\u4f8b\u95ee\u9898<\/strong><\/li>\n<\/ul>\n<p>\u4ee5\u4e0a\u89e3\u51b3 MainActivity \u591a\u5b9e\u4f8b\u7684\u65b9\u6848\uff0c\u662f\u5efa\u7acb\u5728\u542f\u52a8 Activity \u4e4b\u524d\u53bb\u4fee\u6539\u5f85\u542f\u52a8 Activity \u7684 Intent \u7684\u65b9\u5f0f\u5b9e\u73b0\u7684\uff0c<strong>\u8fd9\u79cd\u65b9\u5f0f\u5bf9\u4e8e\u5e94\u7528\u5916\u90e8\u542f\u52a8 MainActivity \u5bfc\u81f4\u7684 MainActivity \u591a\u5b9e\u4f8b\u7684\u95ee\u9898\u663e\u7136\u662f\u65e0\u6cd5\u89e3\u51b3\u7684<\/strong>\u3002\u90a3\u4e48\u9488\u5bf9\u5916\u90e8\u542f\u52a8 MainActivity \u5bfc\u81f4\u7684\u591a\u5b9e\u4f8b\u95ee\u9898\uff0c\u6211\u4eec\u662f\u5426\u6709\u5176\u4ed6\u89e3\u51b3\u65b9\u6848\u5462\uff1f<\/p>\n<p>\u6211\u4eec\u5148\u56de\u5230\u89e3\u51b3 MainActivity \u591a\u5b9e\u4f8b\u95ee\u9898\u7684\u51fa\u53d1\u70b9\u3002\u4e4b\u6240\u4ee5\u8981<strong>\u907f\u514d MainActivity \u591a\u5b9e\u4f8b<\/strong>\uff0c\u662f\u4e3a\u4e86\u9632\u6b62\u540c\u65f6\u51fa\u73b0\u591a\u4e2a MainActivity \u5bf9\u8c61\uff0c\u51fa\u73b0\u4e0d\u7b26\u5408\u9884\u671f\u7684 MainActivity \u751f\u547d\u5468\u671f\u7684\u6267\u884c\u3002\u56e0\u6b64\u53ea\u8981\u786e\u4fdd\u4e0d\u4f1a\u540c\u65f6\u51fa\u73b0\u591a\u4e2a MainActivity \u5bf9\u8c61\uff0c\u4e00\u6837\u53ef\u4ee5\u89e3\u51b3 MainActivity \u591a\u5b9e\u4f8b\u95ee\u9898\u3002<\/p>\n<p>\u8981<strong>\u907f\u514d\u540c\u65f6\u51fa\u73b0\u591a\u4e2a MainActivity \u5bf9\u8c61\uff0c\u6211\u4eec\u9996\u5148\u9700\u8981\u77e5\u9053\u5f53\u524d\u662f\u5426\u5df2\u7ecf\u5b58\u5728 MainActivity \u5bf9\u8c61\uff0c\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u7684\u601d\u8def\u6bd4\u8f83\u7b80\u5355\uff0c\u6211\u4eec\u53ef\u4ee5\u53bb\u76d1\u542c Activity \u7684\u751f\u547d\u5468\u671f<\/strong>\uff0c\u5728 MainActivity \u7684 onCreate \u548c onDestroy \u4e2d\u5206\u522b\u53bb\u589e\u52a0\u51cf\u5c11 MainActivity \u7684\u5b9e\u4f8b\u6570\u3002\u5982\u679c MainActivity \u5b9e\u4f8b\u6570\u4e3a 0 \u5219\u8ba4\u4e3a\u5f53\u524d\u4e0d\u5b58\u5728 MainActivity \u5bf9\u8c61\u3002<\/p>\n<p>\u89e3\u51b3\u4e86 MainActivity \u5bf9\u8c61\u6570\u7edf\u8ba1\u7684\u95ee\u9898\uff0c\u63a5\u4e0b\u6765\u6211\u4eec\u5c31<strong>\u9700\u8981\u8ba9 MainActivity \u540c\u65f6\u5b58\u5728\u7684\u5bf9\u8c61\u6570\u6c38\u8fdc\u4fdd\u6301\u5728 1 \u4e2a\u4ee5\u4e0b<\/strong>\u3002\u8981\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u6211\u4eec\u9700\u8981\u56de\u987e\u4e00\u4e0b Activity \u7684\u542f\u52a8\u6d41\u7a0b\uff0c\u542f\u52a8\u4e00\u4e2a Activity \u9996\u5148\u4f1a\u7ecf\u8fc7 AMS\uff0cAMS \u4f1a\u518d\u8c03\u7528\u5230 Activity \u6240\u5728\u7684\u8fdb\u7a0b\uff0c\u5728 Activity \u6240\u5728\u7684\u8fdb\u7a0b\u4f1a\u7ecf\u8fc7\u4e3b\u7ebf\u7a0b\u7684 Handler post \u5230\u4e3b\u7ebf\u7a0b\uff0c\u7136\u540e\u901a\u8fc7 Instrumentation \u53bb\u521b\u5efa Activity \u5bf9\u8c61\uff0c\u4ee5\u53ca\u6267\u884c\u540e\u7eed\u7684\u751f\u547d\u5468\u671f\u3002\u5bf9\u4e8e\u5916\u90e8\u542f\u52a8 MainActivity \uff0c\u6211\u4eec\u80fd\u591f\u63a7\u5236\u7684\u662f\u4ece AMS \u56de\u5230\u8fdb\u7a0b\u4e4b\u540e\u7684\u90e8\u5206\uff0c\u8fd9\u91cc\u53ef\u4ee5\u9009\u62e9\u4ee5 <strong>Instrumentation \u7684 newActivity \u4f5c\u4e3a\u5165\u53e3<\/strong>\u3002<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/newstrong.xyz\/wp-content\/uploads\/2024\/08\/frc-90fd59a335a0147e1826985819b8fb9e.jpeg\" alt=\"\" \/><\/p>\n<p>\u5408\u5e76\u5916\u90e8\u8c03\u7528\\<br \/>\n\u5177\u4f53\u6765\u8bf4\u6211\u4eec\u7684\u4f18\u5316\u65b9\u6848\u5982\u4e0b\uff1a<\/p>\n<p>1.\u7ee7\u627f Instrumentation \u5b9e\u73b0\u4e00\u4e2a\u81ea\u5b9a\u4e49\u7684 Instrumentaion \u7c7b\uff0c\u4ee5\u4ee3\u7406\u8f6c\u53d1\u65b9\u5f0f\u91cd\u5199\u91cc\u9762\u7684\u6240\u6709\u65b9\u6cd5\uff1b<\/p>\n<p>2.\u53cd\u5c04\u83b7\u53d6 ActivityThread \u4e2d Instrumentaion \u5bf9\u8c61\uff0c\u5e76\u4ee5\u5176\u4e3a\u53c2\u6570\u521b\u5efa\u4e00\u4e2a\u81ea\u5b9a\u4e49\u7684 Instrumentaion \u5bf9\u8c61\uff0c\u901a\u8fc7\u53cd\u5c04\u65b9\u5f0f\u7528\u81ea\u5b9a\u4e49\u7684 Instrumentaion \u5bf9\u8c61\u66ff\u6362 ActivityThread \u539f\u6709\u7684 Instrumentaion\uff1b<\/p>\n<p>3.\u5728\u81ea\u5b9a\u4e49 Instrumentaion \u7c7b\u7684 newActivity \u65b9\u6cd5\u4e2d\uff0c\u8fdb\u884c\u5224\u65ad\u5f53\u524d\u5f85\u521b\u5efa\u7684 Activity \u662f\u5426\u4e3a MainActivity\uff0c\u5982\u679c\u4e0d\u662f MainActivity \u6216\u8005\u5f53\u524d\u4e0d\u5b58\u5728 MainActivity \u5bf9\u8c61\uff0c\u5219\u8c03\u7528\u539f\u6709\u5b9e\u73b0\uff0c\u5426\u5219\u66ff\u6362\u5176 className \u53c2\u6570\u5c06\u5176\u6307\u5411\u4e00\u4e2a\u7a7a\u7684 Activity\uff0c\u4ee5\u521b\u5efa\u4e00\u4e2a\u7a7a\u7684 Activity\uff1b<\/p>\n<p>4.\u5728\u8fd9\u4e2a\u7a7a\u7684 Activity \u7684 onCreate \u4e2d finish \u6389\u81ea\u5df1\uff0c\u540c\u65f6\u901a\u8fc7\u4e00\u4e2a\u6dfb\u52a0\u4e86 FLAG_ACTIVITY_NEW_TASK \u548c FLAG_ACTIVITY_CLEAR_TOP flag \u7684 Intent \u53bb\u542f\u52a8\u4e00\u4e0b SplashActivity\u3002<\/p>\n<blockquote>\n<p>\u9700\u8981\u6ce8\u610f\u7684\u662f\u6211\u4eec\u8fd9\u91cc hook Instrumentaion \u7684\u5b9e\u73b0\u65b9\u6848\uff0c\u5728\u9ad8\u7248\u672c\u7684 Android \u7cfb\u7edf\u4e0a\u6211\u4eec\u4e5f\u53ef\u4ee5\u4ee5 AppComponentFactory instantiateActivity \u7684\u65b9\u5f0f\u66ff\u6362\u3002<\/p>\n<\/blockquote>\n<h5><strong>2.xml2code<\/strong><\/h5>\n<p>\u521b\u5efaView\u6709\u4e24\u79cd\u65b9\u5f0f\uff1a<strong>1.\u624b\u52a8\u8c03\u7528View\u7684\u6784\u9020\u51fd\u6570\u521b\u5efa 2.\u901a\u8fc7xml\u6587\u4ef6\u914d\u7f6e<\/strong>\\<br \/>\n\u8fd9\u91cc\u4f18\u5316\u4e3b\u8981\u8bb2\u7684\u662f\u7b2c\u4e8c\u79cdxml\u6587\u4ef6\u914d\u7f6e\uff0c\u4e00\u822c\u6d41\u7a0b\uff1a<\/p>\n<ul>\n<li>\n<p>\u5c06 xml \u6587\u4ef6\u89e3\u6790\u5230\u5185\u5b58\u4e2d XmlResourceParser \u7684 IO \u8fc7\u7a0b\uff1b<\/p>\n<\/li>\n<li>\n<p>\u6839\u636e XmlResourceParser \u7684 Tag name \u83b7\u53d6 Class \u7684 Java \u53cd\u5c04\u8fc7\u7a0b\uff1b<\/p>\n<\/li>\n<li>\n<p>\u521b\u5efa View \u5b9e\u4f8b\uff0c\u6700\u7ec8\u751f\u6210 View \u6811\u3002<\/p>\n<\/li>\n<\/ul>\n<p><img decoding=\"async\" src=\"https:\/\/newstrong.xyz\/wp-content\/uploads\/2024\/08\/frc-5416e725f19b87663f7164c455382eb9.jpeg\" alt=\"\" \/><\/p>\n<p>x2c\\<br \/>\n\u4f20\u7edf\u4f18\u5316\u65b9\u5f0f\uff1a<\/p>\n<ul>\n<li>\n<p>\u4f18\u5316xml\u5e03\u5c40\u5c42\u7ea7\uff0c\u4f7f\u7528ConstraintLayout\u5e73\u6ed1\u5e03\u5c40\u975e\u5d4c\u5957\u5e03\u5c40\u3002<\/p>\n<\/li>\n<li>\n<p>\u4f7f\u7528ViewStub\u5b9e\u73b0\u6309\u9700\u52a0\u8f7d\u3002<\/p>\n<\/li>\n<\/ul>\n<p>\u8fd9\u91cc\u8fd8\u6709\u4e00\u79cd\u5c31\u662f\u5f02\u6b65\u52a0\u8f7dxml\u5e03\u5c40\u7684\u65b9\u5f0f\uff1a<\/p>\n<p>\u6211\u4eec\u77e5\u9053xml\u5e03\u5c40\u6700\u7ec8\u662f\u5728measure\u9636\u6bb5\u4f1a\u88ab\u4f7f\u7528\u5230\u3002\u90a3\u6211\u4eec\u4ece\u5e94\u7528\u542f\u52a8\u9636\u6bb5\u5f00\u59cb\u5c31\u53ef\u4ee5\u4f7f\u7528\u5f02\u6b65\u52a0\u8f7dxml\u5e03\u5c40\u5230\u5185\u5b58\u4e2d\uff0c\u7136\u540e\u5728measure\u9636\u6bb5\u4ece\u5185\u5b58\u4e2d\u53d6\u51fa\u5185\u5b58\u4e2d\u7684code\u3002<\/p>\n<p>\u7406\u60f3\u5f88\u7f8e\u597d\uff0c\u8fd9\u4e2a\u8fc7\u7a0b\u4e2d\u4f60\u53ef\u80fd\u4f1a\u9047\u5230\u4e0b\u9762\u51e0\u4e2a\u95ee\u9898\uff1a<\/p>\n<p><strong>1.LayoutParams \u7684\u95ee\u9898<\/strong><\/p>\n<p>\u6211\u4eec\u77e5\u9053LayoutParams\u53c2\u6570\u5728inflate\u9636\u6bb5\u4f1a\u6839\u636eroot\u5c5e\u6027\u8fdb\u884c\u8bbe\u7f6e\uff0c\u5982\u679croot\u4e3a\u7a7a\u90a3\u4e48LayoutParams\u5c31\u4f1a\u4e3a\u7a7a\uff0c\u8fd9\u4e2a\u65f6\u5019\u88ab\u6dfb\u52a0\u5230View\u4e2d\u5c31\u4f1a\u4f7f\u7528\u9ed8\u8ba4\u503c\uff0c\u90a3\u4e48\u81ea\u5df1\u8bbe\u7f6e\u7684\u90a3\u4e9bView\u7684\u5c5e\u6027\u5c31\u4f1a\u4e22\u5931\u3002\\<br \/>\n\u8fd9\u663e\u7136\u4e0d\u7b26\u5408\u9884\u671f\u60c5\u51b5\uff0c\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\uff0c\u9700\u8981\u5728\u8fdb\u884c\u9884\u52a0\u8f7d\u65f6\u5019 new \u4e00\u4e2a\u76f8\u5e94\u7c7b\u578b\u7684 root\uff0c\u4ee5\u5b9e\u73b0\u5bf9\u5f85 inflate view \u5c5e\u6027\u7684\u6b63\u786e\u89e3\u6790\u3002<\/p>\n<pre><code>public\u00a0View\u00a0inflate(XmlPullParser\u00a0parser,\u00a0@Nullable\u00a0ViewGroup\u00a0root,\u00a0boolean\u00a0attachToRoot)\u00a0{\u00a0\u00a0\u00a0\u00a0\/\/\u00a0\u7701\u7565\u5176\u4ed6\u903b\u8f91\u00a0\u00a0\u00a0\u00a0if\u00a0(root\u00a0!=\u00a0null)\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/\u00a0Create\u00a0layout\u00a0params\u00a0that\u00a0match\u00a0root,\u00a0if\u00a0supplied\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0params\u00a0=\u00a0root.generateLayoutParams(attrs);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if\u00a0(!attachToRoot)\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/\u00a0Set\u00a0the\u00a0layout\u00a0params\u00a0for\u00a0temp\u00a0if\u00a0we\u00a0are\u00a0not\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/\u00a0attaching.\u00a0(If\u00a0we\u00a0are,\u00a0we\u00a0use\u00a0addView,\u00a0below)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0root.setLayoutParams(params);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0}}public\u00a0void\u00a0addView(View\u00a0child,\u00a0int\u00a0index)\u00a0{\u00a0\u00a0\u00a0\u00a0LayoutParams\u00a0params\u00a0=\u00a0child.getLayoutParams();\u00a0\u00a0\u00a0\u00a0if\u00a0(params\u00a0==\u00a0null)\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0params\u00a0=\u00a0generateDefaultLayoutParams();\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if\u00a0(params\u00a0==\u00a0null)\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0throw\u00a0new\u00a0IllegalArgumentException(&quot;generateDefaultLayoutParams()\u00a0cannot\u00a0return\u00a0null&quot;);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0addView(child,\u00a0index,\u00a0params);}<\/code><\/pre>\n<p><strong>2.inflate \u7ebf\u7a0b\u4f18\u5148\u7ea7\u7684\u95ee\u9898<\/strong><\/p>\n<p>\u540e\u53f0\u89e3\u6790\u7ebf\u7a0b\u53ef\u80fd\u4f1a\u4f18\u5148\u7ea7\u6bd4\u8f83\u4f4e\uff0c\u65e0\u6cd5\u53ca\u65f6\u5b9e\u73b0View\u7684\u89e3\u6790\uff0c\u8fd9\u4e2a\u65f6\u5019\u9700\u8981\u9002\u5f53\u63d0\u9ad8\u89e3\u6790\u7ebf\u7a0b\u7684\u4f18\u5148\u7ea7\u3002<\/p>\n<p><strong>3.Handler\u95ee\u9898<\/strong><\/p>\n<p>\u67d0\u4e9b\u81ea\u5b9a\u4e49View\u5728\u521b\u5efaView\u7684\u65f6\u5019\u4f1a\u521d\u59cb\u5316\u4e00\u4e9bHandler\uff0c\u8fd9\u4e2a\u65f6\u5019\u9700\u8981\u6307\u5b9aHandler\u4e3a\u4e3b\u7ebf\u7a0bLooper\u3002<\/p>\n<p><strong>4.\u52a8\u753b\u95ee\u9898<\/strong><\/p>\n<p>\u52a8\u753b\u5728 start \u65f6\u4f1a\u6821\u9a8c\u662f\u5426\u662f UI \u7ebf\u7a0b\u4e3b\u7ebf\u7a0b\uff0c\u8fd9\u79cd\u60c5\u51b5\u6211\u4eec\u9700\u8981\u53bb\u4fee\u6539\u4e1a\u52a1\u4ee3\u7801\uff0c\u5c06\u76f8\u5173\u903b\u8f91\u79fb\u52a8\u5230\u540e\u7eed\u771f\u6b63\u6dfb\u52a0\u5230 View tree \u65f6\u3002<\/p>\n<p><strong>5.context\u95ee\u9898<\/strong><\/p>\n<p>\u7531\u4e8e\u5728Application\u9636\u6bb5\u8fdb\u884c\u5f02\u6b65xml\u89e3\u6790\u51fa\u7684View\u53ea\u80fd\u62ff\u5230Application\u7684context\uff0c\u5982\u4e00\u4e9bDialog \u663e\u793a\u7b49\u573a\u666f\u5c31\u9700\u8981Activity\u7684context\uff0c\u90a3\u4e48\u9700\u8981\u5728add\u5230view tree\u4e4b\u524d\u5c06context\u66ff\u6362\u4e3aActivity\u7684context\u3002<\/p>\n<p>\u8fd9\u91cc\u518d\u8bb2\u89e3\u4e00\u4e9b\u5168\u5c40\u89d2\u5ea6\u7684\u4f18\u5316\u65b9\u6848\uff1a<\/p>\n<h3><strong>4.2\uff1a\u5168\u5c40\u4f18\u5316<\/strong><\/h3>\n<h4><strong>1.GC\u6291\u5236<\/strong><\/h4>\n<p>\u5927\u5bb6\u90fd\u77e5\u9053GC\u7684\u8fc7\u7a0b\u4f1a\u6709CPU\u4ece\u5e94\u7528\u5c42\u5230\u5185\u6838\u5c42\u7684\u4e00\u4e2a\u8f6c\u53d8\uff0c\u8fd9\u4e2a\u8fc7\u7a0b\uff1a\u963b\u585e Java \u7a0b\u5e8f\u7684\u6267\u884c\uff0c\u5360\u7528 CPU \u8d44\u6e90\uff0c\u7528\u8bbe\u8ba1\u8005\u8bf4\u7684\u8bdd\uff1a\u4e16\u754c\u90fd\u505c\u6b62\u4e86\u3002\u6240\u4ee5\u5728\u542f\u52a8\u9636\u6bb5\u5bf9Gc\u7684\u4f18\u5316\u53ef\u4ee5\u5927\u5927\u6539\u5584\u754c\u9762\u7684\u6d41\u7545\u5ea6\u548c\u542f\u52a8\u901f\u5ea6\u3002\\<br \/>\ngc\u89e6\u53d1\u6761\u4ef6\u4e4b\u4e00\u5c31\u662f\u5185\u5b58\u8fbe\u5230\u4e86\u67d0\u4e2a\u9608\u503c\uff0c\u6240\u4ee5\u6211\u4eec\u7684\u65b9\u6848\u5c31\u662f\u51cf\u5c11\u5185\u5b58\u7684\u7533\u8bf7\u548c\u5360\u7528\uff0c\u6240\u4ee5\u89e3\u51b3gc\u95ee\u9898\u5c31\u9700\u8981\u6539\u9020\u6211\u4eec\u7684\u4ee3\u7801\uff0c\u5c3d\u91cf\u51cf\u5c11\u4ee3\u7801\u7684\u6267\u884c\u91cf\u548c\u5bf9\u8c61\u7684\u521b\u5efa\u7279\u522b\u662f\u4e00\u4e9b\u9ad8\u5185\u5b58\u56fe\u7247\u3002\u8fd8\u53ef\u4ee5\u4f7f\u7528\u7684\u662f\u4f7f\u7528\u4e00\u4e9b\u7279\u6b8a\u624b\u6bb5\u8fbe\u5230\u5bf9\u67d0\u4e9bGc\u7c7b\u578b\u7684\u6291\u5236\u548c\u53ef\u63a7\u3002<\/p>\n<p>\u53c2\u8003\u8fd9\u7bc7\u6587\u7ae0\uff1a\u652f\u4ed8\u5b9d\u5ba2\u6237\u7aef\u67b6\u6784\u89e3\u6790\uff1aAndroid \u5ba2\u6237\u7aef\u542f\u52a8\u901f\u5ea6\u4f18\u5316\u4e4b\u300c\u5783\u573e\u56de\u6536\u300d\u3002<\/p>\n<p><em><a href=\"https:\/\/juejin.cn\/post\/6844903705028853767#heading-3\">https:\/\/juejin.cn\/post\/6844903705028853767#heading-3<\/a><\/em><\/p>\n<p>\u6ce8\u610f\uff1a\u8fd9\u7bc7\u6587\u7ae0\u53ea\u5bf9Dalvik \u505a\u4e86\u8bb2\u89e3\uff0c\u5bf9ART\u5e76\u6ca1\u6709\u8bb2\u89e3\uff0c\u7b14\u8005\u5728\u7f51\u4e0a\u4e5f\u6ca1\u627e\u5230\u7c7b\u4f3c\u6587\u7ae0\uff0c\u5982\u679c\u4f60\u77e5\u9053\uff0c\u6b22\u8fce\u63a8\u8350\u3002<\/p>\n<h4><strong>2.\u7c7b\u91cd\u6392<\/strong><\/h4>\n<p>\u7c7b\u91cd\u6392\u7684\u5b9e\u73b0\u901a\u8fc7 ReDex \u7684 Interdex \u8c03\u6574\u7c7b\u5728 Dex \u4e2d\u7684\u6392\u5217\u987a\u5e8f\u3002Interdex \u4f18\u5316\u4e0d\u9700\u8981\u53bb\u5206\u6790\u7c7b\u5f15\u7528\uff0c\u5b83\u53ea\u9700\u8981\u8c03\u6574 Dex \u4e2d\u7c7b\u7684\u987a\u5e8f\uff0c\u628a\u542f\u52a8\u65f6\u9700\u8981\u52a0\u8f7d\u7684\u7c7b\u6309\u987a\u5e8f\u653e\u5230\u4e3b dex \u91cc\uff0c\u8fd9\u4e2a\u5de5\u4f5c\u6211\u4eec\u5b8c\u5168\u53ef\u4ee5\u5728\u7f16\u8bd1\u8fc7\u7a0b\u4e2d\u5b9e\u73b0\uff0c\u800c\u4e14\u8fd9\u4e2a\u4f18\u5316\u53ef\u4ee5\u63d0\u5347\u542f\u52a8\u901f\u5ea6\uff0c\u4f18\u5316\u6548\u679c\u4ece facebook \u516c\u5e03\u7684\u6570\u636e\u6765\u770b\u4e5f\u6bd4\u8f83\u53ef\u89c2\uff0c\u6027\u4ef7\u6bd4\u9ad8\u3002\u5177\u4f53\u5b9e\u73b0\u53ef\u4ee5\u53c2\u8003 Redex \u521d\u63a2\u4e0e Interdex\uff1aAndorid \u51b7\u542f\u52a8\u4f18\u5316\u3002<\/p>\n<h4><strong>3.\u7c7b\u52a0\u8f7d\u4f18\u5316<\/strong><\/h4>\n<p>\u4e3b\u8981\u662f\u4ece\u52a0\u8f7d\u7c7b\u7684\u590d\u7528\u548c\u6821\u9a8c\u8fc7\u7a0b\u89d2\u5ea6\u53bb\u4f18\u5316\u3002<\/p>\n<h4><strong>4.\u8d44\u6e90\u91cd\u6392<\/strong><\/h4>\n<p>\u5229\u7528 Linux \u7684 IO \u8bfb\u53d6\u7b56\u7565\uff0cPageCache \u548c ReadAhead \u673a\u5236\uff0c\u6309\u7167\u8bfb\u53d6\u987a\u5e8f\u91cd\u65b0\u6392\u5217\uff0c\u51cf\u5c11\u78c1\u76d8 IO \u6b21\u6570 \u3002\u5177\u4f53\u64cd\u4f5c\u53ef\u4ee5\u53c2\u8003\u652f\u4ed8\u5b9d App \u6784\u5efa\u4f18\u5316\u89e3\u6790\uff1a\u901a\u8fc7\u5b89\u88c5\u5305\u91cd\u6392\u5e03\u4f18\u5316 Android \u7aef\u542f\u52a8\u6027\u80fd \u8fd9\u7bc7\u6587\u7ae0\u3002<\/p>\n<p><em><a href=\"https:\/\/juejin.cn\/post\/6844903710020091917\">https:\/\/juejin.cn\/post\/6844903710020091917<\/a><\/em><\/p>\n<h2><strong>5.\u5e94\u7528\u542f\u52a8\u8017\u65f6\u9632\u52a3\u5316\u3002<\/strong><\/h2>\n<p>\u542f\u52a8\u4f18\u5316\u8fd8\u6709\u4e00\u4e2a\u6838\u5fc3\u5c31\u662f\u9632\u52a3\u5316\u8fc7\u7a0b\u3002\u5bf9\u4e8e\u4e00\u4e9b\u5927\u5382\uff1a\u4ece\u4ee3\u7801\u63d0\u4ea4\u9636\u6bb5\u5230\u7ebf\u4e0b\u6d4b\u8bd5\u9636\u6bb5\uff0c\u518d\u5230\u7070\u5ea6\u53d1\u5e03\u9636\u6bb5\uff0c\u518d\u5230\u7ebf\u4e0a\u7248\u672c\u53d1\u5e03\u9636\u6bb5\u90fd\u6709\u4e00\u5957\u9632\u52a3\u5316\u673a\u5236\uff0c\\<br \/>\n\u800c\u5bf9\u4e8e\u4e00\u4e9b\u4e2d\u5c0f\u578b\u9879\u76ee\u5c31\u53ea\u80fd\u5728\u5f00\u53d1\u8fc7\u7a0b\u4e2d\u6ce8\u610f\u54af\uff0c\u4f60\u89c9\u5f97\u5462\uff1f<\/p>\n<p><strong><em>\u53c2\u8003\u8d44\u6599<\/em><\/strong><\/p>\n<p><em>\u6296\u97f3 Android \u6027\u80fd\u4f18\u5316\u7cfb\u5217\uff1a\u542f\u52a8\u4f18\u5316\u5b9e\u8df5<\/em><\/p>\n<p><em><a href=\"https:\/\/juejin.cn\/post\/7080065015197204511#heading-4\">https:\/\/juejin.cn\/post\/7080065015197204511#heading-4<\/a><\/em><\/p>\n<p><em>\u6296\u97f3BoostMultiDex\u4f18\u5316\u5b9e\u8df5\uff1aAndroid\u4f4e\u7248\u672c\u4e0aAPP\u9996\u6b21\u542f\u52a8\u65f6\u95f4\u51cf\u5c1180%\uff08\u4e00\uff09<\/em><\/p>\n<p><em><a href=\"https:\/\/mp.weixin.qq.com\/s\/jINCbTJ5qMaD6NdeGBHEwQ\">https:\/\/mp.weixin.qq.com\/s\/jINCbTJ5qMaD6NdeGBHEwQ<\/a><\/em><\/p>\n<p><em>\u6df1\u5165\u63a2\u7d22Android\u542f\u52a8\u901f\u5ea6\u4f18\u5316\uff08\u4e0a\uff09<\/em><\/p>\n<p><em><a href=\"https:\/\/juejin.cn\/post\/6844904093786308622#heading-133\">https:\/\/juejin.cn\/post\/6844904093786308622#heading-133<\/a><\/em><\/p>\n<p><em>\u8001\u5927\u96be\u7684GC\u539f\u7406\u53ca\u8c03\u4f18\uff0c\u8fd9\u4e0b\u5168\u8bf4\u6e05\u695a\u4e86<\/em><\/p>\n<p><em><a href=\"https:\/\/juejin.cn\/post\/6844903953004494856\">https:\/\/juejin.cn\/post\/6844903953004494856<\/a><\/em><\/p>\n<p><em>\u6296\u97f3 Android \u6027\u80fd\u4f18\u5316\u7cfb\u5217\uff1a\u542f\u52a8\u4f18\u5316\u4e4b\u7406\u8bba\u548c\u5de5\u5177\u7bc7<\/em><\/p>\n<p><em><a href=\"https:\/\/juejin.cn\/post\/7058080006022856735\">https:\/\/juejin.cn\/post\/7058080006022856735<\/a><\/em><\/p>\n<p><em>\u5fc3\u9047 Android \u542f\u52a8\u4f18\u5316\u5b9e\u8df5\uff1a\u5c06\u542f\u52a8\u65f6\u95f4\u964d\u4f4e 50%<\/em><\/p>\n<p><em><a href=\"https:\/\/juejin.cn\/post\/7138596300672958471\">https:\/\/juejin.cn\/post\/7138596300672958471<\/a><\/em><\/p>\n<p><em>Android App \u542f\u52a8\u4f18\u5316\u5168\u8bb0\u5f55<\/em><\/p>\n<p><em><a href=\"https:\/\/juejin.cn\/post\/7109655666683281415\">https:\/\/juejin.cn\/post\/7109655666683281415<\/a><\/em><\/p>\n<p><em>\u6296\u97f3 Android \u6027\u80fd\u4f18\u5316\u7cfb\u5217\uff1a\u65b0\u4e00\u4ee3\u5168\u80fd\u578b\u6027\u80fd\u5206\u6790\u5de5\u5177 Rhea<\/em><\/p>\n<p><em><a href=\"https:\/\/mp.weixin.qq.com\/s\/vkBeZ6hmVn_RaXS5Xv_L2g\">https:\/\/mp.weixin.qq.com\/s\/vkBeZ6hmVn_RaXS5Xv_L2g<\/a><\/em><\/p>\n<hr \/>\n<p>\u6700\u540e\u63a8\u8350\u4e00\u4e0b\u6211\u505a\u7684\u7f51\u7ad9\uff0c\u73a9Android:\u00a0<em>wanandroid.com<\/em>\u00a0\uff0c\u5305\u542b\u8be6\u5c3d\u7684\u77e5\u8bc6\u4f53\u7cfb\u3001\u597d\u7528\u7684\u5de5\u5177\uff0c\u8fd8\u6709\u672c\u516c\u4f17\u53f7\u6587\u7ae0\u5408\u96c6\uff0c\u6b22\u8fce\u4f53\u9a8c\u548c\u6536\u85cf\uff01<\/p>\n<p>\u63a8\u8350\u9605\u8bfb\uff1a<\/p>\n<p><a href=\"http:\/\/mp.weixin.qq.com\/s?__biz=MzAxMTI4MTkwNQ==&amp;mid=2650853586&amp;idx=1&amp;sn=eb2b433a066af1049ca44d02057f7880&amp;chksm=80b7044cb7c08d5ae007d09f4b44e4a1c45b7b6b8b3edeb9a73f5082a3464d4e731c33caddf4&amp;scene=21#wechat_redirect\">Android 15 \u9002\u914d\u4e4b16K Page Size \uff1a\u4e3a\u4ec0\u4e48\u5b83\u4f1a\u662f\u6700\u5751\u7684\u4e00\u4e2a\u9002\u914d\u70b9<\/a><\/p>\n<p><a href=\"http:\/\/mp.weixin.qq.com\/s?__biz=MzAxMTI4MTkwNQ==&amp;mid=2650853567&amp;idx=1&amp;sn=0bf58590a67a21dc2755c5130b20e067&amp;chksm=80b70421b7c08d37187e0ba99faa99152ffd896d018218dcfbbe7622e2386545613877ad2c7c&amp;scene=21#wechat_redirect\">\u5185\u5b58\u5927\u6237Bitmap<\/a><\/p>\n<p><a href=\"http:\/\/mp.weixin.qq.com\/s?__biz=MzAxMTI4MTkwNQ==&amp;mid=2650853564&amp;idx=1&amp;sn=fa59fde833895fc4de8bd54322e2b18f&amp;chksm=80b70422b7c08d34c20583d9d24d7a552b46cab8dc4de0100a487adcb038eac3f34a2a9e2f67&amp;scene=21#wechat_redirect\">\u5982\u4f55\u79d2\u5f00WebView\uff1fAndroid\u6027\u80fd\u4f18\u5316\u5168\u653b\u7565\uff01<\/a><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/newstrong.xyz\/wp-content\/uploads\/2024\/08\/frc-6e5288f80dbacb01aa3a22f83678681b.jpeg\" alt=\"\" \/><\/p>\n<p><strong>\u626b\u4e00\u626b<\/strong>\u00a0\u5173\u6ce8\u6211\u7684\u516c\u4f17\u53f7<\/p>\n<p>\u5982\u679c\u4f60\u60f3\u8981\u8ddf\u5927\u5bb6\u5206\u4eab\u4f60\u7684\u6587\u7ae0\uff0c\u6b22\u8fce\u6295\u7a3f~<\/p>\n<p>\u250f(\uff3e0\uff3e)\u251b\u660e\u5929\u89c1\uff01<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u672c\u6587\u7ae0\u603b\u7ed3\u4e86\u76ee\u524d\u5e02\u9762\u4e0a\u5e38\u89c1\u7684\u4e00\u4e9b\u542f\u52a8\u4f18\u5316\u5e38\u7528\u624b\u6bb5\uff0c\u5f00\u53d1\u548c\u9762\u8bd5\u5fc5\u5907\u54e6\u3002\u9996\u5148\u8981\u505a\u5e94\u7528\u542f\u52a8\u4f18\u5316\uff0c\u4f60\u5f97\u5bf9\u5e94\u7528\u542f\u52a8\u6d41\u7a0b\u6709&#46;&#46;&#46;<\/p>\n","protected":false},"author":1,"featured_media":125,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-139","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/newstrong.top\/index.php\/wp-json\/wp\/v2\/posts\/139","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/newstrong.top\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/newstrong.top\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/newstrong.top\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/newstrong.top\/index.php\/wp-json\/wp\/v2\/comments?post=139"}],"version-history":[{"count":0,"href":"https:\/\/newstrong.top\/index.php\/wp-json\/wp\/v2\/posts\/139\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/newstrong.top\/index.php\/wp-json\/wp\/v2\/media\/125"}],"wp:attachment":[{"href":"https:\/\/newstrong.top\/index.php\/wp-json\/wp\/v2\/media?parent=139"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/newstrong.top\/index.php\/wp-json\/wp\/v2\/categories?post=139"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/newstrong.top\/index.php\/wp-json\/wp\/v2\/tags?post=139"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}