📄 jcrespec04selection.html
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"><HTML LANG="en"><HEAD><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-1"><META HTTP-EQUIV="Content-Style-Type" CONTENT="text/css"><META NAME="GENERATOR" CONTENT="Adobe FrameMaker 7.0/HTML Export Filter"><LINK REL="STYLESHEET" HREF="unx_unstr_styles.css" CHARSET="ISO-8859-1" TYPE="text/css"><META name="DC.TITLE" content="Runtime Environment Specification for the Java Card Platform, Version 2.2.2"><TITLE>C H A P T E R 4 - Logical Channels and Applet Selection </TITLE></HEAD><BODY BGCOLOR="#ffffff"><DIV><div class="navbar" align="center"><table dir="LTR" summary="Navigation bar, includes the book title and navigation buttons" width=100% cellpadding="0" cellspacing="0" border="0"><colgroup span="2" width="100%"><col id="1" span="1" width="50%"><col id="2" span="1" width="50%"><tr bgcolor="#cccccc"><td class="navbartitle" align=left rowspan="1" colspan="1" abbr="ChapTitle"> Runtime Environment Specification for the Java Card Platform, Version 2.2.2</td><td valign="top" align="right" rowspan="1" colspan="1" abbr="NavButtons"><a href="index.html"><img src="shared/toc01.gif" title="Table Of Contents" alt="Table Of Contents" width="30" height="26" border="0"></a><a href="JCRESpec03appletlife.html"><img src="shared/prev01.gif" title="Previous Chapter" alt="Previous Chapter" width="30" height="26" border="0"></a><a href="JCRESpec05transient.html"><img src="shared/next01.gif" title="Next Chapter" alt="Next Chapter" width="30" height="26" border="0"></a><a href="ix.html"><img src="shared/index01.gif" title="Book Index" alt="Book Index" width="30" height="26" border="0"></a></td></tr></table><br><br></div></DIV><TABLE DIR="LTR" SUMMARY="Chapter Number" ABBR="ChapNum" WIDTH="100%" BORDER="0"><COLGROUP SPAN="1" WIDTH="100%"><COL ID="1" SPAN="1"><TR><TD ALIGN="right" CLASS="ChapNumber"><SPAN CLASS="ChapNumPrefix"><A NAME="pgfId-409566"></A>C H A P T E R </SPAN> <SPAN CLASS="ChapNumNum">4</SPAN><A NAME="57085"></A></TD></TR></TABLE><TABLE DIR="LTR" SUMMARY="Chapter Title" ABBR="ChapTitle" WIDTH="100%" BORDER="0"><COLGROUP SPAN="1" WIDTH="100%"><COL ID="1" SPAN="1" WIDTH="100%"><TR><TD ALIGN="right" CLASS="ChapTitle"><HR SIZE=7 NOSHADE><A NAME="pgfId-409567"></A><A NAME="marker-419752"></A>Logical Channels and Applet <A NAME="87111"></A>Selection</TD></TR></TABLE><P CLASS="Paragraph"><A NAME="pgfId-415904"></A>Java Card platform, version 2.2.2, provides support for logical channels: The ability to allow a terminal to open up to twenty sessions into the smart card over any I/O interface, one session per logical channel. Logical channels functionality is described in detail in the <EM CLASS="Emphasis">ISO 7816-4:2005 Specification</EM>.</P><P CLASS="Paragraph"><A NAME="pgfId-415907"></A>Cards receive requests for service from the CAD in the form of APDUs. The SELECT FILE APDU and MANAGE CHANNEL OPEN APDU are used by the Java Card RE to designate the <A NAME="marker-419753"></A>active applet instance for a logical channel session. Once selected, an applet instance receives all subsequent APDUs dispatched to that logical channel, until the applet instance becomes deselected.</P><P CLASS="Paragraph"><A NAME="pgfId-426178"></A>Some cards support only the contacted I/O interface conforming to ISO 7816 specifications, and some support only the contactless I/O interface based on the ISO 14443 specifications. Yet others are able to support both types of I/O interfaces. Logical channel sessions as described in this chapter may be supported over either interface. In addition, a card may be able to sustain logical channel sessions over both interfaces simultaneously.</P><P CLASS="Paragraph"><A NAME="pgfId-426868"></A>An implementation may support between 1 and 20 logical channels over the contacted I/O interface. Similarly, an implementation may support between 1 and 20 logical channels over the contactless I/O interface. When both I/O interfaces are concurrently active, the number of logical channels supported on each of the two interfaces is also implementation specific.</P><BR><HR NOSHADE SIZE=1><TABLE CLASS="TipNote" DIR="LTR" WIDTH="100%" SUMMARY="TipNote"><COLGROUP SPAN="1" WIDTH="100%"><TR ALIGN="left" VALIGN="top"><TD ROWSPAN="1" COLSPAN="1" ABBR="TipNoteText"><P CLASS="TipNote"><B CLASS="TipNote">Note - </B><A NAME="pgfId-426869"></A>To establish a card session over both contacted and contactless interfaces concurrently, the CAD must initiate the contacted session first. A power loss or card reset on the contacted interface results in a card tear and card reset event even if a contactless session is in progress. An RF signal loss on the contactless interface must not affect an ongoing contacted session.</P></TD></TR></TABLE><HR NOSHADE SIZE=1><BR><P CLASS="Paragraph"><A NAME="pgfId-426196"></A>The Java Card RE processes APDUs sequentially whether received over the same I/O interface or over two different I/O interfaces. The I/O subsystem must present concurrently received APDUs to the Java Card RE command dispatcher sequentially. The arbitration required to make concurrently received APDU commands sequential, as well as the mechanisms used to ensure proper synchronization with the CAD (for contact) and with the proximity coupling device, PCD (for contactless), are not specified in this specification. The I/O subsystem must ensure that APDU commands received over the contactless I/O interface are given higher priority, but without causing a timeout on any concurrently received APDU command over the contacted I/O interface. The algorithm used for this purpose is not specified in this specification.</P><P CLASS="Paragraph"><A NAME="pgfId-415912"></A>A new applet written for version 2.2.* of the Java Card platform can be designed to take advantage of logical channel support. Such an applet can take advantage of <A NAME="marker-419754"></A>multi-session functionality, can be concurrently selected alongside another applet on a different logical channel, and even be selected multiple times simultaneously on different logical channels. As shown in <A HREF="JCRESpec04selection.html#66307" CLASS="XRef">FIGURE 4-1</A>, an implementation may support from one to twenty logical channels on each I/O interface, each with its own distinct <KBD CLASS="Filename-Command">CLEAR_ON_DESELECT</KBD> memory segment.</P><P CLASS="Paragraph"><A NAME="pgfId-415950"></A>Only one logical channel, logical channel number 0 (the <A NAME="marker-419755"></A>basic logical channel) becomes active on the contacted I/O interface following a card reset. Similarly, only one logical channel, logical 0 (the basic logical channel) becomes active on the contactless I/O interface following a PICC activation sequence. A MANAGE CHANNEL APDU command may be issued on this logical channel to instruct the card to open a new logical channel. Applet instances can be selected on different logical channels using the SELECT FILE APDU command, just as they would in a single logical channel environment. The MANAGE CHANNEL APDU command is also used for closing a logical channel. Note that the basic logical channel is permanent and can never be closed as long as the I/O interface remains activated.</P><P CLASS="Paragraph"><A NAME="pgfId-426230"></A>On a card that is able to sustain logical channel sessions over both interfaces simultaneously, there are two sets of twenty logical channels possible. A logical channel number 0 on the contacted I/O interface is not the same as the logical channel number 0 on the contactless I/O interface. An applet instance selected on a logical channel on the contacted I/O interface would normally receive APDUs only from the contacted I/O interface. However, it can receive APDUs from the contactless I/O interface also, only if the applet instance is concurrently selected on a logical channel on the contactless I/O interface. Rules of multiselection apply as described in <A HREF="JCRESpec04selection.html#32535" CLASS="XRef">Section 4.2, Multiselectable Applets</A>.</P><P CLASS="Paragraph"><A NAME="pgfId-426482"></A><A NAME="marker-426481"></A>Legacy applets (written for version 2.1 of the Java Card platform) running on version 2.2.*, need not be aware of logical channel support to work correctly. The Java Card RE must guarantee that an applet that was not designed to be aware of multiple sessions is not selected more than once or concurrently with another applet from the same package.</P><BR><P CLASS="FigureBox-Wide"><A NAME="pgfId-428599"></A><CAPTION CLASS="FigureCaption-Wide"><A NAME="pgfId-426484"></A>FIGURE 4-1 <A NAME="66307"></A>Logical Channels for Distinct Applets </CAPTION></P><IMG SRC="figures/JCRESpec04selection-4.jpg" ALIGN="BASELINE"><BR><P CLASS="Paragraph"><A NAME="pgfId-420494"></A>Support for multiple logical channels (with multiple selected applet instances) requires a change to the Java Card platform version 2.1.* concept of <A NAME="marker-420495"></A>selected applet. Because more than one applet instance can be selected at the same time, and one applet instance can be selected on different logical channels simultaneously, it is necessary to differentiate the state of the applet instances in more detail.</P><P CLASS="Paragraph"><A NAME="pgfId-416010"></A>An applet instance is be considered an <A NAME="marker-419758"></A>active applet instance if it is currently selected in at least one logical channel, up to a maximum of forty. Each active applet instance from a distinct package executes with a distinct <KBD CLASS="Filename-Command">CLEAR_ON_DESELECT</KBD> transient memory segment, see <A HREF="JCRESpec04selection.html#66307" CLASS="XRef">FIGURE 4-1</A>. An applet instance is the <A NAME="marker-419759"></A>currently selected applet instance only if it is processing the current command. There can only be one currently selected applet instance at a given time.</P><P CLASS="Paragraph"><A NAME="pgfId-425114"></A>Applets with the capability of being selected on multiple logical channels at the same time, or accepting other applets belonging to the same package being selected simultaneously, are referred to as <A NAME="marker-419760"></A>multiselectable applets. (Refer to <A HREF="JCRESpec04selection.html#66786" CLASS="XRef">FIGURE 4-2</A> below.)</P><P CLASS="Paragraph"><A NAME="pgfId-416052"></A>No applet is active on the new (or only) logical channel when one of the following occurs:</P><UL><LI CLASS="Bullet1"><A NAME="pgfId-426239"></A>The card is reset and no applet is designated as the default applet instance for the basic channel on the contacted I/O interface, or the default applet instance for the basic channel on the contacted I/O interface rejects selection.</LI><P CLASS="Linebreak"></P><LI CLASS="Bullet1"><A NAME="pgfId-406295"></A>The card successfully completes its PICC activation sequence and no applet is designated as the default applet instance for the basic channel on the contactless I/O interface, or the default applet instance for the basic channel on the contactless I/O interface rejects selection.</LI><P CLASS="Linebreak"></P><LI CLASS="Bullet1"><A NAME="pgfId-414658"></A>A MANAGE CHANNEL OPEN command on the basic channel opens a new channel, and no applet is designated as the <A NAME="marker-419761"></A>default applet instance for that logical channel.</LI><P CLASS="Linebreak"></P><LI CLASS="Bullet1"><A NAME="pgfId-419191"></A>A new logical channel is opened when a MANAGE CHANNEL OPEN command is issued on a logical channel other than the basic channel, on which there is no active applet.</LI><P CLASS="Linebreak"></P><LI CLASS="Bullet1"><A NAME="pgfId-425905"></A>A SELECT FILE command fails when attempting to select an applet instance.</LI><P CLASS="Linebreak"></P></UL><H2 CLASS="Head1"><A NAME="pgfId-425907"></A><DIV><HR ALIGN=left SIZE=6 WIDTH=15% noshade></DIV>4.1 <A NAME="52464"></A>Default Applets</H2><P CLASS="Paragraph"><A NAME="pgfId-425908"></A>Normally, applet instances become selected only via a successful SELECT FILE command. However, some smart card CAD applications require a <A NAME="marker-425909"></A>default card applet instance to become implicitly selected after every card reset. In addition, some CAD applications may also require a default applet selection when a new logical channel is opened.</P><P CLASS="Paragraph"><A NAME="pgfId-426243"></A>In a similar manner, smart card proximity coupling device (PCD) applications require a default card applet instance to become implicitly selected after the proximity card (PICC) activation sequence successfully completes. In addition, default applet selection may also be required on each new logical channel opened during the contactless session.</P><P CLASS="Paragraph"><A NAME="pgfId-416106"></A>The Java Card platform allows the card implementer to designate a default applet instance for each of the logical channels supported by the card. For any logical channel, the card implementation may designate an applet instance as the default applet instance for that logical channel. Alternatively, for any logical channel, the implementation may choose to designate no default applet instance at all. Logical channels may share the same applet instance as the default applet instance for more than one channel.</P><P CLASS="Paragraph"><A NAME="pgfId-425627"></A>Upon card reset on the contacted interface and upon the completion of the PICC activation sequence on the contactless interface, only the <A NAME="marker-425626"></A>basic logical channel (channel 0) is automatically opened. The default card applet instance for the contacted interface, if any, is therefore the default applet instance for logical channel 0 on the contacted interface. Similarly, the default card applet instance for the contactless interface, if any, is therefore the default applet instance for logical channel 0 on the contactless interface. A card that supports both I/O interfaces could designate a different applet instance as default for each interface.</P><H3 CLASS="Head2"><A NAME="pgfId-425630"></A>4.1.1 <A NAME="marker-425629"></A>Card Reset Behavior</H3><P CLASS="Paragraph"><A NAME="pgfId-425637"></A>The following describes card reset behavior:</P><P CLASS="List1"><A NAME="pgfId-416125"></A>1. After card reset (or power on, which is a form of reset) on the contacted I/O interface, the Java Card RE performs its initialization and checks to see if its internal state indicates that a particular applet instance is the default applet instance for the basic logical channel. If so, the Java Card RE makes this applet instance the currently selected applet instance on the basic logical channel, and the applet's <KBD CLASS="Filename-Command">select</KBD> method is called. If this method throws an exception or returns <KBD CLASS="Filename-Command">false</KBD>, the Java Card RE sets its state to indicate that no applet is active on the basic logical channel.</P><P CLASS="ParaIndent1"><A NAME="pgfId-419961"></A>When a default card applet instance becomes active upon card reset, it shall not require its <KBD CLASS="Filename-Command">process</KBD> method to be called. The applet instance's <KBD CLASS="Filename-Command">process</KBD> method is not called during default applet selection because there is no SELECT FILE APDU.</P><P CLASS="List1-"><A NAME="pgfId-419962"></A>2. The Java Card RE ensures that the Answer to Reset (ATR) was sent and the card is now ready to accept APDU commands.</P><H3 CLASS="Head2"><A NAME="pgfId-426270"></A>4.1.2 Proximity Card (PICC) Activation Behavior</H3><P CLASS="Paragraph"><A NAME="pgfId-426271"></A>The following describes the PICC activation behavior:</P><P CLASS="List1"><A NAME="pgfId-426272"></A>1. After the successful completion of the PICC activation sequence on the contactless interface, the Java Card RE performs its initialization, if the contacted interface is not already active, and then checks to see if its internal state indicates that a particular applet instance is the default applet instance for the basic logical channel on the contactless I/O interface. If the default applet is not a multiselectable applet (see <A HREF="JCRESpec04selection.html#32535" CLASS="XRef">Section 4.2, Multiselectable Applets</A>) and either an instance of the default applet is already active on the contacted interface, or another applet instance from the same package is active on the contacted interface, the Java Card RE sets its state to indicate that no applet is active on the basic logical channel. Otherwise, the Java Card RE makes this applet instance the currently selected applet instance on the basic logical channel on the contactless I/O interface, and the applet's <KBD CLASS="Filename-Command">select</KBD> method is called. If this method throws an exception or returns <KBD CLASS="Filename-Command">false</KBD>, the Java Card RE sets its state to indicate that no applet is active on the basic logical channel on the contactless I/O interface.</P><P CLASS="ParaIndent1"><A NAME="pgfId-426295"></A>When a default card applet instance becomes active after the successful completion of the PICC activation sequence on the contactless interface, it shall not require its <KBD CLASS="Filename-Command">process</KBD> method to be called. The applet instance's <KBD CLASS="Filename-Command">process</KBD> method is not called during default applet selection because there is no SELECT FILE APDU.</P><P CLASS="List1-"><A NAME="pgfId-426296"></A>2. The Java Card RE ensures that the Answer to Select (ATS) was sent and the card is now ready to accept APDU commands.</P><H3 CLASS="Head2"><A NAME="pgfId-414606"></A>4.1.3 Default Applet Selection Behavior on Opening a New Channel</H3><P CLASS="Paragraph"><A NAME="pgfId-425644"></A>The following <A NAME="marker-419766"></A>default applet selection behavior occurs on opening a new logical channel.</P><P CLASS="Paragraph"><A NAME="pgfId-416206"></A>When a MANAGE CHANNEL command is issued on the basic logical channel and a new logical channel is opened, the Java Card RE checks if there is a designated default applet instance for the newly opened logical channel. If so, the Java Card RE makes this applet instance the currently selected applet instance on the new logical channel, and the applet's <KBD CLASS="Filename-Command">select</KBD> method (<KBD CLASS="Filename-Command">MultiSelectable.select</KBD> method if required) is called. If this method throws an exception or returns <KBD CLASS="Filename-Command">false</KBD>, then the Java Card RE closes the new logical channel. (The applet instance's <KBD CLASS="Filename-Command">process</KBD> method is not called during default applet selection, because there is no SELECT FILE APDU). A default applet instance shall not require its <KBD CLASS="Filename-Command">process</KBD> method to be called.</P><P CLASS="Paragraph"><A NAME="pgfId-416225"></A>If a default applet instance is successfully selected, then APDU commands can be sent directly to the applet instance on that logical channel. If no applet is active, then only SELECT FILE commands for applet selection or MANAGE CHANNEL commands can be processed on that logical channel.</P><P CLASS="Paragraph"><A NAME="pgfId-426299"></A>A MANAGE CHANNEL command issued over an I/O interface shall open a new logical channel only on the same I/O interface. Similarly a SELECT FILE command issued over an I/O interface to open a new logical channel shall open a new logical channel only on the same I/O interface.</P><P CLASS="Paragraph"><A NAME="pgfId-416229"></A>The mechanism for specifying the default applet instance for a logical channel is not defined in the Java Card API. It is a Java Card RE implementation detail and is left to the individual implementers.</P><H2 CLASS="Head1"><A NAME="pgfId-411529"></A><DIV><HR ALIGN=left SIZE=6 WIDTH=15% noshade></DIV>4.2 <A NAME="32535"></A>Multiselectable<A NAME="marker-419767"></A> Applets</H2><P CLASS="Paragraph"><A NAME="pgfId-416245"></A>Applets having the capability of being selected on multiple logical channels at the same time, or accepting other applets belonging to the same package being selected simultaneously, are referred to as multiselectable applets.</P><BR><HR NOSHADE SIZE=1><TABLE CLASS="TipNote" DIR="LTR" WIDTH="100%" SUMMARY="TipNote"><COLGROUP SPAN="1" WIDTH="100%"><TR ALIGN="left" VALIGN="top"><TD ROWSPAN="1" COLSPAN="1" ABBR="TipNoteText"><P CLASS="TipNote"><B CLASS="TipNote">Note - </B><A NAME="pgfId-420176"></A>All applets within a package shall be multiselectable or none shall be.</P></TD></TR></TABLE><HR NOSHADE SIZE=1><BR><P CLASS="Paragraph"><A NAME="pgfId-419068"></A>An <A NAME="marker-419768"></A>applet's context is active when either an instance of the applet is already active, or when another applet instance from the same package is active. For more information about contexts see <A HREF="JCRESpec06firewall.html#43635" CLASS="XRef">Section 6.1.2, Contexts and Context Switching</A>. An attempt to select an applet instance when the applet's context is active, is referred to as a <A NAME="marker-419769"></A>multiselection attempt. If successful, multiselection occurs, and the applet instance becomes multiselected.</P><P CLASS="Paragraph"><A NAME="pgfId-416286"></A>Multiselectable applets shall implement the <KBD CLASS="Filename-Command">javacard.framework.MultiSelectable</KBD> interface. In case of multiselection, the applet instance is informed by invoking its methods <KBD CLASS="Filename-Command">MultiSelectable.select</KBD> and <KBD CLASS="Filename-Command">MultiSelectable.deselect</KBD> during selection and deselection respectively.</P><P CLASS="Paragraph"><A NAME="pgfId-416314"></A>When an applet instance not currently active is the first one selected in its package, its <KBD CLASS="Filename-Command">Applet.select</KBD> method is called. Subsequent multiselections to this applet instance or selection of other applet instances in the same package shall result in a call to <KBD CLASS="Filename-Command">MultiSelectable.select</KBD> method. This method is defined in the <KBD CLASS="Filename-Command">MultiSelectable</KBD> interface. Its only purpose is to inform the applet instance that it will be multiselected. The applet instance may accept or reject a multiselection attempt.</P><P CLASS="Paragraph"><A NAME="pgfId-416345"></A>If a multiselection attempt is made on an applet which does not implement the <KBD CLASS="Filename-Command">MultiSelectable</KBD> interface, the selection shall be rejected by the Java Card RE.</P><P CLASS="Paragraph"><A NAME="pgfId-419131"></A>When a multiselected applet instance is deselected from one of the logical channels, the method <KBD CLASS="Filename-Command">MultiSelectable.deselect</KBD> is called. Only when the multiselected applet instance is the last active applet instance in the applet's context, is its regular method <KBD CLASS="Filename-Command">Applet.deselect</KBD> called.</P><P CLASS="Paragraph"><A NAME="pgfId-419132"></A>The following list describes the two cases of multiselection:</P><P CLASS="List1"><A NAME="pgfId-420498"></A>1. When two distinct applet instances from within the same package are multiselected, each applet instance shares the same <KBD CLASS="Filename-Command">CLEAR_ON_DESELECT</KBD> memory transient segment. The applet instances share objects within the context firewall as well as their transient data. The Java Card RE shall not reset this <KBD CLASS="Filename-Command">CLEAR_ON_DESELECT</KBD> transient objects until all applet instances within the package are deselected, see <A HREF="JCRESpec04selection.html#66786" CLASS="XRef">FIGURE 4-2</A>.</P><BR><P CLASS="FigureBox"><A NAME="pgfId-426959"></A><CAPTION CLASS="FigureCaption"><A NAME="pgfId-420571"></A>FIGURE 4-2 <A NAME="66786"></A>Different Applet Instances in Same Package </CAPTION></P><IMG SRC="figures/JCRESpec04selection-6.jpg" ALIGN="BASELINE"><BR><P CLASS="List1-"><A NAME="pgfId-416402"></A>2. When the same applet instance is multiselected on two different logical channels simultaneously, it shares the <KBD CLASS="Filename-Command">CLEAR_ON_DESELECT</KBD> memory segment space across logical channels. The Java Card RE shall not reset the <KBD CLASS="Filename-Command">CLEAR_ON_DESELECT</KBD> transient objects until all applet instances within the package are deselected, see <A HREF="JCRESpec04selection.html#44317" CLASS="XRef">FIGURE 4-3</A>.</P><BR><P CLASS="FigureBox"><A NAME="pgfId-426973"></A><CAPTION CLASS="FigureCaption"><A NAME="pgfId-420584"></A>FIGURE 4-3 <A NAME="44317"></A>Same Applet Instance Selected on Multiple Logical Channels </CAPTION></P><IMG SRC="figures/JCRESpec04selection-7.jpg" ALIGN="BASELINE"><BR><P CLASS="Paragraph"><A NAME="pgfId-416427"></A>In both cases of multiselection, the applets must implement the <KBD CLASS="Filename-Command">MultiSelectable</KBD> interface. If the applets do not support this feature, the selection must be rejected by the Java Card RE.</P><H2 CLASS="Head1"><A NAME="pgfId-414082"></A><DIV><HR ALIGN=left SIZE=6 WIDTH=15% noshade></DIV>4.3 <A NAME="13304"></A>Forwarding <A NAME="marker-419770"></A>APDU Commands To a Logical <A NAME="marker-419786"></A>Channel</H2><P CLASS="Paragraph"><A NAME="pgfId-426583"></A>According to Section 5.4 of the <EM CLASS="Emphasis">ISO 7816-4:2005 Specification</EM> specification, the interindustry values of the CLA byte equal to 0x0X and 0x1X in the APDU command encode channel numbers in the range 0-3, whereas interindustry values of the CLA byte equal to 0x4Y, 0x5Y, 0x6Y and 0x7Y in the APDU command encode channel numbers in the range 4-19.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -