Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
FlutterÔ­ÀíÓëÃÀÍŵÄʵ¼ù
 
  3508  次浏览      28
 2018-8-22
 
±à¼­ÍƼö:
±¾ÎÄÀ´×ÔÓÚcsdn£¬±¾ÎÄÏêϸ½éÉÜÁËÒ»¸öÈ«ÐÂµÄ¿çÆ½Ì¨¡¢¿ªÔ´UI¿ò¼ÜFlutter²¢ÇÒÒÔÃÀÍÅʵÀý¸¨Öú½²½â¡£

FlutterÊÇGoogle¿ª·¢µÄÒ»Ì×È«ÐÂµÄ¿çÆ½Ì¨¡¢¿ªÔ´UI¿ò¼Ü£¬Ö§³ÖiOS¡¢Androidϵͳ¿ª·¢£¬²¢ÇÒÊÇδÀ´Ð²Ù×÷ϵͳFuchsiaµÄĬÈÏ¿ª·¢Ì×¼þ¡£×Ô´Ó2017Äê5Ô·¢²¼µÚÒ»¸ö°æ±¾ÒÔÀ´£¬Ä¿Ç°FlutterÒѾ­·¢²¼Á˽ü60¸ö°æ±¾£¬²¢ÇÒÔÚ2018Äê5Ô·¢²¼Á˵ÚÒ»¸ö¡°Ready for Production Apps¡±µÄBeta 3°æ±¾£¬6ÔÂ20ÈÕ·¢²¼Á˵ÚÒ»¸ö¡°Release Preview¡±°æ±¾¡£

³õʶFlutter

FlutterµÄÄ¿±êÊÇʹͬһÌ×´úÂëͬʱÔËÐÐÔÚAndroidºÍiOSϵͳÉÏ£¬²¢ÇÒÓµÓÐæÇÃÀÔ­ÉúÓ¦ÓõÄÐÔÄÜ£¬FlutterÉõÖÁÌṩÁËÁ½Ì׿ؼþÀ´ÊÊÅäAndroidºÍiOS£¨¹ö¶¯Ð§¹û¡¢×ÖÌåºÍ¿Ø¼þͼ±êµÈµÈ£©ÎªÁËÈÃAppÔÚϸ½Ú´¦¿´ÆðÀ´¸üÏñÔ­ÉúÓ¦Óá£

ÔÚFlutterµ®Éú֮ǰ£¬ÒѾ­ÓÐÐí¶à¿çƽ̨UI¿ò¼ÜµÄ·½°¸£¬±ÈÈç»ùÓÚWebViewµÄCordova¡¢AppCanµÈ£¬»¹ÓÐʹÓÃHTML+JavaScriptäÖȾ³ÉÔ­Éú¿Ø¼þµÄReact Native¡¢WeexµÈ¡£

»ùÓÚWebViewµÄ¿ò¼ÜÓŵãºÜÃ÷ÏÔ£¬ËüÃǼ¸ºõ¿ÉÒÔÍêÈ«¼Ì³ÐÏÖ´úWeb¿ª·¢µÄËùÓгɹû£¨·á¸»µÃ¶àµÄ¿Ø¼þ¿â¡¢Âú×ã¸÷ÖÖÐèÇóµÄÒ³Ãæ¿ò¼Ü¡¢ÍêÈ«µÄ¶¯Ì¬»¯¡¢×Ô¶¯»¯²âÊÔ¹¤¾ßµÈµÈ£©£¬µ±È»Ò²°üÀ¨Web¿ª·¢ÈËÔ±£¬²»ÐèҪ̫¶àµÄѧϰºÍÇ¨ÒÆ³É±¾¾Í¿ÉÒÔ¿ª·¢Ò»¸öApp¡£Í¬Ê±WebView¿ò¼ÜÒ²ÓÐÒ»¸öÖÂÃü£¨ÔÚ¶ÔÌåÑé&ÐÔÄÜÓнϸßÒªÇóµÄÇé¿öÏ£©µÄȱµã£¬ÄǾÍÊÇWebViewµÄäÖȾЧÂʺÍJavaScriptÖ´ÐÐÐÔÄÜÌ«²î¡£ÔÙ¼ÓÉÏAndroid¸÷¸öϵͳ°æ±¾ºÍÉ豸³§É̵͍֯£¬ºÜÄѱ£Ö¤ËùÔÚËùÓÐÉ豸É϶¼ÄÜÌṩһÖµÄÌåÑé¡£

ΪÁ˽â¾öWebViewÐÔÄܲîµÄÎÊÌ⣬ÒÔReact NativeΪ´ú±íµÄÒ»Àà¿ò¼Ü½«×îÖÕäÖȾ¹¤×÷½»»¹¸øÁËϵͳ£¬ËäȻͬÑùʹÓÃÀàHTML+JSµÄUI¹¹½¨Âß¼­£¬µ«ÊÇ×îÖÕ»áÉú³É¶ÔÓ¦µÄ×Ô¶¨ÒåÔ­Éú¿Ø¼þ£¬ÒÔ³ä·ÖÀûÓÃÔ­Éú¿Ø¼þÏà¶ÔÓÚWebViewµÄ½Ï¸ßµÄ»æÖÆÐ§ÂÊ¡£Óë´ËͬʱÕâÖÖ²ßÂÔÒ²½«¿ò¼Ü±¾ÉíºÍApp¿ª·¢Õß°óÔÚÁËϵͳµÄ¿Ø¼þϵͳÉÏ£¬²»½ö¿ò¼Ü±¾ÉíÐèÒª´¦Àí´óÁ¿Æ½Ì¨Ïà¹ØµÄÂß¼­£¬Ëæ×Åϵͳ°æ±¾±ä»¯ºÍAPIµÄ±ä»¯£¬¿ª·¢Õß¿ÉÄÜÒ²ÐèÒª´¦Àí²»Í¬Æ½Ì¨µÄ²îÒ죬ÉõÖÁÓÐÐ©ÌØÐÔÖ»ÄÜÔÚ²¿·Öƽ̨ÉÏʵÏÖ£¬ÕâÑù¿ò¼ÜµÄ¿çÆ½Ì¨ÌØÐԾͻá´ó´òÕÛ¿Û¡£

FlutterÔò¿ª±ÙÁËÒ»ÖÖȫеÄ˼·£¬´ÓÍ·µ½Î²ÖØÐ´Ò»Ì×¿çÆ½Ì¨µÄUI¿ò¼Ü£¬°üÀ¨UI¿Ø¼þ¡¢äÖȾÂß¼­ÉõÖÁ¿ª·¢ÓïÑÔ¡£äÖȾÒýÇæÒÀ¿¿¿çƽ̨µÄSkiaͼÐοâÀ´ÊµÏÖ£¬ÒÀÀµÏµÍ³µÄÖ»ÓÐͼÐλæÖÆÏà¹ØµÄ½Ó¿Ú£¬¿ÉÒÔÔÚ×î´ó³Ì¶ÈÉϱ£Ö¤²»Í¬Æ½Ì¨¡¢²»Í¬É豸µÄÌåÑéÒ»ÖÂÐÔ£¬Âß¼­´¦ÀíʹÓÃÖ§³ÖAOTµÄDartÓïÑÔ£¬Ö´ÐÐЧÂÊÒ²±ÈJavaScript¸ßµÃ¶à¡£

Flutterͬʱ֧³ÖWindows¡¢LinuxºÍmacOS²Ù×÷ϵͳ×÷Ϊ¿ª·¢»·¾³£¬²¢ÇÒÔÚAndroid StudioºÍVS CodeÁ½¸öIDEÉ϶¼ÌṩÁËÈ«¹¦ÄܵÄÖ§³Ö¡£FlutterËùʹÓõÄDartÓïÑÔͬʱ֧³ÖAOTºÍJITÔËÐз½Ê½£¬JITģʽÏ»¹ÓÐÒ»¸ö±¸ÊÜ»¶Ó­µÄ¿ª·¢ÀûÆ÷¡°ÈÈˢС±£¨Hot Reload£©£¬¼´ÔÚAndroid StudioÖб༭Dart´úÂëºó£¬Ö»ÐèÒªµã»÷±£´æ»òÕß¡°Hot Reload¡±°´Å¥£¬¾Í¿ÉÒÔÁ¢¼´¸üе½ÕýÔÚÔËÐеÄÉ豸ÉÏ£¬²»ÐèÒªÖØÐ±àÒëApp£¬ÉõÖÁ²»ÐèÒªÖØÆôApp£¬Á¢¼´¾Í¿ÉÒÔ¿´µ½¸üкóµÄÑùʽ¡£

ÔÚFlutterÖУ¬ËùÓй¦Äܶ¼¿ÉÒÔͨ¹ý×éºÏ¶à¸öWidgetÀ´ÊµÏÖ£¬°üÀ¨¶ÔÆë·½Ê½¡¢°´ÐÐÅÅÁС¢°´ÁÐÅÅÁС¢Íø¸ñÅÅÁÐÉõÖÁʼþ´¦ÀíµÈµÈ¡£Flutter¿Ø¼þÖ÷Òª·ÖΪÁ½´óÀ࣬StatelessWidgetºÍStatefulWidget£¬StatelessWidgetÓÃÀ´Õ¹Ê¾¾²Ì¬µÄÎı¾»òÕßͼƬ£¬Èç¹û¿Ø¼þÐèÒª¸ù¾ÝÍⲿÊý¾Ý»òÕßÓû§²Ù×÷À´¸Ä±äµÄ»°£¬¾ÍÐèҪʹÓÃStatefulWidget¡£StateµÄ¸ÅÄîÒ²ÊÇÀ´Ô´ÓÚFacebookµÄÁ÷ÐÐWeb¿ò¼ÜReact£¬React·ç¸ñµÄ¿ò¼ÜÖÐʹÓÿؼþÊ÷ºÍ¸÷×ÔµÄ״̬À´¹¹½¨½çÃæ£¬µ±Ä³¸ö¿Ø¼þµÄ״̬·¢Éú±ä»¯Ê±ÓÉ¿ò¼Ü¸ºÔð¶Ô±Èǰºó״̬²îÒì²¢ÇÒ²ÉÈ¡×îС´ú¼ÛÀ´¸üÐÂäÖȾ½á¹û¡£

Hot Reload

ÔÚDart´úÂëÎļþÖÐÐÞ¸Ä×Ö·û´®¡°Hello, World¡±£¬Ìí¼ÓÒ»¸ö¾ªÌ¾ºÅ£¬µã»÷±£´æ»òÕßÈÈˢа´Å¥¾Í¿ÉÒÔÁ¢¼´¸üе½½çÃæÉÏ£¬½öÐ輸°ÙºÁÃ룺

Flutterͨ¹ý½«ÐµĴúÂë×¢Èëµ½ÕýÔÚÔËÐеÄDartVMÖУ¬À´ÊµÏÖHot ReloadÕâÖÖÉñÆæµÄЧ¹û£¬ÔÚDartVM½«³ÌÐòÖеÄÀà½á¹¹¸üÐÂÍê³Éºó£¬Flutter»áÁ¢¼´Öؽ¨Õû¸ö¿Ø¼þÊ÷£¬´Ó¶ø¸üнçÃæ¡£µ«ÊÇÈÈË¢ÐÂÒ²ÓÐһЩÏÞÖÆ£¬²¢²»ÊÇËùÓеĴúÂë¸Ä¶¯¶¼¿ÉÒÔͨ¹ýÈÈË¢ÐÂÀ´¸üУº

±àÒë´íÎó£¬Èç¹ûÐ޸ĺóµÄDart´úÂëÎÞ·¨Í¨¹ý±àÒ룬Flutter»áÔÚ¿ØÖÆÌ¨±¨´í£¬ÕâʱÐèÒªÐ޸ĶÔÓ¦µÄ´úÂë¡£

¿Ø¼þÀàÐÍ´ÓStatelessWidgetµ½StatefulWidgetµÄת»»£¬ÒòΪFlutterÔÚÖ´ÐÐÈÈË¢ÐÂʱ»á±£Áô³ÌÐòÔ­À´µÄstate£¬¶øÄ³¸ö¿Ø¼þ´Óstageless¡ústatefulºó»áµ¼ÖÂFlutterÖØÐ´´½¨¿Ø¼þʱ±¨´í¡°myWidget is not a subtype of StatelessWidget¡±£¬¶ø´Óstateful¡ústateless»á±¨´í¡°type ¡®myWidget¡¯ is not a subtype of type ¡®StatefulWidget¡¯ of ¡®newWidget¡¯¡±¡£

È«¾Ö±äÁ¿ºÍ¾²Ì¬³ÉÔ±±äÁ¿£¬ÕâЩ±äÁ¿²»»áÔÚÈÈË¢ÐÂʱ¸üС£

ÐÞ¸ÄÁËmainº¯ÊýÖд´½¨µÄ¸ù¿Ø¼þ½Úµã£¬FlutterÔÚÈÈˢкóÖ»»á¸ù¾ÝÔ­À´µÄ¸ù½ÚµãÖØÐ´´½¨¿Ø¼þÊ÷£¬²»»áÐ޸ĸù½Úµã¡£

ij¸öÀà´ÓÆÕͨÀàÐÍת»»³Éö¾ÙÀàÐÍ£¬»òÕßÀàÐ͵ķºÐͲÎÊýÁбí±ä»¯£¬¶¼»áʹÈÈË¢ÐÂʧ°Ü¡£

ÈÈË¢ÐÂÎÞ·¨ÊµÏÖ¸üÐÂʱ£¬Ö´ÐÐÒ»´ÎÈÈÖØÆô£¨Hot Restart£©¾Í¿ÉÒÔÈ«Á¿¸üÐÂËùÓдúÂ룬ͬÑù²»ÐèÒªÖØÆôApp£¬Çø±ðÊÇrestart»á½«ËùÓÐDart´úÂë´ò°üͬ²½µ½É豸ÉÏ£¬²¢ÇÒËùÓÐ״̬¶¼»áÖØÖá£

Flutter²å¼þ

FlutterʹÓõÄDartÓïÑÔÎÞ·¨Ö±½Óµ÷ÓÃAndroidϵͳÌṩµÄJava½Ó¿Ú£¬Õâʱ¾ÍÐèҪʹÓòå¼þÀ´ÊµÏÖÖÐת¡£Flutter¹Ù·½ÌṩÁ˷ḻµÄÔ­Éú½Ó¿Ú·â×°£º

android_alarm_manager£¬·ÃÎÊAndroidϵͳµÄAlertManager¡£

android_intent£¬¹¹ÔìAndroidµÄIntent¶ÔÏó¡£

battery£¬»ñÈ¡ºÍ¼àÌýϵͳµçÁ¿±ä»¯¡£

connectivity£¬»ñÈ¡ºÍ¼àÌýÏµÍ³ÍøÂçÁ¬½Ó״̬¡£

device info£¬»ñÈ¡É豸ÐͺŵÈÐÅÏ¢¡£

image_picker£¬´ÓÉ豸ÖÐѡȡ»òÕßÅÄÉãÕÕÆ¬¡£

package_info£¬»ñÈ¡App°²×°°üµÄ°æ±¾µÈÐÅÏ¢¡£

path_provider£¬»ñÈ¡³£ÓÃÎļþ·¾¶¡£

quick_actions£¬Appͼ±êÌí¼Ó¿ì½Ý·½Ê½£¬iOSµÄeponymous conceptºÍAndroidµÄApp Shortcuts¡£

sensors£¬·ÃÎÊÉ豸µÄ¼ÓËٶȺÍÍÓÂÝÒÇ´«¸ÐÆ÷¡£

shared_preferences£¬App KV´æ´¢¹¦ÄÜ¡£

url_launcher£¬Æô¶¯URL£¬°üÀ¨´òµç»°¡¢·¢¶ÌÐźÍä¯ÀÀÍøÒ³µÈ¹¦ÄÜ¡£

video_player£¬²¥·ÅÊÓÆµÎļþ»òÕßÍøÂçÁ÷µÄ¿Ø¼þ¡£

ÔÚFlutterÖУ¬ÒÀÀµ°üÓÉPub²Ö¿â¹ÜÀí£¬ÏîÄ¿ÒÀÀµÅäÖÃÔÚpubspec.yamlÎļþÖÐÉùÃ÷¼´¿É£¨ÀàËÆÓÚNPMµÄ°æ±¾ÉùÃ÷ Pub Versioning Philosophy£©£¬¶ÔÓÚδ·¢²¼ÔÚPub²Ö¿âµÄ²å¼þ¿ÉÒÔʹÓÃgit²Ö¿âµØÖ·»òÎļþ·¾¶£º

dependencies:
url_launcher: ">=0.1.2 <0.2.0"
collection: "^0.1.2"
plugin1:
git:
url: "git://github.com/flutter/plugin1.git"
plugin2:
path: ../plugin2/

ÒÔshared_preferencesΪÀý£¬ÔÚpubspecÖÐÌí¼Ó´úÂ룺

dependencies:
flutter:
sdk: flutter

shared_preferences: "^0.4.1"

ÍÑ×ֺš°^¡±¿ªÍ·µÄ°æ±¾±íʾºÍµ±Ç°°æ±¾½Ó¿Ú±£³Ö¼æÈݵÄ×îа棬^1.2.3 µÈЧÓÚ >=1.2.3 <2.0.0 ¶ø ^0.1.2 µÈЧÓÚ >=0.1.2 <0.2.0£¬Ìí¼ÓÒÀÀµºóµã»÷¡°Packages get¡±°´Å¥¼´¿ÉÏÂÔØ²å¼þµ½±¾µØ£¬ÔÚ´úÂëÖÐÌí¼ÓimportÓï¾ä¾Í¿ÉÒÔʹÓòå¼þÌṩµÄ½Ó¿Ú£º

import 'package:shared_preferences/shared_preferences.Dart';
class _MyAppState extends State<MyAppCounter> {
int _count = 0;
static const String COUNTER_KEY = 'counter';

_MyAppState() {
init();
}

init() async {
var pref = await SharedPreferences.getInstance();
_count = pref.getInt(COUNTER_KEY) ?? 0;
setState(() {});
}

increaseCounter() async {
SharedPreferences pref = await SharedPreferences.getInstance();
pref.setInt(COUNTER_KEY, ++_count);
setState(() {});
}
...

Dart

DartÊÇÒ»ÖÖÇ¿ÀàÐÍ¡¢¿çƽ̨µÄ¿Í»§¶Ë¿ª·¢ÓïÑÔ¡£¾ßÓÐרÃÅΪ¿Í»§¶ËÓÅ»¯¡¢¸ßÉú²úÁ¦¡¢¿ìËÙ¸ßЧ¡¢¿ÉÒÆÖ²£¨¼æÈÝARM/x86£©¡¢Ò×ѧµÄOO±à³Ì·ç¸ñºÍÔ­ÉúÖ§³ÖÏìӦʽ±à³Ì£¨Stream & Future£©µÈÓÅÐãÌØÐÔ¡£DartÖ÷ÒªÓÉGoogle¸ºÔ𿪷¢ºÍά»¤£¬ÔÚ2011Äê10Æô¶¯ÏîÄ¿£¬2017Äê9Ô·¢²¼µÚÒ»¸ö2.0-dev°æ±¾¡£

Dart±¾ÉíÌṩÁËÈýÖÖÔËÐз½Ê½£º

ʹÓÃDart2js±àÒë³ÉJavaScript´úÂ룬ÔËÐÐÔÚ³£¹æä¯ÀÀÆ÷ÖУ¨Dart Web£©¡£

ʹÓÃDartVMÖ±½ÓÔÚÃüÁîÐÐÖÐÔËÐÐDart´úÂ루DartVM£©¡£

AOT·½Ê½±àÒë³É»úÆ÷Â룬ÀýÈçFlutter App¿ò¼Ü£¨Flutter£©¡£

FlutterÔÚɸѡÁË20¶àÖÖÓïÑÔºó£¬×îÖÕÑ¡ÔñDart×÷Ϊ¿ª·¢ÓïÑÔÖ÷ÒªÓм¸¸öÔ­Òò£º

½¡È«µÄÀàÐÍϵͳ£¬Í¬Ê±Ö§³Ö¾²Ì¬ÀàÐͼì²éºÍÔËÐÐʱÀàÐͼì²é¡£

´úÂëÌå»ýÓÅ»¯£¨Tree Shaking£©£¬±àÒëʱֻ±£ÁôÔËÐÐʱÐèÒªµ÷ÓõĴúÂ루²»ÔÊÐí·´ÉäÕâÑùµÄÒþʽÒýÓã©£¬ËùÒÔÅÓ´óµÄWidgets¿â²»»áÔì³É·¢²¼Ìå»ý¹ý´ó¡£

·á¸»µÄµ×²ã¿â£¬Dart×ÔÉíÌṩÁ˷dz£¶àµÄ¿â¡£

¶àÉú´úÎÞËøÀ¬»ø»ØÊÕÆ÷£¬×¨ÃÅΪUI¿ò¼ÜÖг£¼ûµÄ´óÁ¿Widgets¶ÔÏó´´½¨ºÍÏú»ÙÓÅ»¯¡£

¿çƽ̨£¬iOSºÍAndroid¹²ÓÃÒ»Ì×´úÂë¡£

JIT & AOTÔËÐÐģʽ£¬Ö§³Ö¿ª·¢Ê±µÄ¿ìËÙµü´úºÍÕýʽ·¢²¼ºó×î´ó³Ì¶È·¢»ÓÓ²¼þÐÔÄÜ¡£

ÔÚDartÖУ¬ÓÐÒ»Ð©ÖØÒªµÄ»ù±¾¸ÅÄîÐèÒªÁ˽⣺

ËùÓбäÁ¿µÄÖµ¶¼ÊǶÔÏó£¬Ò²¾ÍÊÇÀàµÄʵÀý¡£ÉõÖÁÊý×Ö¡¢º¯ÊýºÍnullÒ²¶¼ÊǶÔÏ󣬶¼¼Ì³Ð×ÔObjectÀà¡£

ËäÈ»DartÊÇÇ¿ÀàÐÍÓïÑÔ£¬µ«ÊÇÏÔʽ±äÁ¿ÀàÐÍÉùÃ÷ÊÇ¿ÉÑ¡µÄ£¬DartÖ§³ÖÀàÐÍÍÆ¶Ï¡£Èç¹û²»ÏëʹÓÃÀàÐÍÍÆ¶Ï£¬¿ÉÒÔÓÃdynamicÀàÐÍ¡£

DartÖ§³Ö·ºÐÍ£¬List<int>±íʾ°üº¬intÀàÐ͵ÄÁÐ±í£¬List<dynamic>Ôò±íʾ°üº¬ÈÎÒâÀàÐ͵ÄÁÐ±í¡£

DartÖ§³Ö¶¥²ã£¨top-level£©º¯ÊýºÍÀà³ÉÔ±º¯Êý£¬Ò²Ö§³ÖǶÌ׺¯ÊýºÍ±¾µØº¯Êý¡£

DartÖ§³Ö¶¥²ã±äÁ¿ºÍÀà³ÉÔ±±äÁ¿¡£

DartûÓÐpublic¡¢protectedºÍprivateÕâЩ¹Ø¼ü×Ö£¬Ê¹ÓÃÏ»®Ïß¡°_¡±¿ªÍ·µÄ±äÁ¿»òÕߺ¯Êý£¬±íʾֻÔÚ¿âÄڿɼû¡£²Î¿¼¿âºÍ¿É¼ûÐÔ¡£

DartVMµÄÄÚ´æ·ÖÅä²ßÂԷdz£¼òµ¥£¬´´½¨¶ÔÏóʱֻÐèÒªÔÚÏÖÓжÑÉÏÒÆ¶¯Ö¸Õ룬ÄÚ´æÔö³¤Ê¼ÖÕÊÇÏßÐεģ¬Ê¡È¥Á˲éÕÒ¿ÉÓÃÄÚ´æ¶ÎµÄ¹ý³Ì£º

DartÖÐÀàËÆÏ̵߳ĸÅÄî½Ð×öIsolate£¬Ã¿¸öIsolateÖ®¼äÊÇÎÞ·¨¹²ÏíÄÚ´æµÄ£¬ËùÒÔÕâÖÖ·ÖÅä²ßÂÔ¿ÉÒÔÈÃDartʵÏÖÎÞËøµÄ¿ìËÙ·ÖÅä¡£

DartµÄÀ¬»ø»ØÊÕÒ²²ÉÓÃÁ˶àÉú´úËã·¨£¬ÐÂÉú´úÔÚ»ØÊÕÄÚ´æÊ±²ÉÓÃÁË¡°°ë¿Õ¼ä¡±Ëã·¨£¬´¥·¢À¬»ø»ØÊÕʱDart»á½«µ±Ç°°ë¿Õ¼äÖеġ°»îÔ¾¡±¶ÔÏó¿½±´µ½±¸Óÿռ䣬ȻºóÕûÌåÊͷŵ±Ç°¿Õ¼äµÄËùÓÐÄڴ棺

Õû¸ö¹ý³ÌÖÐDartÖ»ÐèÒª²Ù×÷ÉÙÁ¿µÄ¡°»îÔ¾¡±¶ÔÏ󣬴óÁ¿µÄûÓÐÒýÓõġ°ËÀÍö¡±¶ÔÏóÔò±»ºöÂÔ£¬ÕâÖÖËã·¨Ò²·Ç³£ÊʺÏFlutter¿ò¼ÜÖдóÁ¿WidgetÖØ½¨µÄ³¡¾°¡£

Flutter Framework

FlutterµÄ¿ò¼Ü²¿·ÖÍêȫʹÓÃDartÓïÑÔʵÏÖ£¬²¢ÇÒÓÐ×ÅÇåÎúµÄ·Ö²ã¼Ü¹¹¡£·Ö²ã¼Ü¹¹Ê¹µÃÎÒÃÇ¿ÉÒÔÔÚµ÷ÓÃFlutterÌṩµÄ±ã½Ý¿ª·¢¹¦ÄÜ£¨Ô¤¶¨ÒåµÄÒ»Ì׸ßÖÊÁ¿Material¿Ø¼þ£©Ö®Í⣬»¹¿ÉÒÔÖ±½Óµ÷ÓÃÉõÖÁÐÞ¸Äÿһ²ãʵÏÖ£¨ÒòΪÕû¸ö¿ò¼Ü¶¼ÊôÓÚ¡°Óû§¿Õ¼ä¡±µÄ´úÂ룩£¬Õâ¸øÎÒÃÇÌṩÁË×î´ó³Ì¶ÈµÄ×Ô¶¨ÒåÄÜÁ¦¡£Frameworkµ×²ãÊÇFlutterÒýÇæ£¬ÒýÇæÖ÷Òª¸ºÔðͼÐλæÖÆ£¨Skia£©¡¢ÎÄ×ÖÅŰ棨libtxt£©ºÍÌṩDartÔËÐÐʱ£¬ÒýÇæÈ«²¿Ê¹ÓÃC++ʵÏÖ£¬Framework²ãʹÎÒÃÇ¿ÉÒÔÓÃDartÓïÑÔµ÷ÓÃÒýÇæµÄÇ¿´óÄÜÁ¦¡£

·Ö²ã¼Ü¹¹

FrameworkµÄ×îµ×²ã½Ð×öFoundation£¬ÆäÖж¨ÒåµÄ´ó¶¼ÊǷdz£»ù´¡µÄ¡¢Ìṩ¸øÆäËûËùÓвãʹÓõŤ¾ßÀàºÍ·½·¨¡£»æÖƿ⣨Painting£©·â×°ÁËFlutter EngineÌṩµÄ»æÖƽӿڣ¬Ö÷ÒªÊÇΪÁËÔÚ»æÖƿؼþµÈ¹Ì¶¨ÑùʽµÄͼÐÎʱÌṩ¸üÖ±¹Û¡¢¸ü·½±ãµÄ½Ó¿Ú£¬±ÈÈç»æÖÆËõ·ÅºóµÄλͼ¡¢»æÖÆÎı¾¡¢²åÖµÉú³ÉÒõÓ°ÒÔ¼°ÔÚºÐ×ÓÖÜΧ»æÖƱ߿òµÈµÈ¡£AnimationÊǶ¯»­Ïà¹ØµÄÀ࣬ÌṩÁËÀàËÆAndroidϵͳµÄValueAnimatorµÄ¹¦ÄÜ£¬²¢ÇÒÌṩÁ˷ḻµÄÄÚÖòåÖµÆ÷¡£GestureÌṩÁËÊÖÊÆÊ¶±ðÏà¹ØµÄ¹¦ÄÜ£¬°üÀ¨´¥ÃþʼþÀඨÒåºÍ¶àÖÖÄÚÖõÄÊÖÊÆÊ¶±ðÆ÷¡£GestureBindingÀàÊÇFlutterÖд¦ÀíÊÖÊÆµÄ³éÏó·þÎñÀ࣬¼Ì³Ð×ÔBindingBaseÀà¡£BindingϵÁеÄÀàÔÚFlutterÖг䵱×ÅÀàËÆÓÚAndroidÖеÄSystemServiceϵÁУ¨ActivityManager¡¢PackageManager£©¹¦ÄÜ£¬Ã¿¸öBindingÀà¶¼Ìṩһ¸ö·þÎñµÄµ¥Àý¶ÔÏó£¬App×î¶¥²ãµÄBinding»á°üº¬ËùÓÐÏà¹ØµÄBingding³éÏóÀà¡£Èç¹ûʹÓÃFlutterÌṩµÄ¿Ø¼þ½øÐпª·¢£¬ÔòÐèҪʹÓÃWidgetsFlutterBinding£¬Èç¹û²»Ê¹ÓÃFlutterÌṩµÄÈκοؼþ£¬¶øÖ±½Óµ÷ÓÃRender²ã£¬ÔòÐèҪʹÓÃRenderingFlutterBinding¡£

Flutter±¾ÉíÖ§³ÖAndroidºÍiOSÁ½¸öƽ̨£¬³ýÁËÐÔÄܺͿª·¢ÓïÑÔÉϵġ°native¡±»¯Ö®Í⣬Ëü»¹ÌṩÁËÁ½Ì×Éè¼ÆÓïÑԵĿؼþʵÏÖMaterial & Cupertino£¬¿ÉÒÔ°ïÖúApp¸üºÃµØÔÚ²»Í¬Æ½Ì¨ÉÏÌṩԭÉúµÄÓû§ÌåÑé¡£

äÖȾ¿â£¨Rendering£©

FlutterµÄ¿Ø¼þÊ÷ÔÚʵ¼ÊÏÔʾʱ»áת»»³É¶ÔÓ¦µÄäÖȾ¶ÔÏó£¨RenderObject£©Ê÷À´ÊµÏÖ²¼¾ÖºÍ»æÖƲÙ×÷¡£Ò»°ãÇé¿öÏ£¬ÎÒÃÇÖ»»áÔÚµ÷ÊÔ²¼¾Ö£¬»òÕßÐèҪʹÓÃ×Ô¶¨Òå¿Ø¼þÀ´ÊµÏÖÄ³Ð©ÌØÊâЧ¹ûµÄʱºò£¬²ÅÐèÒª¿¼ÂÇäÖȾ¶ÔÏóÊ÷µÄϸ½Ú¡£äÖȾ¿âÖ÷ÒªÌṩµÄ¹¦ÄÜÀàÓУº

abstract class RendererBinding extends BindingBase with ServicesBinding,
SchedulerBinding, HitTestable { ... }
abstract class RenderObject extends AbstractNode
with DiagnosticableTreeMixin implements HitTestTarget
{
abstract class RenderBox extends RenderObject
{ ... }
class RenderParagraph extends RenderBox { ...
}
class RenderImage extends RenderBox { ... }
class RenderFlex extends RenderBox with ContainerRenderObjectMixin<RenderBox,
FlexParentData>,
RenderBoxContainerDefaultsMixin<RenderBox,
FlexParentData>,
DebugOverflowIndicatorMixin { ... }

RendererBindingÊÇäÖȾÊ÷ºÍFlutterÒýÇæµÄ½ºË®²ã£¬¸ºÔð¹ÜÀíÖ¡ÖØ»æ¡¢´°¿Ú³ß´çºÍäÖȾÏà¹Ø²ÎÊý±ä»¯µÄ¼àÌý¡£RenderObjectäÖȾÊ÷ÖÐËùÓнڵãµÄ»ùÀ࣬¶¨ÒåÁ˲¼¾Ö¡¢»æÖƺͺϳÉÏà¹ØµÄ½Ó¿Ú¡£RenderBoxºÍÆäÈý¸ö³£ÓõÄ×ÓÀàRenderParagraph¡¢RenderImage¡¢RenderFlexÔòÊǾßÌå²¼¾ÖºÍ»æÖÆÂß¼­µÄʵÏÖÀà¡£

ÔÚFlutter½çÃæäÖȾ¹ý³Ì·ÖΪÈý¸ö½×¶Î£º²¼¾Ö¡¢»æÖÆ¡¢ºÏ³É£¬²¼¾ÖºÍ»æÖÆÔÚFlutter¿ò¼ÜÖÐÍê³É£¬ºÏ³ÉÔò½»ÓÉÒýÇæ¸ºÔð¡£

¿Ø¼þÊ÷ÖеÄÿ¸ö¿Ø¼þͨ¹ýʵÏÖRenderObjectWidget#createRenderObject(BuildContext context) ¡ú RenderObject·½·¨À´´´½¨¶ÔÓ¦µÄ²»Í¬ÀàÐ͵ÄRenderObject¶ÔÏó£¬×é³ÉäÖȾ¶ÔÏóÊ÷¡£ÒòΪFlutter¼«´óµØ¼ò»¯Á˲¼¾ÖµÄÂß¼­£¬ËùÒÔÕû¸ö²¼¾Ö¹ý³ÌÖÐÖ»ÐèÒªÉî¶È±éÀúÒ»´Î£º

äÖȾ¶ÔÏóÊ÷ÖеÄÿ¸ö¶ÔÏó¶¼»áÔÚ²¼¾Ö¹ý³ÌÖнÓÊܸ¸¶ÔÏóµÄConstraints²ÎÊý£¬¾ö¶¨×Ô¼ºµÄ´óС£¬È»ºó¸¸¶ÔÏó¾Í¿ÉÒÔ°´ÕÕ×Ô¼ºµÄÂß¼­¾ö¶¨¸÷¸ö×Ó¶ÔÏóµÄλÖã¬Íê³É²¼¾Ö¹ý³Ì¡£×Ó¶ÔÏó²»´æ´¢×Ô¼ºÔÚÈÝÆ÷ÖеÄλÖã¬ËùÒÔÔÚËüµÄλÖ÷¢Éú¸Ä±äʱ²¢²»ÐèÒªÖØÐ²¼¾Ö»òÕß»æÖÆ¡£×Ó¶ÔÏóµÄλÖÃÐÅÏ¢´æ´¢ÔÚËü×Ô¼ºµÄparentData×Ö¶ÎÖУ¬µ«ÊǸÃ×Ö¶ÎÓÉËüµÄ¸¸¶ÔÏó¸ºÔðά»¤£¬×ÔÉí²¢²»¹ØÐĸÃ×ֶεÄÄÚÈÝ¡£Í¬Ê±Ò²ÒòΪÕâÖÖ¼òµ¥µÄ²¼¾ÖÂß¼­£¬Flutter¿ÉÒÔÔÚijЩ½ÚµãÉèÖò¼¾Ö±ß½ç£¨Relayout boundary£©£¬¼´µ±±ß½çÄÚµÄÈκζÔÏó·¢ÉúÖØÐ²¼¾Öʱ£¬²»»áÓ°Ïì±ß½çÍâµÄ¶ÔÏ󣬷´Ö®ÒàÈ»£º

²¼¾ÖÍê³Éºó£¬äÖȾ¶ÔÏóÊ÷ÖеÄÿ¸ö½Úµã¶¼ÓÐÁËÃ÷È·µÄ³ß´çºÍλÖã¬Flutter»á°ÑËùÓжÔÏó»æÖƵ½²»Í¬µÄͼ²ãÉÏ£º

ÒòΪ»æÖƽڵãʱҲÊÇÉî¶È±éÀú£¬¿ÉÒÔ¿´µ½µÚ¶þ¸ö½ÚµãÔÚ»æÖÆËüµÄ±³¾°ºÍǰ¾°²»µÃ²»»æÖÆÔÚ²»Í¬µÄͼ²ãÉÏ£¬ÒòΪµÚËĸö½ÚµãÇл»ÁËͼ²ã£¨ÒòΪ¡°4¡±½ÚµãÊÇÒ»¸öÐèÒª¶ÀÕ¼Ò»¸öͼ²ãµÄÄÚÈÝ£¬±ÈÈçÊÓÆµ£©£¬¶øµÚÁù¸ö½ÚµãÒ²Ò»Æð»æÖƵ½Á˺ìɫͼ²ã¡£ÕâÑù»áµ¼Öµڶþ¸ö½ÚµãµÄǰ¾°£¨Ò²¾ÍÊÇ¡°5¡±£©²¿·ÖÐèÒªÖØ»æÊ±£¬ºÍËüÔÚÂß¼­ÉϺÁ²»Ïà¸Éµ«ÊÇ´¦ÓÚͬһͼ²ãµÄµÚÁù¸ö½ÚµãÒ²±ØÐëÖØ»æ¡£ÎªÁ˱ÜÃâÕâÖÖÇé¿ö£¬FlutterÌṩÁËÁíÍâÒ»¸ö¡°ÖØ»æ±ß½ç¡±µÄ¸ÅÄ

ÔÚ½øÈëºÍ×ß³öÖØ»æ±ß½çʱ£¬Flutter»áÇ¿ÖÆÇл»ÐµÄͼ²ã£¬ÕâÑù¾Í¿ÉÒÔ±ÜÃâ±ß½çÄÚÍâµÄ»¥ÏàÓ°Ïì¡£µäÐ͵ÄÓ¦Óó¡¾°¾ÍÊÇScrollView£¬µ±¹ö¶¯ÄÚÈÝÖØ»æÊ±£¬Ò»°ãÇé¿öÏÂÆäËûÄÚÈÝÊDz»ÐèÒªÖØ»æµÄ¡£ËäÈ»ÖØ»æ±ß½ç¿ÉÒÔÔÚÈκνڵãÊÖ¶¯ÉèÖ㬵«ÊÇÒ»°ã²»ÐèÒªÎÒÃÇÀ´ÊµÏÖ£¬FlutterÌṩµÄ¿Ø¼þĬÈÏ»áÔÚÐèÒªÉèÖõĵط½×Ô¶¯ÉèÖá£

¿Ø¼þ¿â£¨Widgets£©

FlutterµÄ¿Ø¼þ¿âÌṩÁ˷dz£·á¸»µÄ¿Ø¼þ£¬°üÀ¨×î»ù±¾µÄÎı¾¡¢Í¼Æ¬¡¢ÈÝÆ÷¡¢ÊäÈë¿òºÍ¶¯»­µÈµÈ¡£ÔÚFlutterÖС°Ò»ÇнÔÊǿؼþ¡±£¬Í¨¹ý×éºÏ¡¢Ç¶Ìײ»Í¬ÀàÐ͵Ŀؼþ£¬¾Í¿ÉÒÔ¹¹½¨³öÈÎÒ⹦ÄÜ¡¢ÈÎÒ⸴ÔӶȵĽçÃæ¡£Ëü°üº¬µÄ×îÖ÷ÒªµÄ¼¸¸öÀàÓУº

class WidgetsFlutterBinding extends BindingBase
with GestureBinding, ServicesBinding,
SchedulerBinding,
PaintingBinding, RendererBinding, WidgetsBinding { ... }
abstract class Widget extends DiagnosticableTree { ... }
abstract class StatelessWidget extends Widget { ... }
abstract class StatefulWidget extends Widget { ... }
abstract class RenderObjectWidget extends Widget { ... }
abstract class Element extends DiagnosticableTree
implements BuildContext { ... }
class StatelessElement extends ComponentElement { ... }
class StatefulElement extends ComponentElement { ... }
abstract class RenderObjectElement extends Element { ... }
...

»ùÓÚFlutter¿Ø¼þϵͳ¿ª·¢µÄ³ÌÐò¶¼ÐèҪʹÓÃWidgetsFlutterBinding£¬ËüÊÇFlutterµÄ¿Ø¼þ¿ò¼ÜºÍFlutterÒýÇæµÄ½ºË®²ã¡£Widget¾ÍÊÇËùÓпؼþµÄ»ùÀ࣬Ëü±¾ÉíËùÓеÄÊôÐÔ¶¼ÊÇÖ»¶ÁµÄ¡£RenderObjectWidgetËùÓеÄʵÏÖÀàÔò¸ºÔðÌṩÅäÖÃÐÅÏ¢²¢´´½¨¾ßÌåµÄRenderObjectElement¡£ElementÊÇFlutterÓÃÀ´·ÖÀë¿Ø¼þÊ÷ºÍÕæÕýµÄäÖȾ¶ÔÏóµÄÖмä²ã£¬¿Ø¼þÓÃÀ´ÃèÊö¶ÔÓ¦µÄelementÊôÐÔ£¬¿Ø¼þÖØ½¨ºó¿ÉÄܻḴÓÃͬһ¸öelement¡£RenderObjectElement³ÖÓÐÕæÕý¸ºÔð²¼¾Ö¡¢»æÖƺÍÅöײ²âÊÔ£¨hit test£©µÄRenderObject¶ÔÏó¡£

StatelessWidgetºÍStatefulWidget²¢²»»áÖ±½ÓÓ°ÏìRenderObjectµÄ´´½¨£¬ËüÃÇÖ»¸ºÔð´´½¨¶ÔÓ¦µÄRenderObjectWidget£¬StatelessElementºÍStatefulElementÒ²ÊÇÀàËÆµÄ¹¦ÄÜ¡£

ËüÃÇÖ®¼äµÄ¹ØÏµÈçÏÂͼ£º

Èç¹û¿Ø¼þµÄÊôÐÔ·¢ÉúÁ˱仯£¨ÒòΪ¿Ø¼þµÄÊôÐÔÊÇÖ»¶ÁµÄ£¬ËùÒԱ仯Ҳ¾ÍÒâζ×ÅÖØÐ´´½¨ÁËеĿؼþÊ÷£©£¬µ«ÊÇÆäÊ÷ÉÏÿ¸ö½ÚµãµÄÀàÐÍûÓб仯ʱ£¬elementÊ÷ºÍrenderÊ÷¿ÉÒÔÍêÈ«ÖØÓÃÔ­À´µÄ¶ÔÏó£¨ÒòΪelementºÍrender objectµÄÊôÐÔ¶¼ÊǿɱäµÄ£©£º

µ«ÊÇ£¬Èç¹û¿Ø¼þÊ÷ÖÖij¸ö½ÚµãµÄÀàÐÍ·¢ÉúÁ˱仯£¬ÔòelementÊ÷ºÍrenderÊ÷ÖеĶÔÓ¦½ÚµãÒ²ÐèÒªÖØÐ´´½¨£º

ÍâÂôȫƷÀàÒ³ÃæÊµ¼ù

ÔÚµ÷ÑÐÁËFlutterµÄ¸÷ÏîÌØÐÔºÍʵÏÖÔ­ÀíÖ®ºó£¬ÍâÂô¼Æ»®»Ò¶ÈÉÏÏßFlutter°æµÄȫƷÀàÒ³Ãæ¡£¶ÔÓÚ½«FlutterÒ³Ãæ×÷ΪAppµÄÒ»²¿·ÖÕâÖÖ¼¯³Éģʽ£¬¹Ù·½²¢Ã»ÓÐÌṩÍêÉÆµÄÖ§³Ö£¬ËùÒÔÎÒÃÇÊ×ÏÈÐèÒªÁ˽âFlutterÊÇÈçºÎ±àÒë¡¢´ò°ü²¢ÇÒÔËÐÐÆðÀ´µÄ¡£

Flutter App¹¹½¨¹ý³Ì

×î¼òµ¥µÄFlutter¹¤³ÌÖÁÉÙ°üº¬Á½¸öÎļþ£º

ÔËÐÐFlutter³ÌÐòʱÐèÒª¶ÔӦƽ̨µÄËÞÖ÷¹¤³Ì£¬ÔÚAndroidÉÏFlutterͨ¹ý×Ô¶¯´´½¨Ò»¸öGradleÏîÄ¿À´Éú³ÉËÞÖ÷£¬ÔÚÏîĿĿ¼ÏÂÖ´ÐÐflutter create .£¬Flutter»á´´½¨iosºÍandroidÁ½¸öĿ¼£¬·Ö±ð¹¹½¨¶ÔӦƽ̨µÄËÞÖ÷ÏîÄ¿£¬AndroidĿ¼ÄÚÈÝÈçÏ£º

´ËGradleÏîÄ¿ÖÐÖ»ÓÐÒ»¸öapp module£¬¹¹½¨²úÎï¼´ÊÇËÞÖ÷APK¡£FlutterÔÚ±¾µØÔËÐÐʱĬÈϲÉÓÃDebugģʽ£¬ÔÚÏîĿĿ¼ִÐÐflutter run¼´¿É°²×°µ½É豸Öв¢×Ô¶¯ÔËÐУ¬DebugģʽÏÂFlutterʹÓÃJIT·½Ê½À´Ö´ÐÐDart´úÂ룬ËùÓеÄDart´úÂë¶¼»á´ò°üµ½APKÎļþÖÐassetsĿ¼Ï£¬ÓÉlibflutter.soÖÐÌṩµÄDartVM¶ÁÈ¡²¢Ö´ÐУº

kernel_blob.binÊÇFlutterÒýÇæµÄµ×²ã½Ó¿ÚºÍDartÓïÑÔ»ù±¾¹¦Äܲ¿·Ö´úÂ룺

third_party/dart/runtime/bin/*.dart
third_party/dart/runtime/lib/*.dart
third_party/dart/sdk/lib/_http/*.dart
third_party/dart/sdk/lib/async/*.dart
third_party/dart/sdk/lib/collection/*.dart
third_party/dart/sdk/lib/convert/*.dart
third_party/dart/sdk/lib/core/*.dart
third_party/dart/sdk/lib/developer/*.dart
third_party/dart/sdk/lib/html/*.dart
third_party/dart/sdk/lib/internal/*.dart
third_party/dart/sdk/lib/io/*.dart
third_party/dart/sdk/lib/isolate/*.dart
third_party/dart/sdk/lib/math/*.dart
third_party/dart/sdk/lib/mirrors/*.dart
third_party/dart/sdk/lib/profiler/*.dart
third_party/dart/sdk/lib/typed_data/*.dart
third_party/dart/sdk/lib/vmservice/*.dart
flutter/lib/ui/*.dart

platform.dillÔòÊÇʵÏÖÁËÒ³ÃæÂß¼­µÄ´úÂ룬Ҳ°üÀ¨Flutter FrameworkºÍÆäËûÓÉpubÒÀÀµµÄ¿â´úÂ룺

flutter_tutorial_2/lib/main.dart
flutter/packages/flutter/lib/src/widgets/*.dart
flutter/packages/flutter/lib/src/services/*.dart
flutter/packages/flutter/lib/src/semantics/*.dart
flutter/packages/flutter/lib/src/scheduler/*.dart
flutter/packages/flutter/lib/src/rendering/*.dart
flutter/packages/flutter/lib/src/physics/*.dart
flutter/packages/flutter/lib/src/painting/*.dart
flutter/packages/flutter/lib/src/gestures/*.dart
flutter/packages/flutter/lib/src/foundation/*.dart
flutter/packages/flutter/lib/src/animation/*.dart
.pub-cache/hosted/pub.flutter-io.cn/collection-1.14.6/lib/*.dart
.pub-cache/hosted/pub.flutter-io.cn/meta-1.1.5/lib/*.dart
.pub-cache/hosted/pub.flutter-io.cn/shared_preferences-0.4.2/*.dart

kernel_blob.binºÍplatform.dill¶¼ÊÇÓÉflutter_toolsÖеÄbundle.dartÖе÷ÓÃKernelCompilerÉú³É¡£

ÔÚReleaseģʽ£¨flutter run --release£©Ï£¬Flutter»áʹÓÃDartµÄAOTÔËÐÐģʽ£¬±àÒëʱ½«Dart´úÂëת»»³ÉARMÖ¸Á

kernel_blob.binºÍplatform.dill¶¼²»ÔÚ´ò°üºóµÄAPKÖУ¬È¡´úÆä¹¦ÄܵÄÊÇ(isolate/vm)_snapshot_(data/instr)ËĸöÎļþ¡£snapshotÎļþÓÉFlutter SDKÖеÄflutter/bin/cache/artifacts/engine/android-arm-release/darwin-x64/gen_snapshotÃüÁîÉú³É£¬vm_snapshot_*ÊÇDartÐéÄâ»úÔËÐÐËùÐèÒªµÄÊý¾ÝºÍ´úÂëÖ¸Áisolate_snapshot_*ÔòÊÇÿ¸öisolateÔËÐÐËùÐèÒªµÄÊý¾ÝºÍ´úÂëÖ¸Áî¡£

Flutter AppÔËÐлúÖÆ

Flutter¹¹½¨³öµÄAPKÔÚÔËÐÐʱ»á½«ËùÓÐassetsĿ¼ÏµÄ×ÊÔ´Îļþ½âѹµ½App˽ÓÐÎļþĿ¼ÖеÄflutterĿ¼Ï£¬Ö÷Òª°üÀ¨´¦Àí×Ö·û±àÂëµÄicudtl.dat£¬»¹ÓÐDebugģʽµÄkernel_blob.bin¡¢platform.dillºÍReleaseģʽϵÄ4¸ösnapshotÎļþ¡£Ä¬ÈÏÇé¿öÏÂFlutterÔÚApplication#onCreateʱµ÷ÓÃFlutterMain#startInitializationÀ´Æô¶¯½âѹÈÎÎñ£¬È»ºóÔÚFlutterActivityDelegate#onCreateÖе÷ÓÃFlutterMain#ensureInitializationCompleteÀ´µÈ´ý½âѹÈÎÎñ½áÊø¡£

FlutterÔÚDebugģʽÏÂʹÓÃJITÖ´Ðз½Ê½£¬Ö÷ÒªÊÇΪÁËÖ§³Ö¹ãÊÜ»¶Ó­µÄÈÈˢй¦ÄÜ£º

´¥·¢ÈÈË¢ÐÂʱFlutter»á¼ì²â·¢Éú¸Ä±äµÄDartÎļþ£¬½«Æäͬ²½µ½App˽Óлº´æÄ¿Â¼Ï£¬DartVM¼ÓÔØ²¢ÇÒÐ޸ĶÔÓ¦µÄÀà»òÕß·½·¨£¬Öؽ¨¿Ø¼þÊ÷ºóÁ¢¼´¿ÉÒÔÔÚÉ豸ÉÏ¿´µ½Ð§¹û¡£

ÔÚReleaseģʽÏÂFlutter»áÖ±½Ó½«snapshotÎļþÓ³Éäµ½ÄÚ´æÖÐÖ´ÐÐÆäÖеÄÖ¸Á

ÔÚReleaseģʽÏ£¬FlutterActivityDelegate#onCreateÖе÷ÓÃFlutterMain#ensureInitializationComplete·½·¨ÖлὫAndroidManifestÖÐÉèÖõÄsnapshot£¨Ã»ÓÐÉèÖÃÔòʹÓÃÉÏÃæÌáµ½µÄĬÈÏÖµ£©ÎļþÃûµÈÔËÐвÎÊýÉèÖõ½¶ÔÓ¦µÄC++ͬÃûÀà¶ÔÏóÖУ¬¹¹ÔìFlutterNativeViewʵÀýʱµ÷ÓÃnativeAttachÀ´³õʼ»¯DartVM£¬ÔËÐбàÒëºÃµÄDart´úÂë¡£

´ò°üAndroid Library

Á˽âFlutterÏîÄ¿µÄ¹¹½¨ºÍÔËÐлúÖÆºó£¬ÎÒÃǾͿÉÒÔ°´ÕÕÆäÐèÇó´ò°ü³ÉAARÈ»ºó¼¯³Éµ½ÏÖÓÐÔ­ÉúAppÖÐÁË¡£Ê×ÏÈÔÚandorid/app/build.gradleÖÐÐ޸ģº

¼òµ¥Ð޸ĺóÎÒÃǾͿÉÒÔʹÓÃAndroid Studio»òÕßGradleÃüÁîÐй¤¾ß½«Flutter´úÂë´ò°üµ½aarÖÐÁË¡£FlutterÔËÐÐʱËùÐèÒªµÄ×ÊÔ´¶¼»á°üº¬ÔÚaarÖУ¬½«Æä·¢²¼µ½maven·þÎñÆ÷»òÕß±¾µØmaven²Ö¿âºó£¬¾Í¿ÉÒÔÔÚÔ­ÉúAppÏîÄ¿ÖÐÒýÓá£

µ«ÕâÖ»ÊǼ¯³ÉµÄµÚÒ»²½£¬ÎªÁËÈÃFlutterÒ³ÃæÎÞ·ìÏνӵ½ÍâÂôAppÖУ¬ÎÒÃÇÐèÒª×öµÄ»¹Óкܶࡣ

ͼƬ×ÊÔ´¸´ÓÃ

FlutterĬÈϽ«ËùÓеÄͼƬ×ÊÔ´Îļþ´ò°üµ½assetsĿ¼Ï£¬µ«ÊÇÎÒÃDz¢²»ÊÇÓÃFlutter¿ª·¢È«ÐµÄÒ³Ãæ£¬Í¼Æ¬×ÊÔ´Ô­À´¶¼»á°´ÕÕAndroidµÄ¹æ·¶·ÅÔÚ¸÷¸ödrawableĿ¼£¬¼´Ê¹ÊÇȫеÄÒ³ÃæÒ²»áÓкܶàͼƬ×ÊÔ´¸´Óõij¡¾°£¬ËùÒÔÔÚassetsĿ¼ÏÂÐÂÔöͼƬ×ÊÔ´²¢²»ºÏÊÊ¡£

Flutter¹Ù·½²¢Ã»ÓÐÌṩֱ½Óµ÷ÓÃdrawableĿ¼ÏµÄͼƬ×ÊÔ´µÄ;¾¶£¬±Ï¾¹drawableÕâÀàÎļþµÄ´¦Àí»áÉæ¼°´óÁ¿µÄAndroidƽ̨Ïà¹ØµÄÂß¼­£¨ÆÁÄ»Ãܶȡ¢ÏµÍ³°æ±¾¡¢ÓïÑԵȵȣ©£¬assetsĿ¼ÎļþµÄ¶ÁÈ¡²Ù×÷Ò²ÔÚÒýÇæÄÚ²¿Ê¹ÓÃC++ʵÏÖ£¬ÔÚDart²ãÃæÊµÏÖ¶ÁÈ¡drawableÎļþµÄ¹¦ÄܱȽÏÀ§ÄÑ¡£FlutterÔÚ´¦ÀíassetsĿ¼ÖеÄÎļþʱҲ֧³ÖÌí¼Ó¶à±¶ÂʵÄͼƬ×ÊÔ´£¬²¢Äܹ»ÔÚʹÓÃʱ×Ô¶¯Ñ¡Ôñ£¬µ«ÊÇFlutterÒªÇóÿ¸öͼƬ±ØÐëÌṩ1xͼ£¬È»ºó²Å»áʶ±ðµ½¶ÔÓ¦µÄÆäËû±¶ÂÊĿ¼ÏµÄͼƬ£º

flutter:
assets:
- images/cat.png
- images/2x/cat.png
- images/3.5x/cat.png

new Image.asset('images/cat.png');

ÕâÑùÅäÖú󣬲ÅÄÜÕýÈ·µØÔÚ²»Í¬·Ö±æÂʵÄÉ豸ÉÏʹÓöÔÓ¦ÃܶȵÄͼƬ¡£µ«ÊÇΪÁ˼õСAPK°üÌå»ýÎÒÃǵÄλͼ×ÊÔ´Ò»°ãÖ»Ìṩ³£ÓõÄ2x·Ö±æÂÊ£¬ÆäËû·Ö±æÂʵÄÉ豸»áÔÚÔËÐÐʱ×Ô¶¯Ëõ·Åµ½¶ÔÓ¦´óС¡£Õë¶ÔÕâÖÖÌØÊâµÄÇé¿ö£¬ÎÒÃÇÔÚ²»Ôö¼Ó°üÌå»ýµÄǰÌáÏ£¬Í¬ÑùÌṩÁ˺ÍÔ­ÉúAppÒ»ÑùµÄÄÜÁ¦£º

ÔÚµ÷ÓÃFlutterÒ³ÃæÖ®Ç°½«Ö¸¶¨µÄͼƬ×ÊÔ´°´ÕÕÉ豸ÆÁÄ»ÃܶÈËõ·Å£¬²¢´æ´¢ÔÚApp˽ÓÐĿ¼Ï¡£

FlutterÖÐʹÓÃʱͨ¹ý×Ô¶¨ÒåµÄWMImage¿Ø¼þÀ´¼ÓÔØ£¬Êµ¼ÊÊÇͨ¹ýת»»³ÉFileImage²¢×Ô¶¯ÉèÖÃscaleΪdevicePixelRatioÀ´¼ÓÔØ¡£

ÕâÑù¾Í¿ÉÒÔͬʱ½â¾öAPK°ü´óСºÍͼƬ×ÊԴȱʧ1xͼµÄÎÊÌâ¡£

FlutterºÍÔ­Éú´úÂëµÄͨÐÅ

ÎÒÃÇÖ»ÓÃFlutterʵÏÖÁËÒ»¸öÒ³Ãæ£¬ÏÖÓеĴóÁ¿Âß¼­¶¼ÊÇÓÃJavaʵÏÖ£¬ÔÚÔËÐÐʱ»áÓÐÐí¶à³¡¾°±ØÐëʹÓÃÔ­ÉúÓ¦ÓÃÖеÄÂß¼­ºÍ¹¦ÄÜ£¬ÀýÈçÍøÂçÇëÇó£¬ÎÒÃÇͳһµÄÍøÂç¿â»áÔÚÿ¸öÍøÂçÇëÇóÖÐÌí¼ÓÐí¶àͨÓòÎÊý£¬Ò²»á¸ºÔð³É¹¦ÂʵÈÖ¸±êµÄ¼à¿Ø£¬»¹ÓÐÒì³£Éϱ¨£¬ÎÒÃÇÐèÒªÔÚ²¶»ñµ½¹Ø¼üÒ쳣ʱ½«Æä¶ÑÕ»ºÍ»·¾³ÐÅÏ¢Éϱ¨µ½·þÎñÆ÷¡£ÕâЩ¹¦Äܲ»Ì«¿ÉÄÜÁ¢¼´Ê¹ÓÃDartʵÏÖÒ»Ì׳öÀ´£¬ËùÒÔÎÒÃÇÐèҪʹÓÃDartÌṩµÄPlatform Channel¹¦ÄÜÀ´ÊµÏÖDart¡úJavaÖ®¼äµÄ»¥Ïàµ÷Óá£

ÒÔÍøÂçÇëÇóΪÀý£¬ÎÒÃÇÔÚDartÖж¨ÒåÒ»¸öMethodChannel¶ÔÏó£º

import 'dart:async';
import 'package:flutter/services.dart';
const MethodChannel _channel = const MethodChannel('com.sankuai.waimai/network');
Future<Map<String, dynamic>> post(String path,
[Map<String, dynamic> form]) async {
return _channel.invokeMethod("post", {'path': path,
'body': form}).then((result) {
return new Map<String, dynamic>.from(result);
}).catchError((_) => null);
}

È»ºóÔÚJava¶ËʵÏÖÏàͬÃû³ÆµÄMethodChannel£º

public class FlutterNetworkPlugin implements
MethodChannel.MethodCallHandler {
private static final String CHANNEL_NAME =
"com.sankuai.waimai/network";

@Override
public void onMethodCall(MethodCall methodCall,
final MethodChannel.Result result) {
switch (methodCall.method) {
case "post":
RetrofitManager.performRequest(post((String)
methodCall.argument("path"), (Map)
methodCall.argument("body")),
new DefaultSubscriber<Map>() {
@Override
public void onError(Throwable e) {
result.error(e.getClass().getCanonicalName(),
e.getMessage(), null);
}

@Override
public void onNext(Map stringBaseResponse) {
result.success(stringBaseResponse);
}
}, tag);
break;

default:
result.notImplemented();
break;
}
}
}

ÔÚFlutterÒ³ÃæÖÐ×¢²áºó£¬µ÷ÓÃpost·½·¨¾Í¿ÉÒÔµ÷ÓöÔÓ¦µÄJavaʵÏÖ£º

loadData: (callback) async {
Map<String, dynamic> data = await post("home/groups");
if (data == null) {
callback(false);
return;
}
_data = AllCategoryResponse.fromJson(data);
if (_data == null || _data.code != 0) {
callback(false);
return;
}
callback(true);
}),

SO¿â¼æÈÝÐÔ

Flutter¹Ù·½Ö»ÌṩÁËËÄÖÖCPU¼Ü¹¹µÄSO¿â£ºarmeabi-v7a¡¢arm64-v8a¡¢x86ºÍx86-64£¬ÆäÖÐx86ϵÁÐÖ»Ö§³ÖDebugģʽ£¬µ«ÊÇÍâÂôʹÓõĴóÁ¿SDK¶¼Ö»ÌṩÁËarmeabi¼Ü¹¹µÄ¿â¡£ËäÈ»ÎÒÃÇ¿ÉÒÔͨ¹ýÐÞ¸ÄÒýÇæsrc¸ùĿ¼ºÍthird_party/dartĿ¼ÏÂbuild/config/arm.gni£¬third_party/skiaĿ¼ÏµÄBUILD.gnµÈÅäÖÃÎļþÀ´±àÒë³öarmeabi°æ±¾µÄFlutterÒýÇæ£¬µ«ÊÇʵ¼ÊÉÏÊÐÃæÉϾø´ó²¿·ÖÉ豸¶¼ÒѾ­Ö§³Öarmeabi-v7a£¬ÆäÌṩµÄÓ²¼þ¼ÓËÙ¸¡µãÔËËãÖ¸Áî¿ÉÒÔ´ó´óÌá¸ßFlutterµÄÔËÐÐËÙ¶È£¬ÔڻҶȽ׶ÎÎÒÃÇ¿ÉÒÔÖ÷¶¯ÆÁ±Îµô²»Ö§³Öarmeabi-v7aµÄÉ豸£¬Ö±½ÓʹÓÃarmeabi-v7a°æ±¾µÄÒýÇæ¡£×öµ½ÕâµãÎÒÃÇÊ×ÏÈÐèÒªÐÞ¸ÄFlutterÌṩµÄÒýÇæ£¬ÔÚFlutter°²×°Ä¿Â¼ÏµÄbin/cache/artifacts/engineÏÂÓÐFlutterÏÂÔØµÄËùÓÐÆ½Ì¨µÄÒýÇæ£º

ÎÒÃÇÖ»ÐèÒªÐÞ¸Äandroid-arm¡¢android-arm-profileºÍandroid-arm-releaseϵÄflutter.jar£¬½«ÆäÖеÄlib/armeabi-v7a/libflutter.soÒÆ¶¯µ½lib/armeabi/libflutter.so¼´¿É£º

cd $FLUTTER_ROOT/bin/cache/artifacts/engine
for arch in android-arm android-arm-profile android-arm-release; do
pushd $arch
cp flutter.jar flutter-armeabi-v7a.jar # ±¸·Ý
unzip flutter.jar lib/armeabi-v7a/libflutter.so
mv lib/armeabi-v7a lib/armeabi
zip -d flutter.jar lib/armeabi-v7a/libflutter.so
zip flutter.jar lib/armeabi/libflutter.so
popd
done

ÕâÑùÔÚ´ò°üºóFlutterµÄSO¿â¾Í»á´òµ½APKµÄlib/armeabiĿ¼ÖС£ÔÚÔËÐÐʱÈç¹ûÉ豸²»Ö§³Öarmeabi-v7a¿ÉÄÜ»á±ÀÀ££¬ËùÒÔÎÒÃÇÐèÒªÖ÷¶¯Ê¶±ð²¢ÆÁ±ÎµôÕâÀàÉ豸£¬ÔÚAndroidÉÏÅжÏÉ豸ÊÇ·ñÖ§³Öarmeabi-v7aÒ²ºÜ¼òµ¥£º

public static boolean isARMv7Compatible() {
try {
if (SDK_INT >= LOLLIPOP) {
for (String abi : Build.SUPPORTED_32_BIT_ABIS) {
if (abi.equals("armeabi-v7a")) {
return true;
}
}
} else {
if (CPU_ABI.equals("armeabi-v7a") || CPU_ABI.equals("arm64-v8a")) {
return true;
}
}
} catch (Throwable e) {
L.wtf(e);
}
return false;
}

»Ò¶ÈºÍ×Ô¶¯½µ¼¶²ßÂÔ

HornÊÇÒ»¸öÃÀÍÅÄÚ²¿µÄ¿çƽ̨ÅäÖÃÏ·¢SDK£¬Ê¹ÓÃHorn¿ÉÒԺܷ½±ãµØÖ¸¶¨»Ò¶È¿ª¹Ø£º

ÔÚÌõ¼þÅäÖÃÒ³Ãæ¶¨ÒåһϵÁÐÌõ¼þ£¬È»ºóÔÚ²ÎÊýÅäÖÃÒ³ÃæÌí¼ÓеÄ×Ö¶Îflutter¼´¿É£º

ÒòΪÔÚ¿Í»§¶Ë×öÁËABI¶µµ×²ßÂÔ£¬ËùÒÔÕâÀﶨÒåµÄABI¹æÔò²¢Ã»ÓÐÆôÓá£

FlutterĿǰÈÔÈ»´¦ÓÚBeta½×¶Î£¬»Ò¶È¹ý³ÌÖÐÄÑÃâ·¢Éú±ÀÀ£ÏÖÏ󣬹۲쵽±ÀÀ£ºóÔÙÕë¶Ô»úÐÍ»òÕßÉ豸IDÀ´×ö½µ¼¶ËäÈ»¿ÉÒÔ¾¡Á¿½µµÍÓ°Ï죬µ«ÊÇÎÒÃÇ¿ÉÒÔ×öµ½¸üѸËÙ¡£ÍâÂôµÄCrash²É¼¯SDKͬʱҲ֧³ÖJNI CrashµÄÊÕ¼¯£¬ÎÒÃÇרÃÅΪFlutter×¢²áÁ˱ÀÀ£¼àÌýÆ÷£¬Ò»µ©²É¼¯µ½FlutterÏà¹ØµÄJNI Crash¾ÍÁ¢¼´Í£Ö¹¸ÃÉ豸µÄFlutter¹¦ÄÜ£¬Æô¶¯Flutter֮ǰ»áÏÈÅжÏFLUTTER_NATIVE_CRASH_FLAGÎļþÊÇ·ñ´æÔÚ£¬Èç¹û´æÔÚÔò±íʾ¸ÃÉ豸·¢Éú¹ýFlutterÏà¹ØµÄ±ÀÀ££¬ºÜÓпÉÄÜÊDz»¼æÈݵ¼ÖµÄÎÊÌ⣬µ±Ç°°æ±¾ÖÜÆÚÄÚÔÚ¸ÃÉ豸ÉϾͲ»ÔÙʹÓÃFlutter¹¦ÄÜ¡£

³ýÁ˱ÀÀ£ÒÔÍ⣬FlutterÒ³ÃæÖеÄDart´úÂëÒ²¿ÉÄÜ·¢ÉúÒì³££¬ÀýÈç·þÎñÆ÷Ï·¢Êý¾Ý¸ñʽ´íÎóµ¼Ö½âÎöʧ°ÜµÈµÈ£¬DartÒ²ÌṩÁËÈ«¾ÖµÄÒì³£²¶»ñ¹¦ÄÜ£º

import 'package:wm_app/plugins/wm_metrics.dart';

void main() {
runZoned(() => runApp(WaimaiApp()), onError: (Object obj, StackTrace stack) {
uploadException("$obj\n$stack");
});
}

ÕâÑùÎÒÃǾͿÉÒÔʵÏÖÈ«·½Î»µÄÒì³£¼à¿ØºÍÍêÉÆµÄ½µ¼¶²ßÂÔ£¬×î´ó³Ì¶È¼õÉÙ»Ò¶Èʱ¿ÉÄܶÔÓû§´øÀ´µÄÓ°Ïì¡£

·ÖÎö±ÀÀ£¶ÑÕ»ºÍÒì³£Êý¾Ý

FlutterµÄÒýÇæ²¿·ÖÈ«²¿Ê¹ÓÃC/C++ʵÏÖ£¬ÎªÁ˼õÉÙ°ü´óС£¬ËùÓеÄSO¿âÔÚ·¢²¼Ê±¶¼»áÈ¥³ý·ûºÅ±íÐÅÏ¢¡£ºÍÆäËûµÄJNI±ÀÀ£¶ÑÕ»Ò»Ñù£¬ÎÒÃÇÉϱ¨µÄ¶ÑÕ»ÐÅÏ¢ÖÐÖ»ÄÜ¿´µ½ÄÚ´æµØÖ·Æ«ÒÆÁ¿µÈÐÅÏ¢£º

*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Build fingerprint: 'Rock/odin/odin:7.1.1/NMF26F/1527007828:user/dev-keys'
Revision: '0'
Author: collect by 'libunwind'
ABI: 'arm64-v8a'
pid: 28937, tid: 29314, name: 1.ui >>> com.sankuai.meituan.takeoutnew <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0

backtrace:
r0 00000000 r1 ffffffff r2 c0e7cb2c r3 c15affcc
r4 c15aff88 r5 c0e7cb2c r6 c15aff90 r7 bf567800
r8 c0e7cc58 r9 00000000 sl c15aff0c fp 00000001
ip 80000000 sp c0e7cb28 lr c11a03f9 pc c1254088 cpsr 200c0030
#00 pc 002d7088 /data/app/com.sankuai.meituan.takeoutnew-1/lib/arm/libflutter.so
#01 pc 002d5a23 /data/app/com.sankuai.meituan.takeoutnew-1/lib/arm/libflutter.so
#02 pc 002d95b5 /data/app/com.sankuai.meituan.takeoutnew-1/lib/arm/libflutter.so
#03 pc 002d9f33 /data/app/com.sankuai.meituan.takeoutnew-1/lib/arm/libflutter.so
#04 pc 00068e6d /data/app/com.sankuai.meituan.takeoutnew-1/lib/arm/libflutter.so
#05 pc 00067da5 /data/app/com.sankuai.meituan.takeoutnew-1/lib/arm/libflutter.so
#06 pc 00067d5f /data/app/com.sankuai.meituan.takeoutnew-1/lib/arm/libflutter.so
#07 pc 003b1877 /data/app/com.sankuai.meituan.takeoutnew-1/lib/arm/libflutter.so
#08 pc 003b1db5 /data/app/com.sankuai.meituan.takeoutnew-1/lib/arm/libflutter.so
#09 pc 0000241c /data/data/com.sankuai.meituan.takeoutnew/app_flutter
/vm_snapshot_instr

µ¥´¿ÕâЩÐÅÏ¢ºÜÄѶ¨Î»ÎÊÌ⣬ËùÒÔÎÒÃÇÐèҪʹÓÃNDKÌṩµÄndk-stackÀ´½âÎö³ö¾ßÌåµÄ´úÂëλÖãº

ndk-stack -sym PATH [-dump PATH]
Symbolizes the stack trace from an Android native crash.
-sym PATH sets the root directory for symbols
-dump PATH sets the file containing the crash dump (default stdin)

Èç¹ûʹÓÃÁ˶¨ÖƹýµÄÒýÇæ£¬±ØÐëʹÓÃengine/src/out/android-releaseϱàÒë³öµÄlibflutter.soÎļþ¡£Ò»°ãÇé¿öÏÂÎÒÃÇʹÓõÄÊǹٷ½°æ±¾µÄÒýÇæ£¬¿ÉÒÔÔÚflutter_infraÒ³ÃæÖ±½ÓÏÂÔØ´øÓзûºÅ±íµÄSOÎļþ£¬¸ù¾Ý´ò°üʱʹÓõÄFlutter¹¤¾ß°æ±¾ÏÂÔØ¶ÔÓ¦µÄÎļþ¼´¿É¡£±ÈÈç0.4.4 beta°æ±¾£º

$ flutter --version # versionÃüÁî¿ÉÒÔ¿´µ½Engine¶ÔÓ¦µÄ°æ±¾ 06afdfe54e
Flutter 0.4.4 ? channel beta ? https://github.com/flutter/flutter.git
Framework ? revision f9bb4289e9 (5 weeks ago) ? 2018-05-11 21:44:54 -0700
Engine ? revision 06afdfe54e
Tools ? Dart 2.0.0-dev.54.0.flutter-46ab040e58
$ cat flutter/bin/internal/engine.version # flutter°²×°Ä¿Â¼ÏµÄengine.versionÎļþÒ²¿ÉÒÔ¿´µ½ÍêÕûµÄ°æ±¾ÐÅÏ¢ 06afdfe54ebef9168a90ca00a6721c2d36e6aafa
06afdfe54ebef9168a90ca00a6721c2d36e6aafa

Äõ½ÒýÇæ°æ±¾ºÅºóÔÚ https://console.cloud.google.com/storage
/browser/flutter_infra/flutter/06afdfe54e
bef9168a90ca00a6721c2d36e6aafa/ ¿´µ½¸Ã°æ±¾¶ÔÓ¦µÄËùÓй¹½¨²úÎÏÂÔØandroid-arm-release¡¢android-arm64-releaseºÍandroid-x86Ŀ¼ÏµÄsymbols.zip£¬²¢´æ·Åµ½¶ÔӦĿ¼£º

Ö´ÐÐndk-stack¼´¿É¿´µ½Êµ¼Ê·¢Éú±ÀÀ£µÄ´úÂëºÍ¾ßÌåÐÐÊýÐÅÏ¢£º

ndk-stack -sym flutter-production-syms/06afdfe54ebef9168a90ca00a6721c
2d36e6aafa/armeabi-v7a -dump flutter_jni_crash.txt
********** Crash dump: **********
Build fingerprint: 'Rock/odin/odin:7.1.1/NMF26F/1527007828:user/dev-keys'
pid: 28937, tid: 29314, name: 1.ui >>> com.sankuai.meituan.takeoutnew <<< signal 11
(SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0
Stack frame #00 pc 002d7088 /data/app/com.sankuai.
meituan.takeoutnew-1/lib/arm/libflutter.so:
Routine minikin::WordBreaker::setText(unsigned
short const*, unsigned int)
at/b/build/slave/Linux_Engine/build/src
/out/android_release /../../flutter/third_party/txt/src/minikin/WordBreaker.
cpp:55 Stack frame #01 pc 002d5a23 /data/app/com.sankuai.meituan.
takeoutnew-1/lib/arm/libflutter.so: Routine minikin::LineBreaker::setText() at /b/build/slave/Linux_Engine/build/src/out/
android_release/../../flutter/third_party/txt/src
/minikin/LineBreaker.cpp:74 Stack frame #02 pc 002d95b5 /data/app/com.sankuai.meituan.
takeoutnew-1/lib/arm/libflutter.so: Routine txt::Paragraph::ComputeLineBreaks() at /b/build/slave/Linux_Engine/build/src/out
/android_release/../../flutter/third_party/txt/src/txt
/paragraph.cc:273 Stack frame #03 pc 002d9f33 /data/app/com.sankuai.meituan.
takeoutnew-1/lib/arm/libflutter.so: Routine txt::Paragraph::Layout(double, bool) at /b/build/slave/Linux_Engine/build/src/out/
android_release/../../flutter/third_party/txt/src/txt/
paragraph.cc:428 Stack frame #04 pc 00068e6d /data/app/com.sankuai.meituan
.takeoutnew-1/lib/arm/libflutter.so:
Routine blink::ParagraphImplTxt::layout(double)
at /b/build/slave/Linux_Engine/build/src/out/
android_release/../../flutter/lib/ui/text
/paragraph_impl_txt.
cc:54 Stack frame #05 pc 00067da5 /data/app/
com.sankuai.meituan.takeoutnew-1
/lib/arm/libflutter.so: Routine tonic::
DartDispatcher<tonic::IndicesHolder<0u>,
void (blink::Paragraph::*)(double)>::Dispatch(void
(blink::Paragraph::*)(double)) at /b/build/slave
/Linux_Engine/build/src/out/android_release
/../../topaz/lib/tonic/dart_args.h:150
Stack frame #06 pc 00067d5f /data/app/com.sankuai.
meituan.takeoutnew-1/lib/arm/libflutter.so:
Routine void tonic::
DartCall<void (blink::Paragraph::*)(double)>
(void (blink::Paragraph::*)(double),
_Dart_NativeArguments*)
at /b/build/slave/Linux_Engine/build/src/out/
android_release/../../topaz/lib/tonic/dart_args.h:198
Stack frame #07 pc 003b1877 /data/app/com.sankuai
.meituan.takeoutnew-1/lib/arm/libflutter.so:
Routine dart::NativeEntry::AutoScopeNative
CallWrapperNoStackCheck(_Dart_NativeArguments*, void (*)(_Dart_NativeArguments*))
at /b/build/slave/Linux_Engine/build/src/out
/android_release/../../third_party/dart/runtime/vm
/native_entry.cc:198 Stack frame #08 pc 003b1db5 /data/app/com.sankuai.meituan.
takeoutnew-1/lib/arm/libflutter.so: Routine dart::
NativeEntry::LinkNativeCall(_Dart_NativeArguments*) at /b/build/slave/Linux_Engine/build/src/out/
android_release/../../third_party/dart/runtime/vm
/native_entry.cc:348 Stack frame #09 pc 0000241c /data/data/com.sankuai.meituan.takeoutnew/app_flutter
/vm_snapshot_instr

DartÒì³£Ôò±È½Ï¼òµ¥£¬Ä¬ÈÏÇé¿öÏÂDart´úÂëÔÚ±àÒë³É»úÆ÷Âëʱ²¢Ã»ÓÐÈ¥³ý·ûºÅ±íÐÅÏ¢£¬ËùÒÔDartµÄÒì³£¶ÑÕ»±¾Éí¾Í¿ÉÒÔ±êÊ¶ÕæÊµ·¢ÉúÒì³£µÄ´úÂëÎļþºÍÐÐÊýÐÅÏ¢£º

FlutterException: type '_InternalLinkedHashMap<dynamic, dynamic>'
is not a subtype of type 'num' in type cast
#0 _$CategoryGroupFromJson (package:wm_app/lib/all_category/model
/category_model.g.dart:29) #1 new CategoryGroup.fromJson (package:wm_app/all_category/model/category_model.
dart:51) #2 _$CategoryListDataFromJson.<anonymous closure> (package:wm_app/lib/all_category/
model/category_model.g.dart:5)
#3 MappedListIterable.elementAt (dart:_internal/iterable.dart:414)
#4 ListIterable.toList (dart:_internal/iterable.
dart:219) #5 _$CategoryListDataFromJson (package:wm_app/lib/all_category/model
/category_model.g.dart:6)
#6 new CategoryListData.fromJson (package:wm_app/all_category/model/category_model.
dart:19) #7 _$AllCategoryResponseFromJson (package:wm_app/lib/all_category/model
/category_model.g.dart:19)
#8 new AllCategoryResponse.fromJson (package:wm_app/all_category/model/category_model.
dart:29) #9 AllCategoryPage.build.<anonymous closure> (package:wm_app/all_category/category_page.dart:46)
<asynchronous suspension>
#10 _WaimaiLoadingState.build (package:wm_app/
all_category/widgets/progressive_loading_page.dart:51)
#11 StatefulElement.build (package:flutter/src/widgets/framework.dart:3730)
#12 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3642)
#13 Element.rebuild (package:flutter/src/widgets/framework.dart:3495)
#14 BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2242)
#15 _WidgetsFlutterBinding&BindingBase&GestureBinding&
ServicesBinding&SchedulerBinding&PaintingBinding&
RendererBinding&WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:626)
#16 _WidgetsFlutterBinding&BindingBase&GestureBinding&
ServicesBinding&SchedulerBinding&PaintingBinding&
RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:208)
#17 _WidgetsFlutterBinding&BindingBase&GestureBinding&
ServicesBinding&SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:990)
#18 _WidgetsFlutterBinding&BindingBase&GestureBinding
&ServicesBinding&SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:930)
#19 _WidgetsFlutterBinding&BindingBase&GestureBinding&
ServicesBinding&SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:842)
#20 _rootRun (dart:async/zone.dart:1126)
#21 _CustomZone.run (dart:async/zone.dart:1023)
#22 _CustomZone.runGuarded (dart:async/zone.dart:925)
#23 _invoke (dart:ui/hooks.dart:122)
#24 _drawFrame (dart:ui/hooks.dart:109)

FlutterºÍÔ­ÉúÐÔÄܶԱÈ

ËäȻʹÓÃÔ­ÉúʵÏÖ£¨×󣩺ÍFlutterʵÏÖ£¨ÓÒ£©µÄȫƷÀàÒ³ÃæÔÚʵ¼ÊʹÓùý³ÌÖм¸ºõ·Ö±æ²»³öÀ´£º

µ«ÊÇÎÒÃÇ»¹ÐèÒªÔÚÐÔÄÜ·½ÃæÓÐÒ»¸ö±È½ÏÃ÷È·µÄÊý¾Ý¶Ô±È¡£

ÎÒÃÇ×î¹ØÐĵÄÁ½¸öÒ³ÃæÐÔÄÜÖ¸±ê¾ÍÊÇÒ³Ãæ¼ÓÔØÊ±¼äºÍÒ³ÃæäÖȾËÙ¶È¡£²âÊÔÒ³Ãæ¼ÓÔØËÙ¶È¿ÉÒÔÖ±½ÓʹÓÃÃÀÍÅÄÚ²¿µÄMetricsÐÔÄܲâÊÔ¹¤¾ß£¬ÎÒÃǽ«Ò³ÃæActivity¶ÔÏó´´½¨×÷ÎªÒ³Ãæ¼ÓÔØµÄ¿ªÊ¼Ê±¼ä£¬Ò³ÃæAPIÊý¾Ý·µ»Ø×÷ÎªÒ³Ãæ¼ÓÔØ½áÊøÊ±¼ä¡£´ÓÁ½¸öʵÏÖµÄÒ³Ãæ·Ö±ðÆô¶¯400¶à´ÎµÄÊý¾ÝÖпÉÒÔ¿´µ½£¬Ô­ÉúʵÏÖ£¨AllCategoryActivity£©µÄ¼ÓÔØÊ±¼äÖÐλÊýΪ210ms£¬FlutterʵÏÖ£¨FlutterCategoryActivity£©µÄ¼ÓÔØÊ±¼äÖÐλÊýΪ231ms¡£¿¼Âǵ½Ä¿Ç°ÎÒÃÇ»¹Ã»ÓÐÕë¶ÔFlutterView×ö»º´æºÍÖØÓã¬FlutterViewÿ´Î´´½¨¶¼ÐèÒª³õʼ»¯Õû¸öFlutter»·¾³²¢¼ÓÔØÏà¹Ø´úÂ룬¶à³öµÄ20ms»¹ÔÚÔ¤ÆÚ·¶Î§ÄÚ£º

ÒòΪFlutterµÄUIÂß¼­ºÍ»æÖÆ´úÂë¶¼²»ÔÚÖ÷Ïß³ÌÖ´ÐУ¬MetricsÔ­ÓеÄFPS¹¦ÄÜÎÞ·¨Í³¼Æµ½FlutterÒ³ÃæµÄÕæÊµÇé¿ö£¬ÎÒÃÇÐèÒªÓÃÌØÊâ·½·¨À´¶Ô±ÈÁ½ÖÖʵÏÖµÄäÖȾЧÂÊ¡£AndroidÔ­ÉúʵÏֵĽçÃæäÖȾºÄʱʹÓÃϵͳÌṩµÄFrameMetrics½Ó¿Ú½øÐÐ¼à¿Ø£º

public class AllCategoryActivity extends WmBaseActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
getWindow().addOnFrameMetricsAvailableListener(new Window.OnFrameMetricsAvailableListener() {
List<Integer> frameDurations = new ArrayList<>(100);
@Override
public void onFrameMetricsAvailable(Window window, FrameMetrics frameMetrics, int dropCountSinceLastInvocation) {
frameDurations.add((int) (frameMetrics.getMetric(TOTAL_DURATION) / 1000000));
if (frameDurations.size() == 100) {
getWindow().removeOnFrameMetricsAvailableListener
(this);
L.w("AllCategory", Arrays.toString(frameDurations.toArray()));
}
}
}, new Handler(Looper.getMainLooper()));
}
super.onCreate(savedInstanceState);
// ...
}
}

FlutterÔÚFramework²ãÖ»ÄÜÈ¡µ½Ã¿Ö¡ÖÐUI²Ù×÷µÄCPUºÄʱ£¬GPU²Ù×÷¶¼ÔÚFlutterÒýÇæÄÚ²¿ÊµÏÖ£¬ËùÒÔÐèÒªÐÞ¸ÄÒýÇæÀ´¼à¿ØÍêÕûµÄäÖȾºÄʱ£¬ÔÚFlutterÒýÇæÄ¿Â¼ÏµÄsrc/flutter/shell/common/rasterizer.ccÎļþÖÐÌí¼Ó£º

void Rasterizer::DoDraw(std::unique_ptr<flow::LayerTree> layer_tree) {
if (!layer_tree || !surface_) {
return;
}

if (DrawToSurface(*layer_tree)) {
last_layer_tree_ = std::move(layer_tree);
#if defined(OS_ANDROID)
if (compositor_context_->frame_count().count() == 101) {
std::ostringstream os;
os << "[";
const std::vector<TimeDelta> &engine_laps = compositor_context_->engine_time().Laps();
const std::vector<TimeDelta> &frame_laps = compositor_context_->frame_time().Laps();
size_t i = 1;
for (auto engine_iter = engine_laps.begin() + 1, frame_iter = frame_laps.begin() + 1;
i < 101 && engine_iter != engine_laps.end(); i++, engine_iter++, frame_iter++) {
os << (*engine_iter + *frame_iter).ToMilliseconds() << ",";
}
os << "]";
__android_log_write(ANDROID_LOG_WARN, "AllCategory", os.str().c_str());
}
#endif
}
}

¼´¿ÉµÃµ½Ã¿Ö¡»æÖÆÊ±ÕæÕýÏûºÄµÄʱ¼ä¡£²âÊÔʱÎÒÃǽ«Á½ÖÖʵÏÖµÄÒ³Ãæ·Ö±ð´ò¿ª100´Î£¬Ã¿´Î´ò¿ªºóÖ´ÐÐÁ½´Î¹ö¶¯²Ù×÷£¬Ê¹Æä»æÖÆ100Ö¡£¬½«Õâ100Ö¡µÄÿ֡ºÄʱ¼Ç¼ÏÂÀ´£º

for (( i = 0; i < 100; i++ )); do
openWMPage allcategory
sleep 1
adb shell input swipe 500 1000 500 300 900
adb shell input swipe 500 1000 500 300 900
adb shell input keyevent 4
done

½«²âÊÔ½á¹ûµÄ100´ÎÆô¶¯ÖÐÿ֡ºÄʱȡƽ¾ù‚Ž£¬µÃµ½Ã¿Ö¡Æ½¾ùºÄʱÇé¿ö£¨ºá×ø±êÖáΪ֡ÐòÁУ¬×Ý×ø±êÖáΪÿ֡ºÄʱ£¬µ¥Î»ÎªºÁÃ룩£º

AndroidÔ­ÉúʵÏÖºÍFlutter°æ±¾¶¼»áÔÚÒ³Ãæ´ò¿ªµÄǰ5Ö¡³¬¹ý16ms£¬¸Õ´ò¿ªÒ³ÃæÊ±Ô­ÉúʵÏÖÐèÒª´´½¨´óÁ¿View£¬FlutterÒ²ÐèÒª´´½¨´óÁ¿Widget£¬ºóÐøÖ¡ÖпÉÒÔÖØÓô󲿷ֿؼþºÍäÖȾ½Úµã£¨Ô­ÉúµÄRenderNodeºÍFlutterµÄRenderObject£©£¬ËùÒÔÆô¶¯Ê±µÄ²¼¾ÖºÍäÖȾ²Ù×÷¶¼ÊÇ×îºÄʱµÄ¡£

10000Ö¡£¨100´Î¡Á100֡ÿ´Î£©ÖÐAndroidÔ­Éú×ÜÆ½¾ù‚ŽÎª10.21ms£¬Flutter×ÜÆ½¾ù‚ŽÎª12.28ms£¬AndroidÔ­ÉúʵÏÖ×ܶªÖ¡Êý851Ö¡8.51%£¬Flutter×ܶªÖ¡987Ö¡9.87%¡£ÔÚÔ­ÉúʵÏֵĴ¥Ãþʼþ´¦ÀíºÍ¹ý¶È»æÖƳä·ÖÓÅ»¯µÄǰÌáÏ£¬FlutterÍêÈ«¿ÉÒÔæÇÃÀÔ­ÉúµÄÐÔÄÜ¡£

×ܽá

FlutterĿǰÈÔ´¦ÓÚÔçÆÚ½×¶Î£¬Ò²»¹Ã»Óз¢²¼ÕýʽµÄRelease°æ±¾£¬²»¹ýÎÒÃÇ¿´µ½FlutterÍŶÓÒ»Ö±ÔÚΪÕâһĿ±ê¶øÅ¬Á¦¡£ËäÈ»FlutterµÄ¿ª·¢Éú̬²»ÈçAndroidºÍiOSÔ­ÉúÓ¦ÓÃÄÇô³ÉÊ죬Ðí¶à³£Óõĸ´Ôӿؼþ»¹ÐèÒª×Ô¼ºÊµÏÖ£¬ÓеÄÉõÖÁ»á±È½ÏÀ§ÄÑ£¨±ÈÈç¹Ù·½ÉÐδÌṩµÄListView.scrollTo(index)¹¦ÄÜ£©£¬µ«ÊÇÔÚ¸ßÐÔÄÜºÍ¿çÆ½Ì¨·½ÃæFlutterÔÚÖÚ¶àUI¿ò¼ÜÖл¹ÊÇÓкܴóÓÅÊÆµÄ¡£

¿ª·¢FlutterÓ¦ÓÃÖ»ÄÜʹÓÃDartÓïÑÔ£¬Dart±¾Éí¼ÈÓо²Ì¬ÓïÑÔµÄÌØÐÔ£¬Ò²Ö§³Ö¶¯Ì¬ÓïÑԵIJ¿·ÖÌØÐÔ£¬¶ÔÓÚJavaºÍJavaScript¿ª·¢ÕßÀ´ËµÃż÷¶¼²»¸ß£¬3-5Ìì¿ÉÒÔ¿ìËÙÉÏÊÖ£¬´óÔ¼1-2ÖÜ¿ÉÒÔÊìÁ·ÕÆÎÕ¡£ÔÚ¿ª·¢È«Æ·ÀàÒ³ÃæµÄFlutter°æ±¾Ê±ÎÒÃÇÒ²Éî¿ÌÌå»áµ½ÁËDartÓïÑÔµÄ÷ÈÁ¦£¬DartµÄÓïÑÔÌØÐÔʹµÃFlutterµÄ½çÃæ¹¹½¨¹ý³ÌÒ²±ÈAndroidÔ­ÉúµÄXML+JAVA¸üÖ±¹Û£¬´úÂëÁ¿Ò²´ÓÔ­À´µÄ900¶àÐмõÉÙµ½500¶àÐУ¨ÅųýµôÒýÓõĹ«¹²×é¼þ£©¡£FlutterÒ³Ãæ¼¯³Éµ½AppºóAPKÌå»ýÖÁÉÙ»áÔö¼Ó5.5MB£¬ÆäÖаüÀ¨3.3MBµÄSO¿âÎļþºÍ2.2MBµÄICUÊý¾ÝÎļþ£¬´ËÍâÒµÎñ´úÂë1300ÐбàÒë²úÎïµÄ´óСÓÐ2MB×óÓÒ¡£

Flutter±¾ÉíµÄÌØÐÔÊʺÏ×·ÇóiOSºÍAndroid¿çƽ̨µÄÒ»ÖÂÌåÑ飬׷Çó¸ßÐÔÄܵÄUI½»»¥Ð§¹ûµÄ³¡¾°£¬²»ÊʺÏ×·Çó¶¯Ì¬»¯²¿ÊðµÄ³¡¾°¡£FlutterÔÚAndroidÉÏÒѾ­¿ÉÒÔʵÏÖ¶¯Ì¬»¯²¿Ê𣬵«ÊÇÓÉÓÚAppleµÄÏÞÖÆ£¬ÔÚiOSÉÏʵÏÖ¶¯Ì¬»¯²¿Êð·Ç³£À§ÄÑ£¬FlutterÍŶÓÒ²ÕýÔÚºÍApple»ý¼«¹µÍ¨¡£

ÃÀÍÅÍâÂô´óǰ¶ËÍŶӽ«À´Ò²»á¼ÌÐøÔÚ¸ü¶à³¡¾°ÏÂʹÓÃFlutterʵÏÖ£¬²¢ÇÒ½«Êµ¼ù¹ý³ÌÖз¢ÏÖºÍÐÞ¸´µÄÎÊÌâ»ý¼«·´À¡µ½¿ªÔ´ÉçÇø£¬°ïÖúFlutter¸üºÃµØ·¢Õ¹¡£

 
   
3508 ´Îä¯ÀÀ       28
Ïà¹ØÎÄÕÂ

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
Ïà¹ØÎĵµ

ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì