±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚ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¸üºÃµØ·¢Õ¹¡£
|