chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

怎么開發(fā)啟動框架plugin

谷歌開發(fā)者 ? 來源:BennuCTech ? 作者:BennuC ? 2022-06-24 16:28 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

本文原作者: BennuC原文發(fā)布于: BennuCTech

在移動端中啟動 Flutter 頁面會有短暫空白,雖然官方提供了引擎預(yù)熱機(jī)制,但是需要提前將所有頁面都進(jìn)行預(yù)熱,這樣開發(fā)成本較高,在研究了閑魚的 FlutterBoost 插件后,看看能不能自己實現(xiàn)一個簡單的快速啟動框架。

開發(fā)啟動框架 plugin

創(chuàng)建一個 Flutter Plugin 項目,并添加 git,然后編寫三端代碼:

Flutter 代碼首先是 Flutter 端的代碼

1. RouteManager

import'package:flutter/cupertino.dart';import 'package:flutter/material.dart';import 'package:flutter_boot/BasePage.dart';
class RouteManager{  factory RouteManager() => _getInstance();
  static RouteManager get instance => _getInstance();
  static RouteManager _instance;
  RouteManager._internal(){
  }
  static RouteManager _getInstance(){    if(_instance == null){      _instance = new RouteManager._internal();    }    return _instance;  }
  Map routes = Map();
  void registerRoute(String route, BasePage page){    routes[route] = page;  }
  RouteFactory getRouteFactory(){    return getRoute;  }
  MaterialPageRoute getRoute(RouteSettings settings){    if(routes.containsKey(settings.name)){      return MaterialPageRoute(builder: (BuildContext context) {        return routes[settings.name];      }, settings: settings);    }    else{      return MaterialPageRoute(builder: (BuildContext context) {        return PageNotFount();      });    }  }
  BasePage getPage(String name){    if(routes.containsKey(name)) {      return routes[name];    }    else{      return PageNotFount();    }  }}
class PageNotFount extends BasePage{
  @override  State createState() {    return _PageNotFount();  }
}
class _PageNotFount extends BaseState<PageNotFount>{
  @override  Widget buildImpl(BuildContext context) {    return Scaffold(      body: Center(        child: Text("page not found"),      ),    );  }}

它的作用就是管理路由,是一個單例,用一個 map 來維護(hù)路由映射。其中三個函數(shù)比較重要:
  • registerRoute: 注冊路由,一般在啟動時調(diào)用;
  • getRouteFactory: 返回 RouteFactory,將它賦值給 MaterialApponGenerateRoute 字段;
  • getPage: 通過 route 名稱返回頁面 widget。
這里 getRouteFactorygetPage 共用一個路由 map,所以不論是頁面內(nèi)切換還是頁面切換都保持統(tǒng)一。

2.BaseApp

import'dart:convert';
import 'package:flutter/cupertino.dart';import 'package:flutter/services.dart';import 'package:flutter_boot/RouteManager.dart';
abstract class BaseApp extends StatefulWidget{
  @override  State createState() {    registerRoutes();    return _BaseApp(build);  }
  Widget build(BuildContext context, Widget page);
  void registerRoutes();
}
class _BaseApp extends State<BaseApp>{
  Function buildImpl;  static const bootChannel = const BasicMessageChannel("startPage", StringCodec());  Widget curPage = RouteManager.instance.getPage("");
  _BaseApp(this.buildImpl){    bootChannel.setMessageHandler((message) async {      setState(() {        var json = jsonDecode(message);        var route = json["route"];        var page = RouteManager.instance.getPage(route);        page.args = json["params"];        curPage = page;      });      return "";    });  }
  @override  Widget build(BuildContext context) {    return buildImpl.call(context, curPage);  }
}

是一個抽象類,真正的 Flutter app 需要繼承它。主要是封裝了一個 BasicMessageChannel 用來與 Android/iOS 交互,并根據(jù)收到的消息處理頁面內(nèi)的切換,實現(xiàn)快速啟動。

繼承它的子類需要實現(xiàn) registerRoutes 函數(shù),在這里使用 RouteManagerregisterRoute 將每個頁面注冊一下即可。

3.BasePage
import'package:flutter/material.dart';
abstract class BasePage extends StatefulWidget{  dynamic args;}
abstract class BaseState<T extends BasePage> extends State<T>{  dynamic args;
  @override  Widget build(BuildContext context) {    if(ModalRoute.of(context).settings.arguments == null){      args = widget.args;    }    else{      args = ModalRoute.of(context).settings.arguments;    }    return buildImpl(context);  }
  Widget buildImpl(BuildContext context);}

同樣是抽象類,每個 Flutter 頁面都需要繼承它,它主要是處理兩種啟動方式傳過來的參數(shù),統(tǒng)一到 args 中,這樣子類就可以直接使用而不需要考慮是如何啟動的。

Android 代碼接下來是 plugin 中的 Android 的代碼

1.BootEngine

package com.bennu.flutter_boot
import android.app.Applicationimport io.flutter.embedding.engine.FlutterEngineimport io.flutter.embedding.engine.FlutterEngineCacheimport io.flutter.embedding.engine.dart.DartExecutorimport io.flutter.plugin.common.BasicMessageChannelimport io.flutter.plugin.common.StringCodec
object BootEngine {    public var flutterBoot : BasicMessageChannel? = null
    fun init(context: Application){        var flutterEngine = FlutterEngine(context)        flutterEngine.dartExecutor.executeDartEntrypoint(            DartExecutor.DartEntrypoint.createDefault()        )        FlutterEngineCache.getInstance().put("main", flutterEngine)
        flutterBoot = BasicMessageChannel(flutterEngine.dartExecutor.binaryMessenger, "startPage", StringCodec.INSTANCE)    }}
這個是單例,初始化并預(yù)熱 FlutterEngine,同時創(chuàng)建 BasicMessageChannel 用于后續(xù)交互。需要在 ApplicationonCreate 中調(diào)用它的 init 函數(shù)來初始化。 2. FlutterBootActivity
package com.bennu.flutter_boot
import android.content.ComponentNameimport android.content.Contextimport android.content.Intentimport android.os.Bundleimport android.os.PersistableBundleimport io.flutter.embedding.android.FlutterActivityimport org.json.JSONObject
class FlutterBootActivity : FlutterActivity() {
    companion object{        const val ROUTE_KEY = "flutter.route.key"
        fun build(context: Context, routeName : String, params : Map<String, String>?) : Intent{            var intent = withCachedEngine("main").build(context)            intent.component = ComponentName(context, FlutterBootActivity::class.java)            var json = JSONObject()            json.put("route", routeName)
            var paramsObj = JSONObject()            params?.let {                for(entry in it){                    paramsObj.put(entry.key, entry.value)                }            }            json.put("params", paramsObj)            intent.putExtra(ROUTE_KEY, json.toString())            return intent        }    }
    override fun onCreate(savedInstanceState: Bundle?) {        super.onCreate(savedInstanceState)    }
    override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {        super.onCreate(savedInstanceState, persistentState)    }
    override fun onResume() {        super.onResume()        var route = intent.getStringExtra(ROUTE_KEY)        BootEngine.flutterBoot?.send(route)    }
    override fun onDestroy() {        super.onDestroy()    }}

繼承 FlutterActivity,提供一個 build (context: Context, routeName: String, params: Map?) 函數(shù)來啟動,傳遞路由名稱和參數(shù)。在 onResume 的時候通過 BasicMessageChannel 將這兩個數(shù)據(jù) send 給 Flutter 處理。

iOS

iOS 與 Android 類似

1.FlutterBootEngine FlutterBootEngine.h
#ifndef FlutterBootEngine_h#define FlutterBootEngine_h
#import #import 
@interface FlutterBootEngine : NSObject
+ (nonnull instancetype)sharedInstance;
- (FlutterBasicMessageChannel *)channel;- (FlutterEngine *)engine;- (void)initEngine;@end
#endif /* FlutterBootEngine_h */FlutterBootEngine.m#import "FlutterBootEngine.h"#import 
@implementation FlutterBootEngine
static FlutterBootEngine * instance = nil;
FlutterEngine * engine = nil;FlutterBasicMessageChannel * channel = nil;
+(nonnull FlutterBootEngine *)sharedInstance{    if(instance == nil){        instance = [self.class new];    }    return instance;}
+(id)allocWithZone:(struct _NSZone *)zone{    if(instance == nil){        instance = [[super allocWithZone:zone]init];    }    return instance;}
- (id)copyWithZone:(NSZone *)zone{    return instance;}
- (FlutterEngine *)engine{    return engine;}
- (FlutterBasicMessageChannel *)channel{    return channel;}
- (void)initEngine{    engine = [[FlutterEngine alloc]initWithName:@"flutter engine"];    channel = [FlutterBasicMessageChannel messageChannelWithName:@"startPage" binaryMessenger:engine.binaryMessenger codec:[FlutterStringCodec sharedInstance]];    [engine run];}
@end

這也是一個單例,初始化并啟動 FlutterEngine,并創(chuàng)建一個 FlutterBasicMessageChannel 與 Flutter 交互。

需要在 iOS 項目的 AppDelegate 初始化時調(diào)用它的 initEngine 函數(shù)。

2. FlutterBootViewController

FlutterBootViewController.h
#ifndef FlutterBootViewController_h#define FlutterBootViewController_h
#import 
@interface FlutterBootViewController : FlutterViewController
- (nonnull instancetype)initWithRoute:(nonnull NSString*)route                       params:(nullable NSDictionary*)params;
@end
#endif /* FlutterBootViewController_h */FlutterBootViewController.m#import "FlutterBootViewController.h"#import "FlutterBootEngine.h"
@implementation FlutterBootViewController
NSString * mRoute = nil;NSDictionary * mParams = nil;
- (nonnull instancetype)initWithRoute:(nonnull NSString *)route params:(nullable NSDictionary *)params{    self = [super initWithEngine:FlutterBootEngine.sharedInstance.engine nibName:nil bundle:nil];    mRoute = route;    mParams = params;    return self;}
//viewDidAppear時機(jī)有點(diǎn)晚,會先顯示一下上一個頁面才更新到新頁面,所以換成viewWillAppear- (void)viewWillAppear:(BOOL)animated{    [super viewWillAppear:animated];    if(mParams == nil){        mParams = [[NSDictionary alloc]init];    }    NSDictionary * dict = @{@"route" : mRoute, @"params" : mParams};    NSData * jsonData = [NSJSONSerialization dataWithJSONObject:dict options:0 error:NULL];    NSString * str = [[NSString alloc]initWithData:jsonData encoding:NSUTF8StringEncoding];    NSLog(@"%@", str);    [FlutterBootEngine.sharedInstance.channel sendMessage:str];}
@end

同樣新增一個使用路由名和參數(shù)的構(gòu)造函數(shù),然后在 viewWillAppear 時通知 Flutter。

注意這里如果改成 viewDidAppear 時機(jī)有點(diǎn)晚,會先顯示一下上一個頁面才更新到新頁面,所以換成 viewWillAppear。

3. FlutterBoot.h
#ifndef FlutterBoot_h#define FlutterBoot_h
#import "FlutterBootEngine.h"#import "FlutterBootViewController.h"
#endif /* FlutterBoot_h */
這個是 swift 的橋接文件,通過它 swift 就可以使用我們上面定義的類。 這樣我們的 plugin 就開發(fā)完成了,可以發(fā)布到 pub 上。我這里是 push 到 git 倉庫中,通過 git 的方式依賴使用。

開發(fā) Flutter module

創(chuàng)建一個 Flutter module,然后引入我們的 plugin,在 pubspec.yaml 中:
dependencies:  flutter:    sdk: flutter  ...  flutter_boot:    git: https://gitee.com/chzphoenix/flutter-boot.git

然后我們開發(fā)兩個頁面用于測試。

1. FirstPage.dart
import 'package:flutter/material.dart';import 'package:flutter_boot/BasePage.dart';
class FirstPage extends BasePage{
  @override  State createState() {    return _FirstPage();  }}
class _FirstPage extends BaseState<FirstPage>{
  void _goClick() {    Navigator.of(context).pushNamed("second", arguments: {"key":"123"});  }
  @override  Widget buildImpl(BuildContext context) {    return Scaffold(      appBar: AppBar(        title: Text("Flutter Demo Home Page"),      ),      body: Center(        child: ...,      ),      floatingActionButton: FloatingActionButton(        onPressed: _goClick,        tooltip: 'Increment',        child: Icon(Icons.add),      ), // This trailing comma makes auto-formatting nicer for build methods.    );  }}

繼承 BasePageBaseState 即可,點(diǎn)擊按鈕可以跳轉(zhuǎn)到頁面 2。

2. SecondPage.dart

import 'package:flutter/cupertino.dart';import 'package:flutter/material.dart';import 'package:flutter_boot/BasePage.dart';
class SecondPage extends BasePage{
  @override  State createState() {    return _SecondPage();  }
}
class _SecondPage extends BaseState<SecondPage>{
  @override  Widget buildImpl(BuildContext context) {    return Scaffold(        appBar: AppBar(          title: Text("test"),        ),        body:Text("test:${args["key"]}")    );  }}

這個頁面獲取傳遞過來的參數(shù) key,并展示。

3. main.dart
import 'package:flutter/material.dart';import 'package:flutter_boot/BaseApp.dart';import 'package:flutter_boot/RouteManager.dart';
import 'FirstPage.dart';import 'SecondPage.dart';
void main() => runApp(MyApp());
class MyApp extends BaseApp {  @override  Widget build(BuildContext context, Widget page) {    return MaterialApp(      title: 'Flutter Demo',      theme: ThemeData(        primarySwatch: Colors.blue,      ),      home: page,      onGenerateRoute: RouteManager.instance.getRouteFactory(),    );  }
  @override  void registerRoutes() {    RouteManager.instance.registerRoute("main", FirstPage());    RouteManager.instance.registerRoute("second", SecondPage());  }}

入口繼承 BaseApp,并實現(xiàn) registerRoutes,注冊這兩個頁面。

注意這里的 onGenerateRoute 使用 RouteManager.instance.getRouteFactory (),這樣一次注冊就可以了,不必自己去實現(xiàn)。

引入移動端

Module 開發(fā)完后,就可以在 Android/iOS 上使用了。

Android 端

在 Android 上比較簡單,在 Android 項目中引入剛才的 module 即可,然后需要在 Android 的主 module (一般是 app) 的 build.gradle 中引入 module 和 plugin,如下:
dependencies{    implementation fileTree(dir: "libs", include: ["*.jar"])    ...    implementation project(path: ':flutter')  //module    provided rootProject.findProject(":flutter_boot") //plugin}

注意 plugin 的名稱是之前在 module 中的 pubspec.yaml 定義的。

然后就可以在 Android 中使用了,首先要初始化,如下:

importandroid.app.Applicationimport com.bennu.flutter_boot.BootEngine
public class App : Application() {
    override fun onCreate() {        super.onCreate()        BootEngine.init(this)        ...    }}

然后合適的時候啟動 Flutter 頁面即可,啟動代碼如下:
button.setOnClickListener {    startActivity(FlutterBootActivity.build(this, "main", null))}button2.setOnClickListener {    var params = HashMap()    params.put("key", "123")    startActivity(FlutterBootActivity.build(this, "second", params))}

一個啟動無參的頁面 1,一個啟動有參的頁面 2。 測試可以發(fā)現(xiàn)無論打開哪個頁面都非??欤瑤缀鯖]有加載時間。這樣就實現(xiàn)了快速啟動。

iOS 端

iOS 端稍微復(fù)雜一些,需要先了解一下 iOS 如何加入 Flutter。

我選用的是 framework 的方式引入,所以在 Flutter module 項目下通過命令編譯打包 framework。

flutterbuildios-framework--xcframework--no-universal--output=./Flutter/
然后引入到 iOS 項目中,與上一篇文章不同的是,因為這個 module 中加入了 plugin,所以 framework 產(chǎn)物是四個:
  • App.xcframework
  • flutter_boot.xcframework (這個就是我們的 plugin 中的 iOS 部分)
  • Flutter.xcframework
  • FlutterPluginRegistrant.xcframework

這四個都需要引入到 iOS 項目中。

然后 AppDelegate 需要繼承 FlutterAppDelegate (如果無法繼承,則需要處理每個生命周期,您可以查看: https://flutter.cn/docs/development/add-to-app/ios/add-flutter-screen?tab=engine-swift-tab)。

然后在 AppDelegate 中初始化,如下:
importUIKitimport Flutterimport flutter_boot
@UIApplicationMainclass AppDelegate: FlutterAppDelegate {
    override func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {        FlutterBootEngine.sharedInstance().initEngine()        return true    }
    override func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {        return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)    }}
然后在合適的地方啟動 Flutter 頁面即可,如下:
@objcfuncshowMain(){    let flutterViewController =        FlutterBootViewController(route: "main", params: nil)    present(flutterViewController, animated: true, completion: nil)  }
@objc func showSecond() {    let params : Dictionary<String, String> = ["key" : "123"]    let flutterViewController =        FlutterBootViewController(route: "second", params: params)    present(flutterViewController, animated: true, completion: nil)  }

同樣分別打開兩個頁面,可以看到啟動幾乎沒有加載時間,同時參數(shù)也正確傳遞。

原文標(biāo)題:Flutter 混合開發(fā): 開發(fā)一個簡單的快速啟動框架 | 開發(fā)者說·DTalk

文章出處:【微信公眾號:谷歌開發(fā)者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。



審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Android
    +關(guān)注

    關(guān)注

    12

    文章

    4021

    瀏覽量

    133831
  • 框架
    +關(guān)注

    關(guān)注

    0

    文章

    404

    瀏覽量

    18397
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4965

    瀏覽量

    73844
  • Plugin
    +關(guān)注

    關(guān)注

    0

    文章

    9

    瀏覽量

    3167

原文標(biāo)題:Flutter 混合開發(fā): 開發(fā)一個簡單的快速啟動框架 | 開發(fā)者說·DTalk

文章出處:【微信號:Google_Developers,微信公眾號:谷歌開發(fā)者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    從網(wǎng)絡(luò)接口到 DMA,一套面向工程師的 FPGA 網(wǎng)絡(luò)開發(fā)框架

    快速開發(fā) FPGA 加速網(wǎng)絡(luò)應(yīng)用的開源框架,是連接?高速網(wǎng)絡(luò)接口、FPGA 邏輯與主機(jī)處理器?的工程級利器。 什么是 Liberouter NDK? NDK 全稱 Network
    的頭像 發(fā)表于 02-12 11:28 ?260次閱讀
    從網(wǎng)絡(luò)接口到 DMA,一套面向工程師的 FPGA 網(wǎng)絡(luò)<b class='flag-5'>開發(fā)</b><b class='flag-5'>框架</b>

    LuatOS框架的使用(上)

    在資源受限的物聯(lián)網(wǎng)終端設(shè)備中,如何實現(xiàn)快速開發(fā)與穩(wěn)定運(yùn)行是關(guān)鍵挑戰(zhàn)。LuatOS框架通過將Lua語言與底層硬件抽象層深度融合,提供了一套簡潔高效的開發(fā)范式。本文將圍繞LuatOS框架
    的頭像 發(fā)表于 01-27 19:38 ?129次閱讀
    LuatOS<b class='flag-5'>框架</b>的使用(上)

    Renesas SMARC EVK 開發(fā)啟動指南

    Renesas SMARC EVK 開發(fā)啟動指南 在嵌入式開發(fā)領(lǐng)域,Renesas 的 RZ/G2L、RZ/G2LC、RZ/G2UL、RZ/V2L 和 RZ/Five 系列開發(fā)板憑借
    的頭像 發(fā)表于 12-29 16:15 ?295次閱讀

    開源鴻蒙技術(shù)大會2025丨開源鴻蒙應(yīng)用開發(fā)再提速,跨平臺框架PMC(籌)正式啟動孵化

    9月27日,開源鴻蒙技術(shù)大會2025在長沙國際會議中心盛大舉辦。大會現(xiàn)場,開源鴻蒙跨平臺框架PMC(籌)正式啟動孵化,標(biāo)志著開源鴻蒙在應(yīng)用開發(fā)基礎(chǔ)設(shè)施建設(shè)層面迎來重大里程碑,也為整個行業(yè)帶來“打破
    的頭像 發(fā)表于 11-10 18:15 ?1376次閱讀
    開源鴻蒙技術(shù)大會2025丨開源鴻蒙應(yīng)用<b class='flag-5'>開發(fā)</b>再提速,跨平臺<b class='flag-5'>框架</b>PMC(籌)正式<b class='flag-5'>啟動</b>孵化

    NVIDIA助力新一代機(jī)器人開發(fā)開源框架

    今年的 ROSCon 在新加坡舉辦,并于 10 月 29 日順利閉幕。大會吸引了全球機(jī)器人操作系統(tǒng)(ROS)領(lǐng)域開發(fā)者的關(guān)注。ROS 是目前全球應(yīng)用最廣泛的機(jī)器人開發(fā)開源框架。
    的頭像 發(fā)表于 11-06 11:55 ?976次閱讀

    PYQT 應(yīng)用程序框架開發(fā)工具

    大家好,本團(tuán)隊此次分享的內(nèi)容為開發(fā)過程中使用到的PYQT 應(yīng)用程序框架開發(fā)工具。 pYqt 是一個多平臺的 python 圖形用戶界面應(yīng)用程序框架,由于其面向?qū)ο蟆? 易擴(kuò)展(可
    發(fā)表于 10-29 07:15

    LuatOS腳本開發(fā)入門:嵌入式運(yùn)行框架全解析!

    想搞懂LuatOS如何運(yùn)行Lua腳本?本文深入剖析其嵌入式運(yùn)行框架,涵蓋虛擬機(jī)加載、任務(wù)協(xié)程、系統(tǒng)初始化等關(guān)鍵環(huán)節(jié),適合初學(xué)者。 一、LuatOS 編程起步 1.1 底層固件怎么啟動 LuatOS
    的頭像 發(fā)表于 09-26 17:45 ?456次閱讀
    LuatOS腳本<b class='flag-5'>開發(fā)</b>入門:嵌入式運(yùn)行<b class='flag-5'>框架</b>全解析!

    嵌入式開發(fā)新選擇:LuatOS腳本框架入門教程

    LuatOS正成為嵌入式開發(fā)的新趨勢!本教程帶你從基礎(chǔ)入手,全面了解其基于Lua的腳本開發(fā)模式與輕量級運(yùn)行框架。 一、LuatOS 編程起步 1.1 底層固件怎么啟動 LuatOS 腳
    的頭像 發(fā)表于 09-26 17:34 ?553次閱讀
    嵌入式<b class='flag-5'>開發(fā)</b>新選擇:LuatOS腳本<b class='flag-5'>框架</b>入門教程

    ElfBoard技術(shù)貼|【RK3588】ELF 2開發(fā)板開機(jī)自啟動詳解

    在嵌入式系統(tǒng)開發(fā)中,合理管理開機(jī)自啟動項目能夠優(yōu)化系統(tǒng)啟動流程,確保關(guān)鍵服務(wù)和應(yīng)用按時加載運(yùn)行。本文將詳細(xì)介紹在ELF2開發(fā)板Linux5.10.209系統(tǒng)下基于SystemVinit
    的頭像 發(fā)表于 06-27 16:20 ?2008次閱讀
    ElfBoard技術(shù)貼|【RK3588】ELF 2<b class='flag-5'>開發(fā)</b>板開機(jī)自<b class='flag-5'>啟動</b>詳解

    華為正式啟動HarmonyOS 6開發(fā)者Beta

    在2025年華為開發(fā)者大會(HDC)上,華為正式啟動HarmonyOS 6開發(fā)者Beta,并全面展示一年多以來與合作伙伴共建鴻蒙生態(tài)的創(chuàng)新成果。
    的頭像 發(fā)表于 06-24 15:42 ?801次閱讀

    ArkUI-X框架LogInterface使用指南

    WARN/INFO/DEBUG),存在應(yīng)用崩潰的風(fēng)險。 注意:開發(fā)者使用時注冊,必須位于調(diào)用MyApplication超類的onCreate()方法之后 設(shè)置ArkUI-X框架
    發(fā)表于 06-15 23:20

    ArkUI-X中Plugin生命周期開發(fā)指南

    ; } } } 添加ArkUI-X插件 在StageActivity中,新增addPlugin11+方法,并以字符串形式提供IArkUIXPlugin的實現(xiàn)類的完整包名,用于將開發(fā)者實現(xiàn)
    發(fā)表于 06-04 22:36

    網(wǎng)關(guān)智商暴增!涂鴉T5AI網(wǎng)關(guān)開發(fā)框架讓設(shè)備秒懂人話,兼容國內(nèi)外頂尖AI大模型

    2025年2月,涂鴉全新發(fā)布WuKongAI硬件開發(fā)框架(點(diǎn)擊查看WuKongAI硬件開發(fā)框架往期介紹),為廣大智能設(shè)備和AI玩具開發(fā)者提供
    的頭像 發(fā)表于 05-22 18:30 ?1287次閱讀
    網(wǎng)關(guān)智商暴增!涂鴉T5AI網(wǎng)關(guān)<b class='flag-5'>開發(fā)</b><b class='flag-5'>框架</b>讓設(shè)備秒懂人話,兼容國內(nèi)外頂尖AI大模型

    小插件讓管道布線變得簡單:PLUGIN 3Dfindit for Revit

    插件,您可以訪問 CADENAS 平臺上的大量 CAD 模型。該插件安裝簡單,只需點(diǎn)擊幾下即可實現(xiàn)精確搜索,并可將特定組件直接導(dǎo)入到您的項目中。 安裝及使用說明: 要在安裝后啟動 PLUGIN
    發(fā)表于 05-09 15:20

    北京迅為RK3568開發(fā)板OpenHarmony系統(tǒng)南向驅(qū)動開發(fā)內(nèi)核HDF驅(qū)動框架架構(gòu)

    北京迅為RK3568開發(fā)板OpenHarmony系統(tǒng)南向驅(qū)動開發(fā)內(nèi)核HDF驅(qū)動框架架構(gòu)
    的頭像 發(fā)表于 03-11 14:13 ?1788次閱讀
    北京迅為RK3568<b class='flag-5'>開發(fā)</b>板OpenHarmony系統(tǒng)南向驅(qū)動<b class='flag-5'>開發(fā)</b>內(nèi)核HDF驅(qū)動<b class='flag-5'>框架</b>架構(gòu)