1. 程式人生 > >(1/2) 為了理解 UWP 的啟動流程,我從零開始建立了一個 UWP 程式

(1/2) 為了理解 UWP 的啟動流程,我從零開始建立了一個 UWP 程式

每次使用 Visual Studio 的模板建立一個 UWP 程式,我們會在專案中發現大量的專案檔案、配置、應用啟動流程程式碼和介面程式碼。然而這些檔案在 UWP 程式中到底是如何工作起來的?

我從零開始建立了一個 UWP 程式,用於探索這些檔案的用途,瞭解 UWP 程式的啟動流程。

本文分為兩個部分:

本文將一個普通專案改造成 UWP 專案,重點在瞭解 UWP 的專案檔案組成。

從最簡單的專案模板開始

雖然可以從零開始寫一個 csproj 檔案,不過這並沒有什麼技術含量,因為新的 csproj 檔案實在是非常簡單。參見:

於是,我建立一個 .NET Core 控制檯應用。當然,其它簡單的如 .NET Standard 庫都是一樣的,反正最後都會被我改得面目全非。

建立 .NET Core 控制檯應用

於是我得到了一個 csproj 專案檔案和包含有應用程式入口的 Program.cs 檔案。

兩個檔案

其中 csproj 檔案內容非常簡單:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.1</TargetFramework>
  </PropertyGroup>
</Project>

Program.cs 檔案也是:

// using System;

namespace Walterlv.Demo.ZeroUwp
{
    class Program
    {
        static void Main(string[] args)
        {
            // 這一句需要刪除,因為 UWP 程式中不能使用控制檯。
            // Console.WriteLine("Hello World!");
        }
    }
}

不過,這兩個檔案都會被改掉的,已經無所謂裡面是什麼內容了。

將專案改造成 UWP 專案

UWP 程式的輸出型別是 AppContainerExe

,而不是一般的 Library 或者 Exe。

另外,基於 Microsoft.NET.Sdk 的新 csproj 格式不支援 UWP 應用程式。所以我希望藉助第三方的 MSBuild.Sdk.Extras 來編譯 UWP 的專案。參見 新 csproj 對 WPF/UWP 支援不太好?有第三方 SDK 可以用!MSBuild.Sdk.Extras

然而實際情況也不容樂觀,因為此第三方 Sdk 只支援 UWP 的庫程式,而不支援應用程式容器。所以即便修改為以下方式,最終也因為缺少 Visual Studio RunCommand 的支援,而導致無法啟動。

<Project Sdk="MSBuild.Sdk.Extras/1.6.41">

  <PropertyGroup>
    <OutputType>AppContainerExe</OutputType>
    <TargetFrameworks>uap10.0.17134</TargetFrameworks>
  </PropertyGroup>

</Project>

使用以上新 Sdk 的 csproj 格式,我完整地寫完了整個 csproj 檔案和後續步驟,依然無法解決下面這個錯誤提示框:

RunCommand Property is not defined
▲ 無法啟動

所以我們依然只能使用傳統的 csproj 檔案格式。裡面大部分的內容從模板中複製而來。事實上,我尋找了很多資料,都沒有找到讓支援 Sdk 的新 csproj 格式支援 UWP 的主程式。

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
    <ProjectGuid>{09A58639-DC50-41C1-8BCE-A2217A1D3327}</ProjectGuid>
    <OutputType>AppContainerExe</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>Walterlv.Demo.ZeroUwp</RootNamespace>
    <AssemblyName>Walterlv.Demo.ZeroUwp</AssemblyName>
    <DefaultLanguage>en-US</DefaultLanguage>
    <TargetPlatformIdentifier>UAP</TargetPlatformIdentifier>
    <TargetPlatformVersion Condition=" '$(TargetPlatformVersion)' == '' ">10.0.17134.0</TargetPlatformVersion>
    <TargetPlatformMinVersion>10.0.15063.0</TargetPlatformMinVersion>
    <MinimumVisualStudioVersion>14</MinimumVisualStudioVersion>
    <FileAlignment>512</FileAlignment>
    <ProjectTypeGuids>{A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
    <WindowsXamlEnableOverview>true</WindowsXamlEnableOverview>
    <DebugSymbols>true</DebugSymbols>
    <OutputPath>bin\x86\Debug\</OutputPath>
    <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
    <DebugType>full</DebugType>
    <PlatformTarget>x86</PlatformTarget>
    <UseVSHostingProcess>false</UseVSHostingProcess>
    <ErrorReport>prompt</ErrorReport>
    <Prefer32Bit>true</Prefer32Bit>
  </PropertyGroup>
  <PropertyGroup>
    <RestoreProjectStyle>PackageReference</RestoreProjectStyle>
  </PropertyGroup>
  <ItemGroup>
    <Compile Include="Program.cs" />
    <Compile Include="Properties\AssemblyInfo.cs" />
  </ItemGroup>
  <ItemGroup>
    <AppxManifest Include="Package.appxmanifest">
      <SubType>Designer</SubType>
    </AppxManifest>
  </ItemGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.NETCore.UniversalWindowsPlatform">
      <Version>6.1.5</Version>
    </PackageReference>
  </ItemGroup>
  <PropertyGroup Condition=" '$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' &lt; '14.0' ">
    <VisualStudioVersion>14.0</VisualStudioVersion>
  </PropertyGroup>
  <Import Project="$(MSBuildExtensionsPath)\Microsoft\WindowsXaml\v$(VisualStudioVersion)\Microsoft.Windows.UI.Xaml.CSharp.targets" />
</Project>

編寫 AppxManifest

專案改造成 UWP 專案後,似乎已經完成了大部分了,但此時直接執行會有編譯錯誤,因為我缺少 UWP 程式必要的 AppxManifest.xml 檔案。

缺少 AppxManifest.xml 檔案

事實上,AppxManifest.xml 的建立是非常繁瑣的;通常是編譯過程幫我們根據 Package.appxmanifest 檔案自動生成的。然而建立一個 Package.appxmanifest 也是很麻煩的。至少,要讓 Visual Studio 能夠直接開啟這個檔案所需的最小程式碼量是下面這些(不能編譯通過):

<?xml version="1.0" encoding="utf-8"?>
<Package xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
         xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
         xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
         xmlns:uap2="http://schemas.microsoft.com/appx/manifest/uap/windows10/2"
         xmlns:uap3="http://schemas.microsoft.com/appx/manifest/uap/windows10/3"
         xmlns:iot="http://schemas.microsoft.com/appx/manifest/iot/windows10"
         xmlns:mobile="http://schemas.microsoft.com/appx/manifest/mobile/windows10"
         IgnorableNamespaces="uap mp uap3 iot uap2 mobile">
  <Identity Name="walterlv.zerouwp" Publisher="CN=walterlv" Version="0.1.0.0" />
  <mp:PhoneIdentity PhoneProductId="97f5137d-c6be-4395-9af0-bbfdcea40fa7" PhonePublisherId="00000000-0000-0000-0000-000000000000" />
  <Properties>
    <DisplayName>Walterlv.ZeroUwp</DisplayName>
    <PublisherDisplayName>walterlv</PublisherDisplayName>
    <Logo>Assets\StoreLogo.png</Logo>
  </Properties>
  <Dependencies>
    <TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.0.0" MaxVersionTested="10.0.0.0" />
  </Dependencies>
  <Resources>
    <Resource Language="x-generate" />
  </Resources>
  <Applications>
    <Application Id="App" Executable="$targetnametoken$.exe" EntryPoint="Walterlv.ZeroUwp.Program">
      <uap:VisualElements DisplayName="Walterlv.ZeroUwp">
      </uap:VisualElements>
    </Application>
  </Applications>
</Package>

可以閱讀這些文件瞭解如何完成這份檔案的編寫:

具體來說,<Identity /> 是此程式包的識別符號,需要在整個應用商店範圍內唯一(如果將此包與應用商店關聯,這個值會自動更新,所以不用在意填成什麼)。<mp:PhoneIdentity /> 是此程式包在移動裝置上的識別符號,應用的更新會依據此識別符號的 GUID 來唯一確定,格式必須是 GUID。

事實上,雖然依然無法完成編譯,但此時可以通過在 Visual Studio 中開啟這份檔案來觀察還缺少哪些必要的資訊需要填寫。

填寫缺少的資訊

事實上,我們缺少的資訊並不多,只有四個,都從 Package/Applications/Application 開始:

同時,我們還真的需要相應的圖片:

UWP 程式所需的最少 Logo

補充完畢之後,完整的檔案如下:

<?xml version="1.0" encoding="utf-8"?>
<Package xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
         xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
         xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
         xmlns:uap2="http://schemas.microsoft.com/appx/manifest/uap/windows10/2"
         xmlns:uap3="http://schemas.microsoft.com/appx/manifest/uap/windows10/3"
         xmlns:iot="http://schemas.microsoft.com/appx/manifest/iot/windows10"
         xmlns:mobile="http://schemas.microsoft.com/appx/manifest/mobile/windows10"
         IgnorableNamespaces="uap mp uap3 iot uap2 mobile">
  <Identity Name="walterlv.zerouwp" Publisher="CN=walterlv" Version="0.1.0.0" />
  <Properties>
    <DisplayName>Walterlv.ZeroUwp</DisplayName>
    <PublisherDisplayName>walterlv</PublisherDisplayName>
    <Logo>Assets\StoreLogo.png</Logo>
  </Properties>
  <Dependencies>
    <TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.0.0" MaxVersionTested="10.0.0.0" />
  </Dependencies>
  <Resources>
    <Resource Language="x-generate" />
  </Resources>
  <Applications>
    <Application Id="App" Executable="$targetnametoken$.exe" EntryPoint="Walterlv.ZeroUwp.Program">
      <uap:VisualElements DisplayName="Walterlv.ZeroUwp" Description="Walterlv.ZeroUwp is a demo application to learn how uwp application runs." BackgroundColor="transparent" Square150x150Logo="Assets\Square150x150Logo.png" Square44x44Logo="Assets\Square44x44Logo.png">
        <uap:DefaultTile Wide310x150Logo="Assets\Wide310x150Logo.png">
        </uap:DefaultTile>
      </uap:VisualElements>
    </Application>
  </Applications>
</Package>

不能忘掉,這份檔案還需要新增到 csproj 專案檔案中:

<!-- 新增了此節點,即 AppxManifest 和相關資源。 -->
  <ItemGroup>
    <AppxManifest Include="Package.appxmanifest">
      <SubType>Designer</SubType>
    </AppxManifest>
    <Content Include="Assets\Square150x150Logo.scale-200.png" />
    <Content Include="Assets\Square44x44Logo.scale-200.png" />
    <Content Include="Assets\StoreLogo.png" />
    <Content Include="Assets\Wide310x150Logo.scale-200.png" />
  </ItemGroup>

編寫 AssemblyInfo.cs

由於沒有新的基於 Sdk 的 csproj 檔案支援,所以我們需要自己編寫 AssemblyInfo.cs 檔案,並放入到 Properties 資料夾中。

using System.Reflection;
using System.Runtime.InteropServices;

[assembly: AssemblyTitle("Walterlv.Demo.ZeroUwp")]
[assembly: AssemblyProduct("Walterlv.Demo.ZeroUwp")]
[assembly: AssemblyCopyright("Copyright © walterlv 2018")]
[assembly: AssemblyVersion("0.1.0.0")]
[assembly: AssemblyFileVersion("0.1.0.0")]
[assembly: ComVisible(false)]

最後,csproj 檔案會如下面這樣。

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
    <ProjectGuid>{7B81D14B-6094-44E1-9B2F-F577995A3CAF}</ProjectGuid>
    <OutputType>AppContainerExe</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>Walterlv.Demo.ZeroUwp</RootNamespace>
    <AssemblyName>Walterlv.Demo.ZeroUwp</AssemblyName>
    <DefaultLanguage>en-US</DefaultLanguage>
    <TargetPlatformIdentifier>UAP</TargetPlatformIdentifier>
    <TargetPlatformVersion Condition=" '$(TargetPlatformVersion)' == '' ">10.0.17134.0</TargetPlatformVersion>
    <TargetPlatformMinVersion>10.0.17134.0</TargetPlatformMinVersion>
    <MinimumVisualStudioVersion>14</MinimumVisualStudioVersion>
    <FileAlignment>512</FileAlignment>
    <ProjectTypeGuids>{A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
    <WindowsXamlEnableOverview>true</WindowsXamlEnableOverview>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
    <DebugSymbols>true</DebugSymbols>
    <OutputPath>bin\x86\Debug\</OutputPath>
    <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
    <NoWarn>;2008</NoWarn>
    <DebugType>full</DebugType>
    <PlatformTarget>x86</PlatformTarget>
    <UseVSHostingProcess>false</UseVSHostingProcess>
    <ErrorReport>prompt</ErrorReport>
    <Prefer32Bit>true</Prefer32Bit>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
    <OutputPath>bin\x86\Release\</OutputPath>
    <DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
    <Optimize>true</Optimize>
    <NoWarn>;2008</NoWarn>
    <DebugType>pdbonly</DebugType>
    <PlatformTarget>x86</PlatformTarget>
    <UseVSHostingProcess>false</UseVSHostingProcess>
    <ErrorReport>prompt</ErrorReport>
    <Prefer32Bit>true</Prefer32Bit>
    <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|ARM'">
    <DebugSymbols>true</DebugSymbols>
    <OutputPath>bin\ARM\Debug\</OutputPath>
    <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
    <NoWarn>;2008</NoWarn>
    <DebugType>full</DebugType>
    <PlatformTarget>ARM</PlatformTarget>
    <UseVSHostingProcess>false</UseVSHostingProcess>
    <ErrorReport>prompt</ErrorReport>
    <Prefer32Bit>true</Prefer32Bit>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|ARM'">
    <OutputPath>bin\ARM\Release\</OutputPath>
    <DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
    <Optimize>true</Optimize>
    <NoWarn>;2008</NoWarn>
    <DebugType>pdbonly</DebugType>
    <PlatformTarget>ARM</PlatformTarget>
    <UseVSHostingProcess>false</UseVSHostingProcess>
    <ErrorReport>prompt</ErrorReport>
    <Prefer32Bit>true</Prefer32Bit>
    <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
    <DebugSymbols>true</DebugSymbols>
    <OutputPath>bin\x64\Debug\</OutputPath>
    <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
    <NoWarn>;2008</NoWarn>
    <DebugType>full</DebugType>
    <PlatformTarget>x64</PlatformTarget>
    <UseVSHostingProcess>false</UseVSHostingProcess>
    <ErrorReport>prompt</ErrorReport>
    <Prefer32Bit>true</Prefer32Bit>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
    <OutputPath>bin\x64\Release\</OutputPath>
    <DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
    <Optimize>true</Optimize>
    <NoWarn>;2008</NoWarn>
    <DebugType>pdbonly</DebugType>
    <PlatformTarget>x64</PlatformTarget>
    <UseVSHostingProcess>false</UseVSHostingProcess>
    <ErrorReport>prompt</ErrorReport>
    <Prefer32Bit>true</Prefer32Bit>
    <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
  </PropertyGroup>
  <PropertyGroup>
    <RestoreProjectStyle>PackageReference</RestoreProjectStyle>
  </PropertyGroup>
  <ItemGroup>
    <Compile Include="Properties\AssemblyInfo.cs" />
    <Compile Include="Program.cs" />
    <Compile Include="VisualProperties.cs" />
  </ItemGroup>
  <ItemGroup>
    <AppxManifest Include="Package.appxmanifest">
      <SubType>Designer</SubType>
    </AppxManifest>
    <Content Include="Assets\Square150x150Logo.scale-200.png" />
    <Content Include="Assets\Square44x44Logo.scale-200.png" />
    <Content Include="Assets\StoreLogo.png" />
    <Content Include="Assets\Wide310x150Logo.scale-200.png" />
  </ItemGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.NETCore.UniversalWindowsPlatform">
      <Version>6.1.5</Version>
    </PackageReference>
  </ItemGroup>
  <PropertyGroup Condition=" '$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' &lt; '14.0' ">
    <VisualStudioVersion>14.0</VisualStudioVersion>
  </PropertyGroup>
  <Import Project="$(MSBuildExtensionsPath)\Microsoft\WindowsXaml\v$(VisualStudioVersion)\Microsoft.Windows.UI.Xaml.CSharp.targets" />
</Project>

一個說明:如果執行時出現本機錯誤,那麼可能是上面的 csproj 檔案沒有配置正確。如果出現下圖所示的錯誤,建議先考慮將以上 csproj 檔案中的所有內容複製到你的專案檔案中再試。

本機錯誤

完成部署和執行

以上所有內容是一個 UWP 程式完成編譯並執行所需的最少資訊了。

此時執行,我們只會看到一個空的視窗,就像這樣:

空的視窗

Main 函式中的斷點是可以進入的:

Main 函式中的斷點

不過,如果繼續執行,會提示錯誤。因為我們的程式並沒有顯示任何 UWP 的介面。

無法繼續執行

總結與後續

在本文中,我們瞭解到 UWP 專案所需的最少檔案有:

  • *.csproj 專案檔案
    • 這是整個從零開始的 UWP 程式中最複雜的一個檔案,因為目前沒有找到任何一個 Sdk 支援 UWP 的主程式工程。
  • Package.appxmanifest 檔案
    • 這是 UWP 應用程式的清單檔案。事實上,這不是最終的清單檔案,而是用於在專案中填寫資訊的檔案;從前面的錯誤資訊中我們瞭解到,最終的清單檔案是 AppxManifest.xml。
  • Assets 資料夾中的四張圖片
    • StoreLogo、Square44x44Logo、Square150x150Logo 和 Wide310x150Logo 是清單檔案能夠正常生成所需的最少 Logo 資源
  • AssemblyInfo.cs
    • 由於缺少 [email protected] 的支援,所以我們必須編寫 AssemblyInfo.cs 檔案來指定版本資訊。
  • Program.cs
    • 這是一開始我們就新增好的檔案,就是放 Main 函式的地方。雖然我們什麼都沒寫,但已經能夠進入斷點了。

相關推薦

(1/2) 為了理解 UWP啟動流程開始建立一個 UWP 程式

每次使用 Visual Studio 的模板建立一個 UWP 程式,我們會在專案中發現大量的專案檔案、配置、應用啟動流程程式碼和介面程式碼。然而這些檔案在 UWP 程式中到底是如何工作起來的? 我從零開始建立了一個 UWP 程式,用於探索這些檔案的用途,瞭解

安卓ServiceManager啟動:徹底理解ServiceManager啟動流程這一篇就夠

基於Android 6.0的原始碼剖析, 本文詳細地講解了ServiceManager啟動流程 framework/native/cmds/servicemanager/ - service_manager.c - binder.c kernel/driv

Python開始學習T^T D7

int res key def yar bsp cti for 多個 當函數遇到不確定數量參數腫麽破?*args和**kwargs前來報道! *args **kwargs 當函數的參數不確定時,可以使用*args 和**kwargs,*args

1萬事開頭難重新開始加油吧少年!

百度 堅持 買車 曾經 努力 未來 一些事 過去 從零開始 現在是下午的三點多,天氣是太陽高照,晴空萬裏。老媽出去放鴨子了,老爸又騎著摩托去做建築的活了。我一個待在家裏,不知道幹些什麽,發現自己這幾年都在迷茫中度過,始終發現自己還是有心裏落差,放不下一些事,也是十分的不懂

2019年還剩1外包公司離職

馬上就要2020年,2019這段路你走的辛苦嗎? 這日子過的可真快啊,2019年還剩1天,外包公司幹了不到3個月,我離職了......當專案快要做完的時候,我就擔心自己是不是要被“釋放了”,直到外包HR,wx找我聊專案,我就不擔心了,結果確實是要被“釋放”。 從杭州到深圳,來的也突然,離職也有點突然,也是意料

跟著開始入門FPGA(一周入門XXOO系列)-1、Verilog語法

部分 同步 比較 跑馬燈 begin 寫代碼 人的 thread get (本連載共七部分,這是第一部分) 作者:McuPlayer2013 (EETOP FPGA版塊版主) 原帖地址:http://bbs.eetop.cn/thread-385362-1-1.htm

開始學微信小程式開發---2、小程式專案的建立、相關檔案的作用及小程式IDE

一、建立一個小程式專案 1、下載安裝微信web開發者工具,目前最新版本是1.02.1811141。 2、開啟,掃碼登入, 3、選擇小程式專案 4、點選專案管理旁邊的+ 5、如果你有小程式賬號會有一個APPID,詳情見小程式簡易教程申請賬號那一節,如果還沒有,可以

開始學微信小程式開發---3、小程式靜態啟動頁面的製作

現在正式開始編碼啦!~ 我的IDE版本: 首先,新建一個小程式專案,然後建立所需要的檔案以及目錄: 然後在index.wxml中編寫小程式的頁面骨架: <!-- index.wxml是編寫小程式骨架的檔案,相當於HTML --> <!-- <view&g

用spring boot 2開始建立區塊鏈

一、區塊鏈物件模型的基礎屬性(BlockChain) @ApiModelProperty(value = "當前交易列表", dataType = "List<Transaction>") @JSONField(serialize = false) @Js

看完此文再不懂區塊鏈算用Python開始建立區塊鏈

如果你還沒有聽說過 3 點鐘區塊鏈群,說明你還不是鏈圈的人;如果你還沒有加入 3 點鐘區塊鏈群,

深度學習R(1):開始建立完全連線的神經網路

作者:PENG ZHAO 我要感謝Feiwen, Neil和所有其他的技術評論家和讀者,他們為本文提出了寶貴的意見和建議。 背景 深度神經網路(DNN)近年來取得了在影象識別、自然語言處理和自動駕駛領域取得了巨大成就,如圖1所示,從2012至2015

深入理解Activity啟動流程(三)–Activity啟動的詳細流程1

本系列部落格將詳細闡述Activity的啟動流程,這些部落格基於Cm 10.1原始碼研究。 本篇部落格將開始介紹Activity啟動的詳細流程,由於詳細啟動流程非常複雜,故此分成兩篇來介紹。 本篇主要介紹前半部分的啟動流程: 1. Activit

Hyperledger Fabric 1.2系列:3.啟動first-network網路解析byfn.sh啟動指令碼

簡介 在啟動網路之前,確保你已經安裝了所必要的依賴。如果沒有安裝,請參考之前的兩篇內容。 啟動網路 進入fabric-samples/first-network資料夾內,執行byfn.sh指令碼 cd fabric-samples/first-network ./byfn.sh

Activity啟動流程介面繪製到事件處理的整個流程(基於Android6.0原始碼)(2)

void setLayoutParams(WindowManager.LayoutParams attrs, boolean newView) { synchronized (this) { ...... mWindowAttributes

深入理解Activity啟動流程(二)–Activity啟動相關類的類圖

b- ive ava ani affinity server 組織 詳細 pac 本文原創作者:Cloud Chou. 歡迎轉載,請註明出處和本文鏈接 本系列博客將詳細闡述Activity的啟動流程,這些博客基於Cm 10.1源碼研究。 在介紹Activity的詳細啟動流程

Android 7.1.1 鎖屏界面啟動流程

gis eset sed reset ram 啟動流程 com enter on() 前幾天遇到一個低概率復現鎖屏界面不顯示,僅僅顯示狀態欄的問題,跟了下鎖屏界面啟動顯示的流程,在這分享下,也方便以後自己查看。前面簡介了下Zygote啟動流程, Zygo

RAC啟動流程啟動程序隔離機制相關資訊

RAC的啟動流程 第一步:高可用性服務層 (HAS) 第二步:叢集就緒服務層 (CRS) ./crsctl start has ./crsctl start crs ohasd程序是系統INIT生成,ohasd程序是啟動Clusterware的起點,高可用性服務層由GPNPD,GIPC,

1-2 【包子mysql系列】 對mysql的innoDB加鎖分析

innoDB的事務,是基於鎖來實現的,用到事務不自然就會用到鎖,而如果對鎖理解的不通透,很容易造成線上問題。 資料庫加鎖的分析,和事務的引擎,隔離級別,索引,主鍵索引都有關係, 如果去考慮引擎和各種隔離級別的話,就會很複雜了,所以下面都是基於innoDB和RR的隔離級別進行分析:   表結構

1.2 Vue例項中的資料事件和方法

<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> <script src="https://cdn.jsdel

題目一:給出一個n,代表有1到n的數字[1,2,3,··· n]問可以構成多少種二叉搜索樹?

pri int private 計算 stat 題目 二叉搜索樹 得到 pre 題目一:給出一個n,代表有從1到n的數字[1,2,3,··· n],問可以構成多少種二叉搜索樹? 一開始的想法是直接遞歸構造,時間復雜度是指數上升;後來想法是找規律:先看例子: n = 1, 有