(1/2) 為了理解 UWP 的啟動流程,我從零開始建立了一個 UWP 程式
每次使用 Visual Studio 的模板建立一個 UWP 程式,我們會在專案中發現大量的專案檔案、配置、應用啟動流程程式碼和介面程式碼。然而這些檔案在 UWP 程式中到底是如何工作起來的?
我從零開始建立了一個 UWP 程式,用於探索這些檔案的用途,瞭解 UWP 程式的啟動流程。
本文分為兩個部分:
本文將一個普通專案改造成 UWP 專案,重點在瞭解 UWP 的專案檔案組成。
從最簡單的專案模板開始
雖然可以從零開始寫一個 csproj 檔案,不過這並沒有什麼技術含量,因為新的 csproj 檔案實在是非常簡單。參見:
於是,我建立一個 .NET Core 控制檯應用。當然,其它簡單的如 .NET Standard 庫都是一樣的,反正最後都會被我改得面目全非。
於是我得到了一個 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
另外,基於 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 檔案和後續步驟,依然無法解決下面這個錯誤提示框:
▲ 無法啟動
所以我們依然只能使用傳統的 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)' < '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 的建立是非常繁瑣的;通常是編譯過程幫我們根據 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 開始:
- uap:[email protected]
- uap:[email protected]
- uap:[email protected]
- uap:[email protected]
- uap:VisualElements/uap:[email protected]
同時,我們還真的需要相應的圖片:
補充完畢之後,完整的檔案如下:
<?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)' < '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 函式中的斷點是可以進入的:
不過,如果繼續執行,會提示錯誤。因為我們的程式並沒有顯示任何 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, 有