1e41f4b71Sopenharmony_ci# Development Guidelines<a name="EN-US_TOPIC_0000001062229264"></a>
2e41f4b71Sopenharmony_ci
3e41f4b71Sopenharmony_ci## When to Use<a name="section93012287133"></a>
4e41f4b71Sopenharmony_ci
5e41f4b71Sopenharmony_ci-   Develop Page abilities for applications that have a UI for human-machine interaction, such as news applications, video players, navigation applications, and payment applications. Most applications we use in our daily lives are such type of applications.
6e41f4b71Sopenharmony_ci
7e41f4b71Sopenharmony_ci-   Develop Service abilities for applications so that they can run particular services in the background, such as music playing, computing, and navigation services.
8e41f4b71Sopenharmony_ci
9e41f4b71Sopenharmony_ci-   Pack both Page and Service abilities into HarmonyOS Ability Packages \(HAPs\). All applications must be packed into HAP files before being published to the application market. Once published, users can then download the applications from the application market.
10e41f4b71Sopenharmony_ci
11e41f4b71Sopenharmony_ci## Available APIs<a name="section11821047161319"></a>
12e41f4b71Sopenharmony_ci
13e41f4b71Sopenharmony_ci**Table  1**  APIs of the ability management framework
14e41f4b71Sopenharmony_ci
15e41f4b71Sopenharmony_ci<a name="table36761640135514"></a>
16e41f4b71Sopenharmony_ci<table><thead align="left"><tr id="row570215713380"><th class="cellrowborder" valign="top" width="53.849999999999994%" id="mcps1.2.3.1.1"><p id="p1703155733819"><a name="p1703155733819"></a><a name="p1703155733819"></a>Function</p>
17e41f4b71Sopenharmony_ci</th>
18e41f4b71Sopenharmony_ci<th class="cellrowborder" valign="top" width="46.150000000000006%" id="mcps1.2.3.1.2"><p id="p37035579380"><a name="p37035579380"></a><a name="p37035579380"></a>Description</p>
19e41f4b71Sopenharmony_ci</th>
20e41f4b71Sopenharmony_ci</tr>
21e41f4b71Sopenharmony_ci</thead>
22e41f4b71Sopenharmony_ci<tbody><tr id="row39211240205510"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p49215401550"><a name="p49215401550"></a><a name="p49215401550"></a>Want *WantParseUri(const char *uri)</p>
23e41f4b71Sopenharmony_ci</td>
24e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p592164014553"><a name="p592164014553"></a><a name="p592164014553"></a>Converts a specified character string into a <strong id="b123303298245"><a name="b123303298245"></a><a name="b123303298245"></a>Want</strong> object.</p>
25e41f4b71Sopenharmony_ci</td>
26e41f4b71Sopenharmony_ci</tr>
27e41f4b71Sopenharmony_ci<tr id="row192154055512"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p139212040175520"><a name="p139212040175520"></a><a name="p139212040175520"></a>const char *WantToUri(Want want)</p>
28e41f4b71Sopenharmony_ci</td>
29e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p9921640135519"><a name="p9921640135519"></a><a name="p9921640135519"></a>Converts a specified <strong id="b26361419162420"><a name="b26361419162420"></a><a name="b26361419162420"></a>Want</strong> object into a character string.</p>
30e41f4b71Sopenharmony_ci</td>
31e41f4b71Sopenharmony_ci</tr>
32e41f4b71Sopenharmony_ci<tr id="row16921440135520"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p1892124075519"><a name="p1892124075519"></a><a name="p1892124075519"></a>void SetWantElement(Want *want, ElementName element);</p>
33e41f4b71Sopenharmony_ci</td>
34e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p129214403555"><a name="p129214403555"></a><a name="p129214403555"></a>Sets the <strong id="b6704163515267"><a name="b6704163515267"></a><a name="b6704163515267"></a>element</strong> variable for a specified <strong id="b1759143810269"><a name="b1759143810269"></a><a name="b1759143810269"></a>Want</strong> object.</p>
35e41f4b71Sopenharmony_ci</td>
36e41f4b71Sopenharmony_ci</tr>
37e41f4b71Sopenharmony_ci<tr id="row3921114018552"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p79210404555"><a name="p79210404555"></a><a name="p79210404555"></a>void SetWantData(Want *want, const void *data, uint16_t dataLength)</p>
38e41f4b71Sopenharmony_ci</td>
39e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p09218402559"><a name="p09218402559"></a><a name="p09218402559"></a>Sets data to carry in a specified <strong id="b1317045311262"><a name="b1317045311262"></a><a name="b1317045311262"></a>Want</strong> object for starting a particular ability.</p>
40e41f4b71Sopenharmony_ci</td>
41e41f4b71Sopenharmony_ci</tr>
42e41f4b71Sopenharmony_ci<tr id="row892124013556"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p4921040155510"><a name="p4921040155510"></a><a name="p4921040155510"></a>bool SetWantSvcIdentity(Want *want, SvcIdentity sid)</p>
43e41f4b71Sopenharmony_ci</td>
44e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p992204013553"><a name="p992204013553"></a><a name="p992204013553"></a>Sets the <strong id="b171231625124319"><a name="b171231625124319"></a><a name="b171231625124319"></a>sid</strong> member variable for a specified <strong id="b11565173054314"><a name="b11565173054314"></a><a name="b11565173054314"></a>Want</strong> object.</p>
45e41f4b71Sopenharmony_ci</td>
46e41f4b71Sopenharmony_ci</tr>
47e41f4b71Sopenharmony_ci<tr id="row99221840135520"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p139221840155519"><a name="p139221840155519"></a><a name="p139221840155519"></a>void ClearWant(Want *want)</p>
48e41f4b71Sopenharmony_ci</td>
49e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p79221440185511"><a name="p79221440185511"></a><a name="p79221440185511"></a>Clears the memory of a specified <strong id="b233731018449"><a name="b233731018449"></a><a name="b233731018449"></a>Want</strong> object.</p>
50e41f4b71Sopenharmony_ci</td>
51e41f4b71Sopenharmony_ci</tr>
52e41f4b71Sopenharmony_ci<tr id="row69221640125519"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p1792244017555"><a name="p1792244017555"></a><a name="p1792244017555"></a>void SetMainRoute(const std::string &amp;entry)</p>
53e41f4b71Sopenharmony_ci</td>
54e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p7922174016558"><a name="p7922174016558"></a><a name="p7922174016558"></a>Sets the main route for the ability.</p>
55e41f4b71Sopenharmony_ci</td>
56e41f4b71Sopenharmony_ci</tr>
57e41f4b71Sopenharmony_ci<tr id="row189221840165516"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p3922340125511"><a name="p3922340125511"></a><a name="p3922340125511"></a>void SetUIContent(RootView *rootView)</p>
58e41f4b71Sopenharmony_ci</td>
59e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p9922240175511"><a name="p9922240175511"></a><a name="p9922240175511"></a>Sets the UI layout for the ability.</p>
60e41f4b71Sopenharmony_ci</td>
61e41f4b71Sopenharmony_ci</tr>
62e41f4b71Sopenharmony_ci<tr id="row159226407552"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p1292213402552"><a name="p1292213402552"></a><a name="p1292213402552"></a>void OnStart(const Want&amp; intent)</p>
63e41f4b71Sopenharmony_ci</td>
64e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p14922440195515"><a name="p14922440195515"></a><a name="p14922440195515"></a>Called when the ability is started. This callback is invoked to handle transitions between ability lifecycle states.</p>
65e41f4b71Sopenharmony_ci</td>
66e41f4b71Sopenharmony_ci</tr>
67e41f4b71Sopenharmony_ci<tr id="row1392217402551"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p1292284065516"><a name="p1292284065516"></a><a name="p1292284065516"></a>void OnStop()</p>
68e41f4b71Sopenharmony_ci</td>
69e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p149223403554"><a name="p149223403554"></a><a name="p149223403554"></a>Called when the ability is being destroyed. This callback is invoked to handle transitions between ability lifecycle states.</p>
70e41f4b71Sopenharmony_ci</td>
71e41f4b71Sopenharmony_ci</tr>
72e41f4b71Sopenharmony_ci<tr id="row169221407555"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p992218400556"><a name="p992218400556"></a><a name="p992218400556"></a>void OnActive(const Want&amp; intent)</p>
73e41f4b71Sopenharmony_ci</td>
74e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p1923440135515"><a name="p1923440135515"></a><a name="p1923440135515"></a>Called when the ability is visible to users. This callback is invoked to handle transitions between ability lifecycle states.</p>
75e41f4b71Sopenharmony_ci</td>
76e41f4b71Sopenharmony_ci</tr>
77e41f4b71Sopenharmony_ci<tr id="row9923640205516"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p19231340185511"><a name="p19231340185511"></a><a name="p19231340185511"></a>void OnInactive()</p>
78e41f4b71Sopenharmony_ci</td>
79e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p992311408556"><a name="p992311408556"></a><a name="p992311408556"></a>Called when the ability is invisible to users. This callback is invoked to handle transitions between ability lifecycle states.</p>
80e41f4b71Sopenharmony_ci</td>
81e41f4b71Sopenharmony_ci</tr>
82e41f4b71Sopenharmony_ci<tr id="row4923154015557"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p99233404556"><a name="p99233404556"></a><a name="p99233404556"></a>void OnBackground()</p>
83e41f4b71Sopenharmony_ci</td>
84e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p79238400554"><a name="p79238400554"></a><a name="p79238400554"></a>Called when the ability is moved to the background. This callback is invoked to handle transitions between ability lifecycle states.</p>
85e41f4b71Sopenharmony_ci</td>
86e41f4b71Sopenharmony_ci</tr>
87e41f4b71Sopenharmony_ci<tr id="row14923144045513"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p692354019558"><a name="p692354019558"></a><a name="p692354019558"></a>const SvcIdentity *OnConnect(const Want &amp;want)</p>
88e41f4b71Sopenharmony_ci</td>
89e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p17923154085512"><a name="p17923154085512"></a><a name="p17923154085512"></a>Called when the Service ability is connected for the first time.</p>
90e41f4b71Sopenharmony_ci</td>
91e41f4b71Sopenharmony_ci</tr>
92e41f4b71Sopenharmony_ci<tr id="row592313405552"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p1692312404551"><a name="p1692312404551"></a><a name="p1692312404551"></a>void OnDisconnect(const Want &amp;want);</p>
93e41f4b71Sopenharmony_ci</td>
94e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p892394017551"><a name="p892394017551"></a><a name="p892394017551"></a>Called when all abilities connected to the Service ability are disconnected.</p>
95e41f4b71Sopenharmony_ci</td>
96e41f4b71Sopenharmony_ci</tr>
97e41f4b71Sopenharmony_ci<tr id="row3923194075515"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p5923240175516"><a name="p5923240175516"></a><a name="p5923240175516"></a>void MsgHandle(uint32_t funcId, IpcIo *request, IpcIo *reply);</p>
98e41f4b71Sopenharmony_ci</td>
99e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p2923184055518"><a name="p2923184055518"></a><a name="p2923184055518"></a>Handles a message sent by the client to the Service ability.</p>
100e41f4b71Sopenharmony_ci</td>
101e41f4b71Sopenharmony_ci</tr>
102e41f4b71Sopenharmony_ci<tr id="row15923540155517"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p99231940105514"><a name="p99231940105514"></a><a name="p99231940105514"></a>void Dump(const std::string &amp;extra)</p>
103e41f4b71Sopenharmony_ci</td>
104e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p18924174016554"><a name="p18924174016554"></a><a name="p18924174016554"></a>Prints ability information to the console.</p>
105e41f4b71Sopenharmony_ci</td>
106e41f4b71Sopenharmony_ci</tr>
107e41f4b71Sopenharmony_ci<tr id="row1792414055517"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p1592454025513"><a name="p1592454025513"></a><a name="p1592454025513"></a>void Present(AbilitySlice *abilitySlice, const Want &amp;want)</p>
108e41f4b71Sopenharmony_ci</td>
109e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p11924104045517"><a name="p11924104045517"></a><a name="p11924104045517"></a>Presents another ability slice.</p>
110e41f4b71Sopenharmony_ci</td>
111e41f4b71Sopenharmony_ci</tr>
112e41f4b71Sopenharmony_ci<tr id="row15924114012556"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p13924154017551"><a name="p13924154017551"></a><a name="p13924154017551"></a>void Terminate()</p>
113e41f4b71Sopenharmony_ci</td>
114e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p11924104012557"><a name="p11924104012557"></a><a name="p11924104012557"></a>Destroys the ability slice.</p>
115e41f4b71Sopenharmony_ci</td>
116e41f4b71Sopenharmony_ci</tr>
117e41f4b71Sopenharmony_ci<tr id="row2092484010558"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p4924540155515"><a name="p4924540155515"></a><a name="p4924540155515"></a>void SetUIContent(RootView *rootView)</p>
118e41f4b71Sopenharmony_ci</td>
119e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p79241640185514"><a name="p79241640185514"></a><a name="p79241640185514"></a>Sets the UI layout for the host ability of the ability slice.</p>
120e41f4b71Sopenharmony_ci</td>
121e41f4b71Sopenharmony_ci</tr>
122e41f4b71Sopenharmony_ci<tr id="row16924640195518"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p169245407559"><a name="p169245407559"></a><a name="p169245407559"></a>void OnStart(const Want&amp; want)</p>
123e41f4b71Sopenharmony_ci</td>
124e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p492494095517"><a name="p492494095517"></a><a name="p492494095517"></a>Called when the ability slice is started. This callback is invoked to handle transitions between ability slice lifecycle states.</p>
125e41f4b71Sopenharmony_ci</td>
126e41f4b71Sopenharmony_ci</tr>
127e41f4b71Sopenharmony_ci<tr id="row15924154065513"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p159242407559"><a name="p159242407559"></a><a name="p159242407559"></a>void OnStop()</p>
128e41f4b71Sopenharmony_ci</td>
129e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p13924114017556"><a name="p13924114017556"></a><a name="p13924114017556"></a>Called when the ability slice is being destroyed. This callback is invoked to handle transitions between ability slice lifecycle states.</p>
130e41f4b71Sopenharmony_ci</td>
131e41f4b71Sopenharmony_ci</tr>
132e41f4b71Sopenharmony_ci<tr id="row13924154065517"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p292494005513"><a name="p292494005513"></a><a name="p292494005513"></a>void OnActive(const Want&amp; want)</p>
133e41f4b71Sopenharmony_ci</td>
134e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p89256408553"><a name="p89256408553"></a><a name="p89256408553"></a>Called when the ability slice is visible to users. This callback is invoked to handle transitions between ability slice lifecycle states.</p>
135e41f4b71Sopenharmony_ci</td>
136e41f4b71Sopenharmony_ci</tr>
137e41f4b71Sopenharmony_ci<tr id="row1925540125515"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p13925114015514"><a name="p13925114015514"></a><a name="p13925114015514"></a>void OnInactive()</p>
138e41f4b71Sopenharmony_ci</td>
139e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p892534025515"><a name="p892534025515"></a><a name="p892534025515"></a>Called when the ability slice is invisible to users. This callback is invoked to handle transitions between ability slice lifecycle states.</p>
140e41f4b71Sopenharmony_ci</td>
141e41f4b71Sopenharmony_ci</tr>
142e41f4b71Sopenharmony_ci<tr id="row692519401558"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p1792515408558"><a name="p1792515408558"></a><a name="p1792515408558"></a>void OnBackground()</p>
143e41f4b71Sopenharmony_ci</td>
144e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p292554013551"><a name="p292554013551"></a><a name="p292554013551"></a>Called when the ability slice is moved to the background. This callback is invoked to handle transitions between ability slice lifecycle states.</p>
145e41f4b71Sopenharmony_ci</td>
146e41f4b71Sopenharmony_ci</tr>
147e41f4b71Sopenharmony_ci<tr id="row129251040115515"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p0925174011553"><a name="p0925174011553"></a><a name="p0925174011553"></a>int StartAbility(const Want &amp;want)</p>
148e41f4b71Sopenharmony_ci</td>
149e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p129251408557"><a name="p129251408557"></a><a name="p129251408557"></a>Starts an ability based on the specified <strong id="b3667652155017"><a name="b3667652155017"></a><a name="b3667652155017"></a>Want</strong> information.</p>
150e41f4b71Sopenharmony_ci</td>
151e41f4b71Sopenharmony_ci</tr>
152e41f4b71Sopenharmony_ci<tr id="row3925940195519"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p19251440135512"><a name="p19251440135512"></a><a name="p19251440135512"></a>int StopAbility(const Want &amp;want)</p>
153e41f4b71Sopenharmony_ci</td>
154e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p19925174035510"><a name="p19925174035510"></a><a name="p19925174035510"></a>Stops a Service ability based on the specified <strong id="b1176241795114"><a name="b1176241795114"></a><a name="b1176241795114"></a>Want</strong> information.</p>
155e41f4b71Sopenharmony_ci</td>
156e41f4b71Sopenharmony_ci</tr>
157e41f4b71Sopenharmony_ci<tr id="row14925164055520"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p14925114015553"><a name="p14925114015553"></a><a name="p14925114015553"></a>int TerminateAbility()</p>
158e41f4b71Sopenharmony_ci</td>
159e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p39254405557"><a name="p39254405557"></a><a name="p39254405557"></a>Destroys the ability.</p>
160e41f4b71Sopenharmony_ci</td>
161e41f4b71Sopenharmony_ci</tr>
162e41f4b71Sopenharmony_ci<tr id="row19925940115515"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p892584015559"><a name="p892584015559"></a><a name="p892584015559"></a>int ConnectAbility(const Want &amp;want, const IAbilityConnection &amp;conn, void *data);</p>
163e41f4b71Sopenharmony_ci</td>
164e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p4926640165513"><a name="p4926640165513"></a><a name="p4926640165513"></a>Connects to a <strong id="b10891169125217"><a name="b10891169125217"></a><a name="b10891169125217"></a>Service</strong> ability based on the specified <strong id="b184091115165216"><a name="b184091115165216"></a><a name="b184091115165216"></a>Want</strong> information.</p>
165e41f4b71Sopenharmony_ci</td>
166e41f4b71Sopenharmony_ci</tr>
167e41f4b71Sopenharmony_ci<tr id="row10926540155513"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p119267409559"><a name="p119267409559"></a><a name="p119267409559"></a>int DisconnectAbility(const IAbilityConnection &amp;conn)</p>
168e41f4b71Sopenharmony_ci</td>
169e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p592644085512"><a name="p592644085512"></a><a name="p592644085512"></a>Disconnects from a <strong id="b37531635205214"><a name="b37531635205214"></a><a name="b37531635205214"></a>Service</strong> ability.</p>
170e41f4b71Sopenharmony_ci</td>
171e41f4b71Sopenharmony_ci</tr>
172e41f4b71Sopenharmony_ci<tr id="row11926340145516"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p892614035513"><a name="p892614035513"></a><a name="p892614035513"></a>const char *GetBundleName()</p>
173e41f4b71Sopenharmony_ci</td>
174e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p99261040105511"><a name="p99261040105511"></a><a name="p99261040105511"></a>Obtains the bundle name of the application to which the ability belongs.</p>
175e41f4b71Sopenharmony_ci</td>
176e41f4b71Sopenharmony_ci</tr>
177e41f4b71Sopenharmony_ci<tr id="row7926440125519"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p4926114065519"><a name="p4926114065519"></a><a name="p4926114065519"></a>const char *GetSrcPath()</p>
178e41f4b71Sopenharmony_ci</td>
179e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p4926194055516"><a name="p4926194055516"></a><a name="p4926194055516"></a>Obtains the source code path of the ability.</p>
180e41f4b71Sopenharmony_ci</td>
181e41f4b71Sopenharmony_ci</tr>
182e41f4b71Sopenharmony_ci<tr id="row29261840115519"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p1992604045519"><a name="p1992604045519"></a><a name="p1992604045519"></a>const char *GetDataPath()</p>
183e41f4b71Sopenharmony_ci</td>
184e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p109268403551"><a name="p109268403551"></a><a name="p109268403551"></a>Obtains the data path of the ability.</p>
185e41f4b71Sopenharmony_ci</td>
186e41f4b71Sopenharmony_ci</tr>
187e41f4b71Sopenharmony_ci<tr id="row29261940195516"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p159267407555"><a name="p159267407555"></a><a name="p159267407555"></a>int StartAbility(const Want *want)</p>
188e41f4b71Sopenharmony_ci</td>
189e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p1340210145179"><a name="p1340210145179"></a><a name="p1340210145179"></a>Starts an Ability. This function does not need to be used in applications developed based on <strong id="b12960101603119"><a name="b12960101603119"></a><a name="b12960101603119"></a>Ability</strong>.</p>
190e41f4b71Sopenharmony_ci</td>
191e41f4b71Sopenharmony_ci</tr>
192e41f4b71Sopenharmony_ci<tr id="row16926240155514"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p1792617404558"><a name="p1792617404558"></a><a name="p1792617404558"></a>int ConnectAbility(const Want *want, const IAbilityConnection *conn, void *data);</p>
193e41f4b71Sopenharmony_ci</td>
194e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p1092612181812"><a name="p1092612181812"></a><a name="p1092612181812"></a>Connects to a Service ability based on the specified <strong id="b71516265816"><a name="b71516265816"></a><a name="b71516265816"></a>Want</strong> information. This function does not need to be used in applications developed based on <strong id="b12877235205716"><a name="b12877235205716"></a><a name="b12877235205716"></a>Ability</strong>.</p>
195e41f4b71Sopenharmony_ci</td>
196e41f4b71Sopenharmony_ci</tr>
197e41f4b71Sopenharmony_ci<tr id="row5927164010552"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p49271540165510"><a name="p49271540165510"></a><a name="p49271540165510"></a>int DisconnectAbility(const IAbilityConnection *conn);</p>
198e41f4b71Sopenharmony_ci</td>
199e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p1296152820189"><a name="p1296152820189"></a><a name="p1296152820189"></a>Disconnects from a Service ability. This function does not need to be used in applications developed based on <strong id="b1866210445818"><a name="b1866210445818"></a><a name="b1866210445818"></a>Ability</strong>.</p>
200e41f4b71Sopenharmony_ci</td>
201e41f4b71Sopenharmony_ci</tr>
202e41f4b71Sopenharmony_ci<tr id="row89271040135517"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p13927194011558"><a name="p13927194011558"></a><a name="p13927194011558"></a>int StopAbility(const Want *want)</p>
203e41f4b71Sopenharmony_ci</td>
204e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p7699548131819"><a name="p7699548131819"></a><a name="p7699548131819"></a>Stops a Service ability based on the specified <strong id="b53334211588"><a name="b53334211588"></a><a name="b53334211588"></a>Want</strong> information. This function does not need to be used in applications developed based on <strong id="b1466212716581"><a name="b1466212716581"></a><a name="b1466212716581"></a>Ability</strong>.</p>
205e41f4b71Sopenharmony_ci</td>
206e41f4b71Sopenharmony_ci</tr>
207e41f4b71Sopenharmony_ci<tr id="row1992764065516"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p192716406556"><a name="p192716406556"></a><a name="p192716406556"></a>void (*OnAbilityConnectDone)(ElementName *elementName, SvcIdentity *serviceSid, int resultCode, void *data)</p>
208e41f4b71Sopenharmony_ci</td>
209e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p0927940195510"><a name="p0927940195510"></a><a name="p0927940195510"></a>Called when a client is connected to a Service ability.</p>
210e41f4b71Sopenharmony_ci</td>
211e41f4b71Sopenharmony_ci</tr>
212e41f4b71Sopenharmony_ci<tr id="row7927134010559"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p692764095510"><a name="p692764095510"></a><a name="p692764095510"></a>void (*OnAbilityDisconnectDone)(ElementName *elementName, int resultCode, void *data)</p>
213e41f4b71Sopenharmony_ci</td>
214e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p18927124035516"><a name="p18927124035516"></a><a name="p18927124035516"></a>Called after all connections to a Service ability are disconnected.</p>
215e41f4b71Sopenharmony_ci</td>
216e41f4b71Sopenharmony_ci</tr>
217e41f4b71Sopenharmony_ci<tr id="row692784020556"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p17927104010557"><a name="p17927104010557"></a><a name="p17927104010557"></a>void PostTask(const Task&amp; task)</p>
218e41f4b71Sopenharmony_ci</td>
219e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p13927940105516"><a name="p13927940105516"></a><a name="p13927940105516"></a>Posts a task to an asynchronous thread.</p>
220e41f4b71Sopenharmony_ci</td>
221e41f4b71Sopenharmony_ci</tr>
222e41f4b71Sopenharmony_ci<tr id="row392784013552"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p1092794014555"><a name="p1092794014555"></a><a name="p1092794014555"></a>void PostQuit()</p>
223e41f4b71Sopenharmony_ci</td>
224e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p19281940185510"><a name="p19281940185510"></a><a name="p19281940185510"></a>Quits the event loop of the current thread.</p>
225e41f4b71Sopenharmony_ci</td>
226e41f4b71Sopenharmony_ci</tr>
227e41f4b71Sopenharmony_ci<tr id="row2928140145519"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p292813401555"><a name="p292813401555"></a><a name="p292813401555"></a>static AbilityEventHandler* GetCurrentHandler()</p>
228e41f4b71Sopenharmony_ci</td>
229e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p9928154012554"><a name="p9928154012554"></a><a name="p9928154012554"></a>Obtains the event handler of the current thread.</p>
230e41f4b71Sopenharmony_ci</td>
231e41f4b71Sopenharmony_ci</tr>
232e41f4b71Sopenharmony_ci<tr id="row15928174035513"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p1692824017551"><a name="p1692824017551"></a><a name="p1692824017551"></a>void Run()</p>
233e41f4b71Sopenharmony_ci</td>
234e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p592820401558"><a name="p592820401558"></a><a name="p592820401558"></a>Starts running the event loop of the current thread.</p>
235e41f4b71Sopenharmony_ci</td>
236e41f4b71Sopenharmony_ci</tr>
237e41f4b71Sopenharmony_ci<tr id="row15928174013554"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p17928440125516"><a name="p17928440125516"></a><a name="p17928440125516"></a>#define REGISTER_AA(className)</p>
238e41f4b71Sopenharmony_ci</td>
239e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p1892817404554"><a name="p1892817404554"></a><a name="p1892817404554"></a>Registers the class name of an <strong id="b102356594597"><a name="b102356594597"></a><a name="b102356594597"></a>Ability</strong> child class.</p>
240e41f4b71Sopenharmony_ci</td>
241e41f4b71Sopenharmony_ci</tr>
242e41f4b71Sopenharmony_ci<tr id="row17928640135519"><td class="cellrowborder" valign="top" width="53.849999999999994%" headers="mcps1.2.3.1.1 "><p id="p199281640125520"><a name="p199281640125520"></a><a name="p199281640125520"></a>#define REGISTER_AS(className)</p>
243e41f4b71Sopenharmony_ci</td>
244e41f4b71Sopenharmony_ci<td class="cellrowborder" valign="top" width="46.150000000000006%" headers="mcps1.2.3.1.2 "><p id="p1792811409556"><a name="p1792811409556"></a><a name="p1792811409556"></a>Registers the class name of an <strong id="b691819710011"><a name="b691819710011"></a><a name="b691819710011"></a>AbilitySlice</strong> child class.</p>
245e41f4b71Sopenharmony_ci</td>
246e41f4b71Sopenharmony_ci</tr>
247e41f4b71Sopenharmony_ci</tbody>
248e41f4b71Sopenharmony_ci</table>
249e41f4b71Sopenharmony_ci
250e41f4b71Sopenharmony_ci## How to Develop<a name="section10514141679"></a>
251e41f4b71Sopenharmony_ci
252e41f4b71Sopenharmony_ci### Creating a Service Ability<a name="section19921154214315"></a>
253e41f4b71Sopenharmony_ci
254e41f4b71Sopenharmony_ci1.  Create the  **MyServiceAbility**  child class from  **Ability**  in  **my\_service\_ability.h**.
255e41f4b71Sopenharmony_ci
256e41f4b71Sopenharmony_ci    ```
257e41f4b71Sopenharmony_ci    class MyServiceAbility: public Ability {
258e41f4b71Sopenharmony_ci    protected:
259e41f4b71Sopenharmony_ci        void OnStart(const Want& want);
260e41f4b71Sopenharmony_ci        const SvcIdentity *OnConnect(const Want &want) override;
261e41f4b71Sopenharmony_ci        void MsgHandle(uint32_t funcId, IpcIo *request, IpcIo *reply) override;
262e41f4b71Sopenharmony_ci    };
263e41f4b71Sopenharmony_ci    ```
264e41f4b71Sopenharmony_ci
265e41f4b71Sopenharmony_ci2.  Call the  **REGISTER\_AA**  macro to register the  **ServiceAbility**  class with the application framework so that the framework can instantiate the  **MyServiceAbility**  class you have created.
266e41f4b71Sopenharmony_ci
267e41f4b71Sopenharmony_ci    ```
268e41f4b71Sopenharmony_ci    #include "my_service_ability.h"
269e41f4b71Sopenharmony_ci    
270e41f4b71Sopenharmony_ci    REGISTER_AA(ServiceAbility)
271e41f4b71Sopenharmony_ci    
272e41f4b71Sopenharmony_ci    void MyServiceAbility::OnStart(const Want& want)
273e41f4b71Sopenharmony_ci    {
274e41f4b71Sopenharmony_ci        printf("ServiceAbility::OnStart\n");
275e41f4b71Sopenharmony_ci        Ability::OnStart(want);
276e41f4b71Sopenharmony_ci    }
277e41f4b71Sopenharmony_ci    
278e41f4b71Sopenharmony_ci    const SvcIdentity *MyServiceAbility::OnConnect(const Want &want)
279e41f4b71Sopenharmony_ci    {
280e41f4b71Sopenharmony_ci        printf("ServiceAbility::OnConnect\n");
281e41f4b71Sopenharmony_ci        return Ability::OnConnect(want);
282e41f4b71Sopenharmony_ci    }
283e41f4b71Sopenharmony_ci    
284e41f4b71Sopenharmony_ci    void MyServiceAbility::MsgHandle(uint32_t funcId, IpcIo *request, IpcIo *reply)
285e41f4b71Sopenharmony_ci    {
286e41f4b71Sopenharmony_ci        printf("ServiceAbility::MsgHandle, funcId is %u\n", funcId);
287e41f4b71Sopenharmony_ci        int result = 0;
288e41f4b71Sopenharmony_ci        if (funcId == 0) {
289e41f4b71Sopenharmony_ci            result = IpcIoPopInt32(request) + IpcIoPopInt32(request);
290e41f4b71Sopenharmony_ci        }
291e41f4b71Sopenharmony_ci        // push data
292e41f4b71Sopenharmony_ci        IpcIoPushInt32(reply, result);
293e41f4b71Sopenharmony_ci    }
294e41f4b71Sopenharmony_ci    ```
295e41f4b71Sopenharmony_ci
296e41f4b71Sopenharmony_ci3.  Override the following lifecycle callbacks for Service abilities to implement your own logic for your Service ability. When overriding a lifecycle callback, you must call the corresponding function from the parent class.
297e41f4b71Sopenharmony_ci    -   OnStart\(\)
298e41f4b71Sopenharmony_ci
299e41f4b71Sopenharmony_ci        This callback is invoked when a Service ability is being created to perform Service ability initialization operations that take a short time. This callback is invoked only once in the entire lifecycle of a Service ability.
300e41f4b71Sopenharmony_ci
301e41f4b71Sopenharmony_ci        ```
302e41f4b71Sopenharmony_ci        void MyServiceAbility::OnStart(const Want& want)
303e41f4b71Sopenharmony_ci        {
304e41f4b71Sopenharmony_ci            printf("ServiceAbility::OnStart\n");
305e41f4b71Sopenharmony_ci            Ability::OnStart(want);
306e41f4b71Sopenharmony_ci        }
307e41f4b71Sopenharmony_ci        ```
308e41f4b71Sopenharmony_ci
309e41f4b71Sopenharmony_ci    -   OnConnect\(\)
310e41f4b71Sopenharmony_ci
311e41f4b71Sopenharmony_ci        This callback is invoked when another ability is connected to the Service ability. This callback returns an  **SvcIdentity**  object for the other ability to interact with the Service ability. 
312e41f4b71Sopenharmony_ci
313e41f4b71Sopenharmony_ci        ```
314e41f4b71Sopenharmony_ci        const SvcIdentity *MyServiceAbility::OnConnect(const Want &want)
315e41f4b71Sopenharmony_ci        {
316e41f4b71Sopenharmony_ci            printf("ServiceAbility::OnConnect\n");
317e41f4b71Sopenharmony_ci            return Ability::OnConnect(want);
318e41f4b71Sopenharmony_ci        }
319e41f4b71Sopenharmony_ci        ```
320e41f4b71Sopenharmony_ci
321e41f4b71Sopenharmony_ci    -   OnDisconnect​\(\)
322e41f4b71Sopenharmony_ci
323e41f4b71Sopenharmony_ci        This callback is invoked when another ability is disconnected from the Service ability.
324e41f4b71Sopenharmony_ci
325e41f4b71Sopenharmony_ci    -   OnStop\(\)
326e41f4b71Sopenharmony_ci
327e41f4b71Sopenharmony_ci        This callback is invoked when a Service ability is destroyed. You should override this callback for your Service ability to clear its resources, such as threads and registered listeners.
328e41f4b71Sopenharmony_ci
329e41f4b71Sopenharmony_ci4.  Override the message handling function.
330e41f4b71Sopenharmony_ci
331e41f4b71Sopenharmony_ci    The  **MsgHandle**  function is used by Service abilities to handle messages sent from clients.  **funcId**  indicates the type of the message sent from the client, and  **request**  indicates the pointer to the serialized request parameters sent from the client. If you want to send the result back after the message is handled, serialize the result and write it into  **reply**.
332e41f4b71Sopenharmony_ci
333e41f4b71Sopenharmony_ci    ```
334e41f4b71Sopenharmony_ci    void ServiceAbility::MsgHandle(uint32_t funcId, IpcIo *request, IpcIo *reply)
335e41f4b71Sopenharmony_ci    {
336e41f4b71Sopenharmony_ci        printf("ServiceAbility::MsgHandle, funcId is %d\n", funcId);
337e41f4b71Sopenharmony_ci        int result = 0;
338e41f4b71Sopenharmony_ci        if (funcId == PLUS) {
339e41f4b71Sopenharmony_ci            result = IpcIoPopInt32(request) + IpcIoPopInt32(request);
340e41f4b71Sopenharmony_ci        }
341e41f4b71Sopenharmony_ci        // push data
342e41f4b71Sopenharmony_ci        IpcIoPushInt32(reply, result);
343e41f4b71Sopenharmony_ci    }
344e41f4b71Sopenharmony_ci    ```
345e41f4b71Sopenharmony_ci
346e41f4b71Sopenharmony_ci5.  Register a Service ability.
347e41f4b71Sopenharmony_ci
348e41f4b71Sopenharmony_ci    Declare your Service ability in the  **config.json**  file by setting its  **type**  attribute to  **service**.
349e41f4b71Sopenharmony_ci
350e41f4b71Sopenharmony_ci    ```
351e41f4b71Sopenharmony_ci    "abilities": [{
352e41f4b71Sopenharmony_ci        "name": "ServiceAbility",
353e41f4b71Sopenharmony_ci        "icon": "res/drawable/phone.png",
354e41f4b71Sopenharmony_ci        "label": "test app 2", 
355e41f4b71Sopenharmony_ci        "launchType": "standard",
356e41f4b71Sopenharmony_ci        "type": "service",
357e41f4b71Sopenharmony_ci        "visible": true
358e41f4b71Sopenharmony_ci    }
359e41f4b71Sopenharmony_ci    ]
360e41f4b71Sopenharmony_ci    ```
361e41f4b71Sopenharmony_ci
362e41f4b71Sopenharmony_ci6.  Start a Service ability.
363e41f4b71Sopenharmony_ci    -   The  **Ability**  class provides the  **StartAbility\(\)**  function to start another ability. You can pass a  **Want**  object to this function to start a Service ability.
364e41f4b71Sopenharmony_ci
365e41f4b71Sopenharmony_ci        You can use the  **SetWantElement\(\)**  function provided in the  **AbilityKit**  to set information about the target Service ability to start. The  **element**  parameter of the  **SetWantElement\(\)**  function indicates the  **ElementName**  structure that contains the bundle name and target ability name required for starting an ability.
366e41f4b71Sopenharmony_ci
367e41f4b71Sopenharmony_ci        ```
368e41f4b71Sopenharmony_ci        {
369e41f4b71Sopenharmony_ci            Want want = { nullptr };
370e41f4b71Sopenharmony_ci            ElementName element = { nullptr };
371e41f4b71Sopenharmony_ci            SetElementBundleName(&element, "com.company.appname");
372e41f4b71Sopenharmony_ci            SetElementAbilityName(&element, "ServiceAbility");
373e41f4b71Sopenharmony_ci            SetWantElement(&want, element);
374e41f4b71Sopenharmony_ci            StartAbility(want);
375e41f4b71Sopenharmony_ci            ClearElement(&element);
376e41f4b71Sopenharmony_ci            ClearWant(&want);
377e41f4b71Sopenharmony_ci        }
378e41f4b71Sopenharmony_ci        ```
379e41f4b71Sopenharmony_ci
380e41f4b71Sopenharmony_ci        The  **StartAbility\(\)**  function is executed immediately. If the Service ability is not running while the function is called, the system invokes  **OnStart\(\)**  first.
381e41f4b71Sopenharmony_ci
382e41f4b71Sopenharmony_ci    -   Stops a Service ability.
383e41f4b71Sopenharmony_ci
384e41f4b71Sopenharmony_ci        Once created, the Service ability keeps running in the background. You can call  **StopAbility\(\)**  to stop the Service ability.
385e41f4b71Sopenharmony_ci
386e41f4b71Sopenharmony_ci7.  Connect to a Service ability.
387e41f4b71Sopenharmony_ci    -   If you need to connect a Service ability to a Page ability or to a Service ability in another application, you should first create a Service ability for connection. A Service ability allows other abilities to connect to it through  **ConnectAbility\(\)**  by passing a  **Want**  object that contains information about the target Service ability to the function. You can implement callbacks in  **IAbilityConnection**  to be invoked when a Service ability is connected or disconnected. The  **OnAbilityConnectDone\(\)**  callback is invoked when an ability is connected, and  **OnAbilityDisconnectDone\(\)**  is invoked when an ability is disconnected.
388e41f4b71Sopenharmony_ci
389e41f4b71Sopenharmony_ci        ```
390e41f4b71Sopenharmony_ci        {
391e41f4b71Sopenharmony_ci            // Create an IAbilityConnection object and implement the two callbacks.
392e41f4b71Sopenharmony_ci            IAbilityConnection abilityConnection = new IAbilityConnection();
393e41f4b71Sopenharmony_ci            abilityConnection->OnAbilityConnectDone = OnAbilityConnectDone;
394e41f4b71Sopenharmony_ci            abilityConnection->OnAbilityDisconnectDone = OnAbilityDisconnectDone;
395e41f4b71Sopenharmony_ci         
396e41f4b71Sopenharmony_ci            void OnAbilityConnectDone(ElementName *elementName, SvcIdentity *serviceSid, 
397e41f4b71Sopenharmony_ci                int resultCode, void *data)
398e41f4b71Sopenharmony_ci            {
399e41f4b71Sopenharmony_ci                if (resultCode != 0) {
400e41f4b71Sopenharmony_ci                    return;
401e41f4b71Sopenharmony_ci                }
402e41f4b71Sopenharmony_ci                // Push data.
403e41f4b71Sopenharmony_ci                IpcIo request;
404e41f4b71Sopenharmony_ci                char dataBuffer[IPC_IO_DATA_MAX];
405e41f4b71Sopenharmony_ci                IpcIoInit(&request, dataBuffer, IPC_IO_DATA_MAX, 0);
406e41f4b71Sopenharmony_ci                IpcIoPushInt32(&request, 10);
407e41f4b71Sopenharmony_ci                IpcIoPushInt32(&request, 6);
408e41f4b71Sopenharmony_ci         
409e41f4b71Sopenharmony_ci                // Send and receive the reply.
410e41f4b71Sopenharmony_ci                IpcIo reply;
411e41f4b71Sopenharmony_ci                uintptr_t ptr = 0;
412e41f4b71Sopenharmony_ci                if (Transact(nullptr, *serviceSid, 0, &request, &reply, 
413e41f4b71Sopenharmony_ci                    LITEIPC_FLAG_DEFAULT, &ptr) != LITEIPC_OK) {
414e41f4b71Sopenharmony_ci                    printf("transact error\n");
415e41f4b71Sopenharmony_ci                    return;
416e41f4b71Sopenharmony_ci                }
417e41f4b71Sopenharmony_ci                int result = IpcIoPopInt32(&reply);
418e41f4b71Sopenharmony_ci                printf("execute add method, result is %d\n", result);
419e41f4b71Sopenharmony_ci                if (ptr != 0) {
420e41f4b71Sopenharmony_ci                    FreeBuffer(nullptr, reinterpret_cast<void *>(ptr));
421e41f4b71Sopenharmony_ci                }
422e41f4b71Sopenharmony_ci            }
423e41f4b71Sopenharmony_ci         
424e41f4b71Sopenharmony_ci            void OnAbilityDisconnectDone(ElementName *elementName, 
425e41f4b71Sopenharmony_ci                int resultCode, void *data)
426e41f4b71Sopenharmony_ci            {
427e41f4b71Sopenharmony_ci                printf("elementName is %s, %s\n", 
428e41f4b71Sopenharmony_ci                    elementName->bundleName, elementName->abilityName);
429e41f4b71Sopenharmony_ci            }
430e41f4b71Sopenharmony_ci        }
431e41f4b71Sopenharmony_ci        ```
432e41f4b71Sopenharmony_ci
433e41f4b71Sopenharmony_ci    -   The following sample code snippet shows how to initiate ability connection and disconnection:
434e41f4b71Sopenharmony_ci
435e41f4b71Sopenharmony_ci        ```
436e41f4b71Sopenharmony_ci        {
437e41f4b71Sopenharmony_ci            // Connect an ability to a specified Service ability.
438e41f4b71Sopenharmony_ci            Want want = { nullptr };
439e41f4b71Sopenharmony_ci            ElementName element = { nullptr };
440e41f4b71Sopenharmony_ci            SetElementBundleName(&element, "com.company.appname");
441e41f4b71Sopenharmony_ci            SetElementAbilityName(&element, "ServiceAbility");
442e41f4b71Sopenharmony_ci            SetWantElement(&want, element);
443e41f4b71Sopenharmony_ci            ConnectAbility(want, *abilityConnection, this);
444e41f4b71Sopenharmony_ci         
445e41f4b71Sopenharmony_ci            // Disconnect from a Service ability.
446e41f4b71Sopenharmony_ci            DisconnectAbility(*abilityConnection);
447e41f4b71Sopenharmony_ci        }
448e41f4b71Sopenharmony_ci        ```
449e41f4b71Sopenharmony_ci
450e41f4b71Sopenharmony_ci
451e41f4b71Sopenharmony_ci
452e41f4b71Sopenharmony_ci### Development Guidelines on Bundle Management<a name="section1724016743217"></a>
453e41f4b71Sopenharmony_ci
454e41f4b71Sopenharmony_ci**Installing an Application**
455e41f4b71Sopenharmony_ci
456e41f4b71Sopenharmony_ciThe installation API can only be used by built-in system applications. Applications can be installed in either of the following paths:
457e41f4b71Sopenharmony_ci
458e41f4b71Sopenharmony_ci-   Default installation directory  **/storage/app/**  in the system
459e41f4b71Sopenharmony_ci-   Particular directory on the external storage, for example, a microSD card
460e41f4b71Sopenharmony_ci
461e41f4b71Sopenharmony_ciYou can specify the installation path when creating an  **InstallParam**  instance. To install the application in the  **/storage/app/**  directory, set the  **installLocation**  member variable in the  **InstallParam**  instance to  **INSTALL\_LOCATION\_INTERNAL\_ONLY**. To install the application in the  **/sdcard/app/**  directory of the external storage, set  **installLocation**  to  **INSTALL\_LOCATION\_PREFER\_EXTERNAL**. The application installation process is asynchronous, and a semaphore-like mechanism is required to ensure that the installation callback can be executed.
462e41f4b71Sopenharmony_ci
463e41f4b71Sopenharmony_ciThe procedure for installing an application is as follows \(the system directory is used as an example\):
464e41f4b71Sopenharmony_ci
465e41f4b71Sopenharmony_ci1.  Place the signed HAP file in a specified directory.
466e41f4b71Sopenharmony_ci2.  Create an  **InstallParam**  instance and define the semaphore.
467e41f4b71Sopenharmony_ci
468e41f4b71Sopenharmony_ci    ```
469e41f4b71Sopenharmony_ci    InstallParam installParam = { 
470e41f4b71Sopenharmony_ci    .installLocation = INSTALL_LOCATION_INTERNAL_ONLY, // Install the application in the system directory.
471e41f4b71Sopenharmony_ci    .keepData = false
472e41f4b71Sopenharmony_ci    };
473e41f4b71Sopenharmony_ci    static sem_t g_sem;
474e41f4b71Sopenharmony_ci    ```
475e41f4b71Sopenharmony_ci
476e41f4b71Sopenharmony_ci3.  Define the callback function.
477e41f4b71Sopenharmony_ci
478e41f4b71Sopenharmony_ci    ```
479e41f4b71Sopenharmony_ci    static void InstallCallback(const uint8_t resultCode, const void *resultMessage)
480e41f4b71Sopenharmony_ci    {
481e41f4b71Sopenharmony_ci         std::string strMessage = reinterpret_cast<const char *>(resultMessage);
482e41f4b71Sopenharmony_ci         if (!strMessage.empty()) {
483e41f4b71Sopenharmony_ci            printf("install resultMessage is %s, %d\n", strMessage.c_str(),resultCode);
484e41f4b71Sopenharmony_ci         }
485e41f4b71Sopenharmony_ci         sem_post(&g_sem);
486e41f4b71Sopenharmony_ci    }
487e41f4b71Sopenharmony_ci    ```
488e41f4b71Sopenharmony_ci
489e41f4b71Sopenharmony_ci4.  Call the  **Install**  function.
490e41f4b71Sopenharmony_ci
491e41f4b71Sopenharmony_ci    ```
492e41f4b71Sopenharmony_ci    const uint32_t WAIT_TIMEOUT = 30;
493e41f4b71Sopenharmony_ci    sem_init(&g_sem, 0, 0);
494e41f4b71Sopenharmony_ci    std::string installPath = "/storage/bundle/demo.hap"; // Specify the path where the HAP file is stored.
495e41f4b71Sopenharmony_ci    bool result = Install(installPath.c_str(), &installParam, InstallCallback);
496e41f4b71Sopenharmony_ci    struct timespec ts = {};
497e41f4b71Sopenharmony_ci    clock_gettime(CLOCK_REALTIME, &ts);
498e41f4b71Sopenharmony_ci    ts.tv_sec += WAIT_TIMEOUT; // Release the semaphore upon timeout.
499e41f4b71Sopenharmony_ci    sem_timedwait(&g_sem, &ts);
500e41f4b71Sopenharmony_ci    ```
501e41f4b71Sopenharmony_ci
502e41f4b71Sopenharmony_ci
503e41f4b71Sopenharmony_ci**Uninstalling an Application**
504e41f4b71Sopenharmony_ci
505e41f4b71Sopenharmony_ciWhen uninstalling an application, you can specify whether to retain application data using the  **keepData**  member variable in the created  **InstallParam**  instance. If  **keepData**  is set to  **true**, the application data will be retained after the application is uninstalled. If the variable is set to  **false**, the application data will be removed during application installation.
506e41f4b71Sopenharmony_ci
507e41f4b71Sopenharmony_ci1.  Create an  **InstallParam**  instance and define the semaphore.
508e41f4b71Sopenharmony_ci
509e41f4b71Sopenharmony_ci    ```
510e41f4b71Sopenharmony_ci    static sem_t g_sem;
511e41f4b71Sopenharmony_ci    InstallParam installParam = {
512e41f4b71Sopenharmony_ci    .installLocation = 1,
513e41f4b71Sopenharmony_ci         .keepData = false // Remove application data.
514e41f4b71Sopenharmony_ci    };
515e41f4b71Sopenharmony_ci    ```
516e41f4b71Sopenharmony_ci
517e41f4b71Sopenharmony_ci2.  Define the callback function.
518e41f4b71Sopenharmony_ci
519e41f4b71Sopenharmony_ci    ```
520e41f4b71Sopenharmony_ci    static void UninstallCallback(const uint8_t resultCode, const void *resultMessage)
521e41f4b71Sopenharmony_ci    {
522e41f4b71Sopenharmony_ci        std::string strMessage = reinterpret_cast<const char *>(resultMessage);
523e41f4b71Sopenharmony_ci        if (!strMessage.empty()) {
524e41f4b71Sopenharmony_ci            printf("uninstall resultMessage is %s\n", strMessage.c_str());
525e41f4b71Sopenharmony_ci            g_resultMessage = strMessage;
526e41f4b71Sopenharmony_ci        }
527e41f4b71Sopenharmony_ci        g_resultCode = resultCode;
528e41f4b71Sopenharmony_ci        sem_post(&g_sem);
529e41f4b71Sopenharmony_ci    }
530e41f4b71Sopenharmony_ci    ```
531e41f4b71Sopenharmony_ci
532e41f4b71Sopenharmony_ci3.  Call the  **Uninstall**  function.
533e41f4b71Sopenharmony_ci
534e41f4b71Sopenharmony_ci    ```
535e41f4b71Sopenharmony_ci    sem_init(&g_sem, 0, 0);
536e41f4b71Sopenharmony_ci    const uint32_t WAIT_TIMEOUT = 30;
537e41f4b71Sopenharmony_ci    std::string BUNDLE_NAME = "com.example.demo"; // Bundle name of the application to be uninstalled
538e41f4b71Sopenharmony_ci    Uninstall(BUNDLE_NAME.c_str(), &installParam, UninstallCallback);
539e41f4b71Sopenharmony_ci    struct timespec ts = {};
540e41f4b71Sopenharmony_ci    clock_gettime(CLOCK_REALTIME, &ts);
541e41f4b71Sopenharmony_ci    ts.tv_sec += WAIT_TIMEOUT;
542e41f4b71Sopenharmony_ci    sem_timedwait(&g_sem, &ts);
543e41f4b71Sopenharmony_ci    ```
544e41f4b71Sopenharmony_ci
545e41f4b71Sopenharmony_ci
546e41f4b71Sopenharmony_ci**Querying Bundle Information About an Installed Application**
547e41f4b71Sopenharmony_ci
548e41f4b71Sopenharmony_ciYou can use the  **GetBundleInfo**  function provided by  **BundleManager**  to query the bundle information about installed applications in the system.
549e41f4b71Sopenharmony_ci
550e41f4b71Sopenharmony_ci1.  Create and initialize a  **BundleInfo**  object.
551e41f4b71Sopenharmony_ci
552e41f4b71Sopenharmony_ci    ```
553e41f4b71Sopenharmony_ci    BundleInfo bundleInfo;
554e41f4b71Sopenharmony_ci    (void) memset_s(&bundleInfo, sizeof(BundleInfo), 0, sizeof(BundleInfo));
555e41f4b71Sopenharmony_ci    ```
556e41f4b71Sopenharmony_ci
557e41f4b71Sopenharmony_ci2.  Call  **GetBundleInfo**  to obtain bundle information about a specified application. The  **bundleName**  parameter indicates the pointer to the application bundle name, and the  **flags**  parameter specifies whether the obtained  **BundleInfo**  object can contain  **AbilityInfo**.
558e41f4b71Sopenharmony_ci
559e41f4b71Sopenharmony_ci    ```
560e41f4b71Sopenharmony_ci    std::string BUNDLE_NAME = "com.example.demo";
561e41f4b71Sopenharmony_ci    uint8_t ret = GetBundleInfo(BUNDLE_NAME.c_str(), 1, &bundleInfo); // When flags is set to 1, the obtained BundleInfo object contains AbilityInfo.
562e41f4b71Sopenharmony_ci    ```
563e41f4b71Sopenharmony_ci
564e41f4b71Sopenharmony_ci3.  After you finish using the obtained  **BundleInfo**  object, clear the memory space occupied by the object in a timely manner to prevent memory leakage.
565e41f4b71Sopenharmony_ci
566e41f4b71Sopenharmony_ci    ```
567e41f4b71Sopenharmony_ci    ClearBundleInfo(&bundleInfo);
568e41f4b71Sopenharmony_ci    ```
569e41f4b71Sopenharmony_ci
570e41f4b71Sopenharmony_ci
571e41f4b71Sopenharmony_ci### Packing a HAP File<a name="section171771212328"></a>
572e41f4b71Sopenharmony_ci
573e41f4b71Sopenharmony_ciThe packing tool is generally integrated into the development tool or IDE, and you rarely have the occasion to use it directly. This section is provided for you to have a general knowledge of the packing tool. The JAR file of the packing tool is stored in the  **developtools/packing\_tool/jar**  directory of the open-source code.
574e41f4b71Sopenharmony_ci
575e41f4b71Sopenharmony_ci-   CLI command parameters for packing a HAP file
576e41f4b71Sopenharmony_ci
577e41f4b71Sopenharmony_ci    **Table  2**  Description of resource files required for packing
578e41f4b71Sopenharmony_ci
579e41f4b71Sopenharmony_ci    <a name="table2151102833212"></a>
580e41f4b71Sopenharmony_ci    <table><thead align="left"><tr id="row314812893218"><th class="cellrowborder" valign="top" width="25%" id="mcps1.2.5.1.1"><p id="p1614732812320"><a name="p1614732812320"></a><a name="p1614732812320"></a>Command Parameter</p>
581e41f4b71Sopenharmony_ci    </th>
582e41f4b71Sopenharmony_ci    <th class="cellrowborder" valign="top" width="25%" id="mcps1.2.5.1.2"><p id="p214722819322"><a name="p214722819322"></a><a name="p214722819322"></a>Resource File</p>
583e41f4b71Sopenharmony_ci    </th>
584e41f4b71Sopenharmony_ci    <th class="cellrowborder" valign="top" width="25%" id="mcps1.2.5.1.3"><p id="p214714286324"><a name="p214714286324"></a><a name="p214714286324"></a>Description</p>
585e41f4b71Sopenharmony_ci    </th>
586e41f4b71Sopenharmony_ci    <th class="cellrowborder" valign="top" width="25%" id="mcps1.2.5.1.4"><p id="p1014712863211"><a name="p1014712863211"></a><a name="p1014712863211"></a>Initial Value Allowed</p>
587e41f4b71Sopenharmony_ci    </th>
588e41f4b71Sopenharmony_ci    </tr>
589e41f4b71Sopenharmony_ci    </thead>
590e41f4b71Sopenharmony_ci    <tbody><tr id="row614812289322"><td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.1 "><p id="p16148182853216"><a name="p16148182853216"></a><a name="p16148182853216"></a>--mode</p>
591e41f4b71Sopenharmony_ci    </td>
592e41f4b71Sopenharmony_ci    <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.2 "><p id="p5148162814328"><a name="p5148162814328"></a><a name="p5148162814328"></a>-</p>
593e41f4b71Sopenharmony_ci    </td>
594e41f4b71Sopenharmony_ci    <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.3 "><p id="p11481228143215"><a name="p11481228143215"></a><a name="p11481228143215"></a>This parameter is set to <strong id="b5192781718"><a name="b5192781718"></a><a name="b5192781718"></a>hap</strong> for packing the resource files into a HAP file.</p>
595e41f4b71Sopenharmony_ci    </td>
596e41f4b71Sopenharmony_ci    <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.4 "><p id="p11148132811325"><a name="p11148132811325"></a><a name="p11148132811325"></a>No</p>
597e41f4b71Sopenharmony_ci    </td>
598e41f4b71Sopenharmony_ci    </tr>
599e41f4b71Sopenharmony_ci    <tr id="row81486283327"><td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.1 "><p id="p6148132833215"><a name="p6148132833215"></a><a name="p6148132833215"></a>--json-path</p>
600e41f4b71Sopenharmony_ci    </td>
601e41f4b71Sopenharmony_ci    <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.2 "><p id="p214810286325"><a name="p214810286325"></a><a name="p214810286325"></a>Configuration file <strong id="b88502557175"><a name="b88502557175"></a><a name="b88502557175"></a>config.json</strong></p>
602e41f4b71Sopenharmony_ci    </td>
603e41f4b71Sopenharmony_ci    <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.3 "><p id="p514802823216"><a name="p514802823216"></a><a name="p514802823216"></a>-</p>
604e41f4b71Sopenharmony_ci    </td>
605e41f4b71Sopenharmony_ci    <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.4 "><p id="p4148182813326"><a name="p4148182813326"></a><a name="p4148182813326"></a>No</p>
606e41f4b71Sopenharmony_ci    </td>
607e41f4b71Sopenharmony_ci    </tr>
608e41f4b71Sopenharmony_ci    <tr id="row1214917281322"><td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.1 "><p id="p171497285322"><a name="p171497285322"></a><a name="p171497285322"></a>--resources-path</p>
609e41f4b71Sopenharmony_ci    </td>
610e41f4b71Sopenharmony_ci    <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.2 "><p id="p414914286320"><a name="p414914286320"></a><a name="p414914286320"></a>Resource file <strong id="b62311484202"><a name="b62311484202"></a><a name="b62311484202"></a>resources</strong></p>
611e41f4b71Sopenharmony_ci    </td>
612e41f4b71Sopenharmony_ci    <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.3 "><p id="p41492286324"><a name="p41492286324"></a><a name="p41492286324"></a>-</p>
613e41f4b71Sopenharmony_ci    </td>
614e41f4b71Sopenharmony_ci    <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.4 "><p id="p1114922812327"><a name="p1114922812327"></a><a name="p1114922812327"></a>Yes</p>
615e41f4b71Sopenharmony_ci    </td>
616e41f4b71Sopenharmony_ci    </tr>
617e41f4b71Sopenharmony_ci    <tr id="row14149122817322"><td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.1 "><p id="p11149528173218"><a name="p11149528173218"></a><a name="p11149528173218"></a>--assets-path</p>
618e41f4b71Sopenharmony_ci    </td>
619e41f4b71Sopenharmony_ci    <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.2 "><p id="p314918286324"><a name="p314918286324"></a><a name="p314918286324"></a>Resource file <strong id="b847745320206"><a name="b847745320206"></a><a name="b847745320206"></a>assets</strong></p>
620e41f4b71Sopenharmony_ci    </td>
621e41f4b71Sopenharmony_ci    <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.3 "><p id="p1414916284327"><a name="p1414916284327"></a><a name="p1414916284327"></a>-</p>
622e41f4b71Sopenharmony_ci    </td>
623e41f4b71Sopenharmony_ci    <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.4 "><p id="p9149122817324"><a name="p9149122817324"></a><a name="p9149122817324"></a>Yes</p>
624e41f4b71Sopenharmony_ci    </td>
625e41f4b71Sopenharmony_ci    </tr>
626e41f4b71Sopenharmony_ci    <tr id="row41501728193219"><td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.1 "><p id="p514918280325"><a name="p514918280325"></a><a name="p514918280325"></a>--lib-path</p>
627e41f4b71Sopenharmony_ci    </td>
628e41f4b71Sopenharmony_ci    <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.2 "><p id="p16149162823212"><a name="p16149162823212"></a><a name="p16149162823212"></a>Dependent library file</p>
629e41f4b71Sopenharmony_ci    </td>
630e41f4b71Sopenharmony_ci    <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.3 "><p id="p12149122853216"><a name="p12149122853216"></a><a name="p12149122853216"></a>-</p>
631e41f4b71Sopenharmony_ci    </td>
632e41f4b71Sopenharmony_ci    <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.4 "><p id="p614962853217"><a name="p614962853217"></a><a name="p614962853217"></a>Yes</p>
633e41f4b71Sopenharmony_ci    </td>
634e41f4b71Sopenharmony_ci    </tr>
635e41f4b71Sopenharmony_ci    <tr id="row131501928183212"><td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.1 "><p id="p4150122833213"><a name="p4150122833213"></a><a name="p4150122833213"></a>--shared-libs-path</p>
636e41f4b71Sopenharmony_ci    </td>
637e41f4b71Sopenharmony_ci    <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.2 "><p id="p15150112814322"><a name="p15150112814322"></a><a name="p15150112814322"></a>Shared library file</p>
638e41f4b71Sopenharmony_ci    </td>
639e41f4b71Sopenharmony_ci    <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.3 "><p id="p20150128113212"><a name="p20150128113212"></a><a name="p20150128113212"></a>The shared library is used by system applications in special cases.</p>
640e41f4b71Sopenharmony_ci    </td>
641e41f4b71Sopenharmony_ci    <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.4 "><p id="p181501928183214"><a name="p181501928183214"></a><a name="p181501928183214"></a>Yes</p>
642e41f4b71Sopenharmony_ci    </td>
643e41f4b71Sopenharmony_ci    </tr>
644e41f4b71Sopenharmony_ci    <tr id="row10150142812329"><td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.1 "><p id="p1015011286320"><a name="p1015011286320"></a><a name="p1015011286320"></a>--ability-so-path</p>
645e41f4b71Sopenharmony_ci    </td>
646e41f4b71Sopenharmony_ci    <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.2 "><p id="p6150728123214"><a name="p6150728123214"></a><a name="p6150728123214"></a>SO file providing main functionality</p>
647e41f4b71Sopenharmony_ci    </td>
648e41f4b71Sopenharmony_ci    <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.3 "><p id="p16150192813323"><a name="p16150192813323"></a><a name="p16150192813323"></a>-</p>
649e41f4b71Sopenharmony_ci    </td>
650e41f4b71Sopenharmony_ci    <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.4 "><p id="p1315052811325"><a name="p1315052811325"></a><a name="p1315052811325"></a>Yes</p>
651e41f4b71Sopenharmony_ci    </td>
652e41f4b71Sopenharmony_ci    </tr>
653e41f4b71Sopenharmony_ci    <tr id="row51519280321"><td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.1 "><p id="p315092813214"><a name="p315092813214"></a><a name="p315092813214"></a>--index-path</p>
654e41f4b71Sopenharmony_ci    </td>
655e41f4b71Sopenharmony_ci    <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.2 "><p id="p1115012813325"><a name="p1115012813325"></a><a name="p1115012813325"></a>Resource index</p>
656e41f4b71Sopenharmony_ci    </td>
657e41f4b71Sopenharmony_ci    <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.3 "><p id="p111501028123220"><a name="p111501028123220"></a><a name="p111501028123220"></a>The resource index file is generated by the resource generation tool and integrated by the resource pipeline.</p>
658e41f4b71Sopenharmony_ci    </td>
659e41f4b71Sopenharmony_ci    <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.4 "><p id="p1115122811326"><a name="p1115122811326"></a><a name="p1115122811326"></a>Yes</p>
660e41f4b71Sopenharmony_ci    </td>
661e41f4b71Sopenharmony_ci    </tr>
662e41f4b71Sopenharmony_ci    <tr id="row91511928203211"><td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.1 "><p id="p0151328173211"><a name="p0151328173211"></a><a name="p0151328173211"></a>--out-path</p>
663e41f4b71Sopenharmony_ci    </td>
664e41f4b71Sopenharmony_ci    <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.2 "><p id="p215112833214"><a name="p215112833214"></a><a name="p215112833214"></a>-</p>
665e41f4b71Sopenharmony_ci    </td>
666e41f4b71Sopenharmony_ci    <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.3 "><p id="p11151152833217"><a name="p11151152833217"></a><a name="p11151152833217"></a>This parameter indicates the output path of the generated HAP file. The default value is the current directory.</p>
667e41f4b71Sopenharmony_ci    </td>
668e41f4b71Sopenharmony_ci    <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.4 "><p id="p1815110281328"><a name="p1815110281328"></a><a name="p1815110281328"></a>Yes</p>
669e41f4b71Sopenharmony_ci    </td>
670e41f4b71Sopenharmony_ci    </tr>
671e41f4b71Sopenharmony_ci    <tr id="row4151162812329"><td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.1 "><p id="p1015112280329"><a name="p1015112280329"></a><a name="p1015112280329"></a>--force</p>
672e41f4b71Sopenharmony_ci    </td>
673e41f4b71Sopenharmony_ci    <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.2 "><p id="p2151128133219"><a name="p2151128133219"></a><a name="p2151128133219"></a>-</p>
674e41f4b71Sopenharmony_ci    </td>
675e41f4b71Sopenharmony_ci    <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.3 "><p id="p9151928183218"><a name="p9151928183218"></a><a name="p9151928183218"></a>This parameter specifies whether to overwrite an existing file with the same name. The default value is <strong id="b867781662412"><a name="b867781662412"></a><a name="b867781662412"></a>false</strong>.</p>
676e41f4b71Sopenharmony_ci    </td>
677e41f4b71Sopenharmony_ci    <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.4 "><p id="p171511728143217"><a name="p171511728143217"></a><a name="p171511728143217"></a>Yes</p>
678e41f4b71Sopenharmony_ci    </td>
679e41f4b71Sopenharmony_ci    </tr>
680e41f4b71Sopenharmony_ci    </tbody>
681e41f4b71Sopenharmony_ci    </table>
682e41f4b71Sopenharmony_ci
683e41f4b71Sopenharmony_ci-   Example HAP File Structure
684e41f4b71Sopenharmony_ci    -   Development view
685e41f4b71Sopenharmony_ci
686e41f4b71Sopenharmony_ci        ![](figures/en-us_image_0000001062942690.png)
687e41f4b71Sopenharmony_ci
688e41f4b71Sopenharmony_ci    -   Compilation view
689e41f4b71Sopenharmony_ci
690e41f4b71Sopenharmony_ci        ![](figures/en-us_image_0000001062334618.png)
691e41f4b71Sopenharmony_ci
692e41f4b71Sopenharmony_ci    -   Run the following commands to pack a HAP file using the packing tool.
693e41f4b71Sopenharmony_ci
694e41f4b71Sopenharmony_ci        ![](figures/en-us_image_0000001062476933.png)
695e41f4b71Sopenharmony_ci
696e41f4b71Sopenharmony_ci        ```
697e41f4b71Sopenharmony_ci        $ java -jar hmos_app_packing_tool.jar --mode hap --json-path ./config.json --assets-path ./assets/ --ability-so-path ./libentry.so --index-path ./resources.index --out-path out/entry.hap --force true
698e41f4b71Sopenharmony_ci        ```
699e41f4b71Sopenharmony_ci
700e41f4b71Sopenharmony_ci
701e41f4b71Sopenharmony_ci
702