【Android应用开发】Android Studio 简介 (Android Studio Overview)
一. Intelij IDEA 环境简介
Android Studio 来源 : Android Studio 是 Intelij IDEA 的免费版本 + Android SDK 集成的;
-- Intelij 文档参考 : https://www.jetbrains.com/idea/help/intellij-idea.html ;
1. Intelij 与 Eclipse 区别
(1) Intelij 与 Eclipse 对应关系
Eclipse | Intelij IDEA |
---|---|
Workspace | Project |
Project | Moudle |
Facet | Facet |
Library | Library |
JRE | SDK |
Classpath variable | Path variable |
(2) Intelij 项目导入
Intelij IDEA 导入项目 :
-- 导入 Eclipse 项目 : 尽管 Intelij IDEA 与 Eclipse 的目录结构 不同, 在 Intelij 中可以导入 Eclipse 的 WorkSpace 或者 Project;
-- 导入 Maven 或 Gradle 项目 : 如果工程使用 Maven 或者 Gradle 工具进行编译, 选择相应的编译脚本 pom.xml 或者 build.gradle ;
2. Intelij 的 Project 概念
(1) Project 基本简介
Project 基本简介 :
-- Project 定义 : Project 代表了一个软件解决方案的 组织单元, 这个 Project 中提供了了最基本的 代码编写帮助, 重构, 编码风格一致性等功能;
-- Moudle (模块) 组合 : 完成后的产品会被分解成一系列离散孤立的 Moudle (模块), Project 会将这些 Moudle 集合在一起, 然后将 Module 连接整合成一个更大的整体;
-- Project 不含构件 : Project 本身不包含开发构件, 如源代码, 编译脚本, 或文档;
-- Project 配置 : Project 是 Intelij IDEA 的最高层级的结构组织, 在其中主要定义整个 Project 的设置, 同时也定义了其中的 Moudle (模块) 和 Library (依赖库) 的设置;
(2) Project 格式和文件
Project 配置数据 :
-- 来源 : Intelij IDEA 将 Project 及其组件的配置数据 保存在规定的 XML 文件中, 这样使 管理 和 分享 Project 配置数据更简单;
-- 分类 : Project 配置数据分为 基于目录格式的 和 基于文件格式的 配置数据;
(3) Project 基于目录的配置数据
基于目录格式 (Directory-based format) 的配置数据 :
-- 含有的配置文件 : 使用 基于目录格式 的配置数据时, 在 Project 中会生成 .idea 目录, .idea 目录中有大量的 XML 文件;
-- 文件配置 : .idea 目录包含了大量的 XML 配置文件, 每个 xml 文件都包含了一个关于特定领域的配置文件, 例如 compiler.xml, encodings.xml, moudles.xml 等等;
-- 信息重要性 : 几乎所有 .idea 目录中的文件都包含了 Project 项目的核心信息, 例如 Moudle 模块组件的名称 和 位置, 编译配置 etc.
-- 建议版本控制 : .idea 目录下地文件应该被纳于版本控制之下;
-- 个人设置不进行版本控制 : workspace.xml 是一个例外, 该文件配置 IDE 的个人偏好设置, 字体, 窗口位置, 窗口栏目, 版本控制设置, 其它编程历史数据, 该文件可以不纳入版本控制 etc.
3. Intelij IDEA 的 SDK 概念
(1) SDK 简介
SDK 简介 :
-- SDK 需求 : 如果使用 Intelij 开发应用软件, 需要一个 SDK, 最常见的时 JDK, 用于 Java 程序开发;
-- 安装 SDK : Intelij IDEA 不包含 SDK, 编程前至少应该安装 并 定义 (define) 一个 SDK,
-- 定义(define) SDK : 指定 SDK 的名称 和 位置 (即 SDK 安装目录所在的路径);
(2) Intelij 支持的SDK
Intelij IDEA 支持的 SDK :
-- JDK : Java 开发;
-- Mobile SDK : Java ME 移动设备开发;
-- Android SDK : Android 开发;
-- Flex AIR SDK : Adobe Flash 平台开发;
-- Flexmojos SDK : Flex 编译和调试 SDK;
-- Intelij Platform Plugin SDK : 用于开发 Intelij IDEA 的插件;
(3) SDK 级别
SDK 级别 :
-- 全局开发环境级别 : 如果 SDK 被定义为整个 IDE 集成开发环境的全局级别, 可以在任意 Project 中使用;
-- 工程相关 SDK : 如果 SDK 与 Project 相关联, 那么该 SDK 级别就是 Project 级别的, 这个 SDK 只能被该 Project 下地 Moudle 使用, 其它的 Project 不能使用;
-- Moudle 级别 SDK : Moudle 模块可以使用 Project 级别的 SDK, 也可以使用 Moudle 级别特定的 SDK;
(4) SDK 中得各种路径
SDK 路径 : 在 Intelij IDEA 中定义一个 SDK 时, IDE 会自动寻找 二进制库路径, 源码路径, 和 文档路径;
-- classpath 二进制依赖库路径 : SDK 已编译好的二进制数据所在的路径, 对于 JDK 来说就是 API 的 class 字节码文件 和 jar 包文件所在的目录;
-- sourcepath 源码路径 : SDK 的源码所在的路径, 该源码未进行编译, 源码文件不是必须的, 关联源码文件后 Intelij IDEA 会提供进一步的编码帮助功能;
-- documentation path 文档路径 : 文档所在的路径, android 就是 sdk 下地 doc 目录, 还可以设置在线文档 url, 可以浏览在线的文档帮助;
4. Intelij IDEA 的 Moudle 概念
(1) Moudle 简介
Moudle 简介 : Moudle 模块是一个离散的功能单元, 可以独立进行 编译 运行 测试 调试;
-- 包含文件 : 模块包含一个特定任务的所有所需文件, 如 源代码 构建脚本 单元测试 部署描述符 文档 etc.
-- Project 环境 : 模块的存在 和 执行功能 的前提必须是 Project 的上下文的前提下才有意义, 单独的 Moudle 是无意义的;
-- Moudle 配置文件 : Moudle 的配置信息保存在 moudleName.iml 配置文件中, 默认该配置文件在 moudle 根目录中, 该文件应该纳入版本控制中;
(2) Moudle 类型
Moudle 类型简介 : 组件使用类型与使用的 Intelij IDEA 所用的编辑器 和 插件要与 Moudle 类型相符才可以;
-- Java Moudle : Java 程序, Java Moudle 功能可以通过添加 facet 进行扩展;
-- Web Moudle : 提供用于开发 Web 应用的工具, 可以使用 Java PHP JavaScript markUp 等语言;
-- Android Moudle : Android 应用模块;
-- Ruby Moudle : 提供创建 Ruby 工程的工具, 需要使用 Ruby 插件;
-- Python Moudle : 提供 Python 开发的工具, 需要使用 Python 插件;
(3) Moudle 目录结构解析
文档位置 : https://www.jetbrains.com/idea/help/content-root.html , 翻译解析如下;
Moudle 目录结构 :
-- 源码目录 (Source Root) : 目录标识 该目录及其子目录下地文件都是源码, 需要被编译的一部分, 可以将一个包前缀标记成源码目录, 如 cn.org.octopus, 不用刻意创建源码目录 如 cn/org/octopus ;
-- 生成源码目录 (Generated Source Root) : 与 Source Root 相似, 但是该目录不建议重构和修改;
-- 测试源码目录 (Test Source Root) : 单元测试源码存放的位置, 可以将测试源码 与 程序源码分开, 测试源码 与 程序源码是分开放置的;
-- 生成的测试源码目录 ( Generated Test Source Root ) : 生成的测试源码目录, 一般在 build 目录下;
-- 资源目录 (Resource Root) : 应用中所用到的资源文件;
-- 纯目录 (Exclude Roots) : 该目录不重要, 被部分忽略, 只是单纯地目录, 该目录下地文件不会进行编译, 查找替换时不会查找该目录下地内容, 指定 Exculde 目录能提供 IDE 的性能, 一般输出目录是呗排除的;
(4) Moudle 依赖可以不指定类型
Moudle 依赖 : SDK 关联 Moudle, Moudle 中使用依赖库, 依赖于该 Project 中得其它 Moudle, 可以将一个 Moudle 指定为依赖, 又可以为一个 Moudle 指定一个依赖 Moudle, 此时 依赖 Moudle 可以不指定 目录类型;
二. Android Studio 工程目录结构
1. Android 视图 (扁平化显示)
(1) Android 视图简介
Android 视图 : 左上角工具栏下面有个下拉菜单, 可以切换此视图, 视图模块图解如下;
-- 作用 : 该视图以扁平视角显示了目录结构, 提供了一个快速操作 Android 工程关键文件的途径, 帮助你在基于 Gradle 编译系统上进行工作;
-- 模块 : 在模块层级的最顶层提供最重要的资源目录;
-- 分组 : 将所有模块的编译文件分组并放在一个通用目录中;
-- 配置 : 将所有模块的 Manifest 配置文件放在一个通用目录中;
-- 编译 : 显示 Gradle 设置的资源文件;
-- 资源 : 将屏幕适配使用的不同的 分辨率, 横竖屏, 国际化资源放在对应的目录中;
-- 切换方法 : 点击视图选择按钮, 在下拉菜单中选择 "Android" 视图, 如下图所示;
(2) Android 顶级视图模块介绍
Android 视图模块 : 基本分类, 如下图; Android 视图下顶级目录有 Gradle Scripts 以及 模块 目录;
-- Gradle Scripts : 显示所有的 编译相关 的脚本文件;
(3) Android 视图 Moudle模块介绍
模块目录 : 在 Android 视图除了有 Gradle Scripts, 每个 模块(Moudle 相当于 workspace 中的工程) 都有一个顶层目录;
-- java : Moudle 的 java 源码文件;
-- manifest : Moudle 的 manifest 配置文件;
-- res : Moudle 的资源文件, 不同分辨率的图片 相同的名称会分到一组, 如下图所示;
2. Project 视图
(1) Project 视图 Moudle 目录
Project 视图 Moudle 目录 : 与 Eclipse 中的工程视图有一些区别; 在 Android Studio 每个 Project 中都包含一个或多个 应用模型 (Application Moudle), 每个应用模型都包含这个模块的所有源码集合;
-- Java 源码 : moudleName/src/main/java 路径;
-- res 资源 : moudleName/src/main/res 路径, 包含图片, 布局, 国际化等资源;
-- 测试相关资源 : moudleName/src/androidTest 路径, 模块测试用例相关源码;
(2) 创建文件
创建文件 :
-- 快速创建 : 点击 Project 中的恰当的目录, 使用 Command + N (mac) 或者 Alt + N (Windows) 可以快速创建文件;
-- 创建类型 : AS 会根据被选中目录的类型, 会给出创建对应类型的文件的选项, 如你选择在 layout 目录创建文件, AS 会给出创建布局类文件的选项;
三. Android 编译系统
1. Android 编译简介
Android 编译系统简介 :
-- 基本作用 : 是用来 编译, 测试, 运行, 打包 应用的工具包, 该编译系统替代了 Eclipse ADT 中得 Ant 编译系统;
-- 使用方式 : 该编译系统 既可以从 Android Studio 菜单中运行工具, 也可以是从命令行运行的独立的工具;
编译系统功能 : 灵活的 Android 编译系统使你能够达到以下列出的功能不用修改工程的核心文件;
-- 定制 配置 扩展 编译过程;
-- 使用同样地 Project 和 Moudle 创建多种不同特性的 apk 文件;
-- 对源码 和 资源的重用;
2. 用于包识别的 Application ID
(1) Application ID 简介
Application ID 简介 :
-- 作用 : 在 Android 编译系统中, Application ID 唯一性地标识 Android 应用 APK 文件的发布的包名;
-- 位置 : Application ID 在 Moudle 下的 build.gradle 中定义;
defaultConfig { applicationId "com.danielkim.soundrecorder" minSdkVersion 16 targetSdkVersion 21 versionCode 5 versionName "1.2.2" }
-- 注意 : Application ID 只在 build.gradle 文件中定义, 不在 AndroidManifest.xml 中定义;
(2) Application ID 变体
Application ID 变体 : 当使用编译变体时, 编译系统允许使用不同的 Application ID 去标识不同的产品风格 和 编译类型 的包;
-- 不同变体 : 编译 特殊产品特性 类型 的 Application ID 需要加上一个后缀;
productFlavors { pro { applicationId = "com.example.my.pkg.pro" } free { applicationId = "com.example.my.pkg.free" } } buildTypes { debug { applicationIdSuffix ".debug" } } ....
(3) 包名
包名简介 :
-- 定义位置 : 如果在 manifest.xml 中指定包名, 必须在 src/main 特定目录下的 指定 AndroidManifest.xml 中定义;
-- 主要作用 : 指向 R 文件, 解决 Activity, Service 等相关组件的注册的问题;
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.danielkim.soundrecorder" > ... ...
-- 多个包名 : 如果有多个 manifest.xml 配置文件, 如针对一个产品特性的 manifest.xml 配置文件, 针对某种类型的 manifest.xml 配置文件, 包名在这些配置文件中是可选的;
四. 调试 和 执行
1. Android 虚拟机管理 (Android Virtual Device Manager)
AVD 简介 :
-- 新特性 : AVD 更新了屏幕的链接, 帮你选择最流行的设备配置, 屏幕大小 和 app 展示解决方案;
-- 启动 : 点击 工具栏中得 Android Virtual Device Manager 图标, 即弹出下面虚拟机管理的对话框;
-- 自带虚拟机 : AVD Manager 自带了 Nexus 6 和 Nexus 9 的虚拟机, 同时也支持创建传统的 Android 设备, 这些设备有基于特定虚拟机的属性的皮肤, 并设定这些皮肤到硬件配置;
-- x86 虚拟机 : Android Studio 安装了 Intel x86 硬件加速运行管理器 (Hardware Accelerated Execution Manager, HAXM) 虚拟机, 创建默认的虚拟机用于快速地 app 原型设计;
2. 内存管理器
内存管理器简介 :
-- 功能简介 : Android Studio 提供了一个内存管理器界面, 可以更容易的监控内存使用状况, 查找释放对象, 定位内存泄露, 追踪所连接设备设备的内存使用状况;
-- 启动方式 : 根据你 运行在手机 或者 虚拟机 的 app, 点击右下角的内存管理器按钮, 进入内存管理器界面;
-- 注意 : 在使用 debug 模式时才会显示内存管理, 的实际数据, 否则会显示没有 debug 的程序;
3. Lint 编译检查
(1) 检查内容
Lint 检查条目 :
-- Cipher.getInstance() 使用安全值;
-- 使用传统的视图组件 View, 仍然使用之前的类名;
-- Fragment 注入的安全检查;
-- Gradle 插件版本与 SDK 兼容;
-- 所需 API 版本;
(2) 错误提示
错误提示功能 :
-- 错误提示修改 : 将鼠标放在 Lint 错误上, 会出现一个问题描述, 以及给出一个简单地解决方案;
-- 错误连接 : 这里还会在错误信息的最后有一个有帮助的超链接, 连接到额外的错误信息处;
(3) Lint 配置
Lint 配置 :
-- 配置方式 : 在 Android Studio 中可以 为单个的特殊编译配置版本 运行 Lint, 也可以为所有的编译配置版本运行 Lint;
-- 具体配置 : 在 build.gradle 配置文件中, 添加一个 lintOption 属性;
android { lintOptions { // set to true to turn off analysis progress reporting by lint quiet true // if true, stop the gradle build if errors are found abortOnError false // if true, only report errors ignoreWarnings true
4. 日志信息
日志简介 :
-- 作用 : 在编译 运行 Android Studio 应用时, 你可以查看 adb 和 设备 日志信息 在 DDMS 面板中, Debug 调试器中可以找到完整的 DDMS 工具集合, 控制设备行为;
-- 启动 : 如果开发者要去 调试 Android 调试器, 点击底部工具栏的 Android 按钮;
-- 布局层级监控 : 包括 视图组件层级查看器 去帮助开发者优化布局;
五. 安装 配置 更新管理
1. Android Studio 安装配置向导
安装向导 :
-- 安装过程 : 一个更新的安装和设置向导, 通过一步一步的安装 和 配置过程, 检查系统的要求 (如 JDK 和 可用的内存容量), 然后提示可选的安装选项, 例如 Intel 的模拟加速器;
-- 创建虚拟机 : 更新配置向导让开发者通过安装过程, 同时向导更新 系统镜像 和 模拟器需求, 比如 GPU, 之后创建一个 基于 Android 5 平台的 可选的默认的 性能高可靠的模拟器;
2. 扩展模板 和 支持要素
扩展模板 : Android Studio 支持 Google 服务的新模板, 扩展可用的设备类型;
3. Android 可穿戴 和 电视支持
工程配置 :
-- 设备类型选择 : 为了更容易跨平台开发, 工程向导提供了新的模板 为 Android 可穿戴 和 电视设备 创建你的应用;
-- 版本选择 : 创建工程过程中, 项目向导弹出一个对话框展示了 API 列表, 开发者从该列表中选择 项目的 最小版本;
4. 继承 Google App Engine (Google 云平台)
集成云平台简介 : 快速集成云平台, 使用 Google App Engine 连接到 Google 云平台, 并创建一个云端点;
-- 创建方法 : 菜单栏 File -> New Moudle -> App Engine Java Servlet Module, 并指定 模块 包 客户端 名称;
5. 更新通道
Android Studio 更新通道简介 : AS 提供了四种途径 基于你的代码偏好 保持软件是最新的;
-- Canary 通道 : 每周都更新一次, 同时这些版本正在测试, 这些版本有很多漏洞, 但是官方希望尽早地让开发者知道 AS 的新特性, 不推荐用于实际生产环境开发场景;
-- Dev 通道 : 精心挑选 canary 特性中得经过时间考验并能稳定运行的特性, 大约每两周 或 一个月更新一次;
-- Beta 通道 : 正式版本发布前发布的测试版本;
-- 稳定版本通道 : 经过测试的稳定版本, 用于正式的生产环境开发;
-- 更新配置 :
六. 其它注意点
1. Translation 编辑器
翻译编辑器 :
-- 作用 : 翻译编辑器插件 增强了多语言支持, 使用该编辑器可以更容易的将本地信息添加到 app 的翻译文件中;
-- 颜色代码 : 有颜色的代码表明 一种语言是否翻译完成, 或者没有对某些字符串进行翻译;
-- Google 翻译服务 : 开发者可以使用该插件, 将要翻译的字符串导出到 Google Play Developer Console 中翻译, 翻译完成后下载并导入到工程中;
翻译编辑器 :
-- 右键点击 string.xml 文件, 弹出下面对话框 :
-- 翻译编辑器界面 :
2. 最新 API 支持
关于最新 API 支持 :
-- 向下兼容 : Android Studio 支持最新的 Material Design 主题, 组件, 图形, 如阴影, 还支持 API 的向下兼容;
-- 新属性 : 支持 drawable 的最新 xml 属性, 如 <ripple /> , <annimated-selector /> 等等;
-- 导入示例 : AS 能更容易地从 GitHub 上获取 Android 示例源码;
-- 导入方式 : 从文件菜单选择 File -> Import Samples, 或者从欢迎界面中提供的导入按钮导入, 会导入 GitHub 上得示例源码;
参考文档 :
-- 遇到的问题及解决方案: http://blog.csdn.net/gtsong/article/details/21441411
-- Gradle 系列教程 : http://segmentfault.com/a/1190000002411926
-- Gradle 基础 : http://stormzhang.com/devtools/2014/12/18/android-studio-tutorial4/
-- eclipse 源码导入 AS : http://www.cnblogs.com/ct2011/p/4183553.html
-- 大牛教程一 : http://blog.csdn.net/ryantang03/article/details/8948037
-- 大牛教程二 : http://blog.csdn.net/ryantang03/article/details/8948037
-- 依赖 : http://my.oschina.net/u/1471093/blog/341990
【Android应用开发】Android Studio 简介 (Android Studio Overview)的更多相关文章
- uni-app&H5&Android混合开发三 || uni-app调用Android原生方法的三种方式
前言: 关于H5的调用Android原生方法的方式有很多,在该片文章中我主要简单介绍三种与Android原生方法交互的方式. 一.H5+方法调用android原生方法 H5+ Android开发规范官 ...
- Android NFC开发(二)——Android世界里的NFC所具备的条件以及使用方法
Android NFC开发(二)--Android世界里的NFC所具备的条件以及使用方法 NFC的应用比较广泛,而且知识面也是比较广的,所以就多啰嗦了几句,我还还是得跟着官方文档:http://dev ...
- Android高效开发环境(Genymotion,Gradle,Andriod Studio)
临近十一,项目接近上线,终于有些碎片时间可以查看一些博客. 这篇博客是Android开发大牛Cyril Mottier在去年写的博客,我把它翻译一下共享给国内志同道合的朋友,同时也是对自己一个很好的锻 ...
- 【Android 应用开发】 Ubuntu 安装 Android Studio (旧版本|仅作参考)
. 果断换Ubuntu了, Ubuntu的截图效果不好, 不能设置阴影 ... 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article ...
- 写给Android App开发人员看的Android底层知识(2)
(五)AMS 如果站在四大组件的角度来看,AMS就是Binder中的Server. AMS全称是ActivityManagerService,看字面意思是管理Activity的,但其实四大组件都归它管 ...
- [Android游戏开发]八款开源 Android 游戏引擎 (巨好的资源)
初学Android游戏开发的朋友,往往会显得有些无所适从,他们常常不知道该从何处入手,每当遇到自己无法解决的难题时,又往往会一边羡慕于 iPhone下有诸如Cocos2d-iphone之类的免费游戏引 ...
- 【Android 应用开发】Ubuntu 下 Android Studio 开发工具使用详解 (旧版本 | 仅作参考)
. 基本上可以导入项目开始使用了 ... . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21035637 ...
- 【Android 应用开发】Ubuntu 下 Android Studio 开发工具使用详解
. 基本上可以导入项目开始使用了 ... . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21035637 ...
- Android UI开发神兵利器之Android Asset Studio
Android Asset Studio 这个工具提供了一系列的资源设计实现,很推荐:
随机推荐
- [BZOJ]1014 火星人prefix(JSOI2008)
一边听省队dalao讲课一边做题真TM刺激. BZOJ的discuss简直就是题面plus.大样例.SuperHINT.dalao题解的结合体. Description 火星人最近研究了一种操作:求一 ...
- Go实现海量日志收集系统(三)
再次整理了一下这个日志收集系统的框,如下图 这次要实现的代码的整体逻辑为: 完整代码地址为: https://github.com/pythonsite/logagent etcd介绍 高可用的分布式 ...
- 运行C++程序是出现错误:cannot open Debug/1.exe for writing
今天,打开VC6.0环境编了个小程序,谁知给我报了“cannot open Debug/1.exe for writing”这样一个错,然后,我就纳闷了,这是什么错丫? 想了半天,后想通,为什么会这样 ...
- Python中str字符串的功能介绍
Str字符串的功能介绍 1. 字符串的操作 字符串的连接操作 符号: + 格式:str1 + str2 例如:str1 = 'I Love' str2 = 'You!' print(str1 + st ...
- js 输入密码框遇到的问题
上次公司项目需要用到密码输入框,如图所示: 首先设计是设置六个div,然后放置六个input. 动态方面然根据键盘onkey事件进行判断,当按键放松时使前一个input失去焦点,下一个input获取焦 ...
- idea,mybatis读取配置文件报错:Could not find resource configuration.xml
在pom.xml中,把xml文件加入编译,成功解决问题. <build> <resources> <resource> <directory>src/m ...
- log4j日志的基本使用方法(1)——概述、配置文件
一.概述 Log4j由三个重要的组件构成:日志信息的优先级,日志信息的输出目的地,日志信息的输出格式.日志信息的优先级从高到低有ERROR.WARN.INFO.DEBUG,分别用来指定这条日志信息的重 ...
- 手把手教你全家桶之React(一)
前言 最近项目用到react,其实前年我就开始接触react,时光匆匆,一直没有时间整理下来(太懒啦)!如今再次用到,称工作间隙,对全家桶做一次总结,项目源码地址.废话不多说,上码. 创建一个文件目录 ...
- net框架运行原理
核心是CLR(通用语言运行时), c#或者其它各种语言编译原理:将原代码通过相对的编译器(语法检查原代码分析)生成IL代码托管(IL也称托管代码),最后得到一个托管模块,一个或多个托管模块组成程序集( ...
- 学习ASP.NET Core Razor 编程系列七——修改列表页面
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...