• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 开发指导<a name="ZH-CN_TOPIC_0000001062229264"></a>
2
3-   [场景介绍](#section93012287133)
4-   [接口说明](#section11821047161319)
5-   [开发步骤](#section10514141679)
6    -   [创建Service类型的Ability](#section19921154214315)
7    -   [包管理接口使用指导](#section1724016743217)
8    -   [Hap包打包](#section171771212328)
9
10
11## 场景介绍<a name="section93012287133"></a>
12
13-   带界面的Ability的应用,比如:新闻类的应用、视频类的应用、导航类的应用、支付类的应用等等,目前我们看到的大部分应用都是带有界面的用于人机交互的应用。
14
15-   不带界面的Ability应用,比如:音乐播放器能在后台播放音乐、后台提供计算服务、导航服务的各类应用等。
16
17-   不管是带界面的Ability应用还是不带界面的Ability应用,都要打包成Hap包,最终发布到应用市场,用户通过应用市场下载安装相应的应用。
18
19## 接口说明<a name="section11821047161319"></a>
20
21**表 1**  Ability子系统的对外接口
22
23<a name="table36761640135514"></a>
24<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>接口名称</p>
25</th>
26<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>接口描述</p>
27</th>
28</tr>
29</thead>
30<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>
31</td>
32<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>反序列化接口,由字符串生成Want对象。</p>
33</td>
34</tr>
35<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>
36</td>
37<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>序列化,把Want对象生成字符串。</p>
38</td>
39</tr>
40<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>
41</td>
42<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>设置ElementName对象。</p>
43</td>
44</tr>
45<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>
46</td>
47<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>设置数据。</p>
48</td>
49</tr>
50<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>
51</td>
52<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>设置SvcIdentity。</p>
53</td>
54</tr>
55<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>
56</td>
57<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>清除Want的内部内存数据。</p>
58</td>
59</tr>
60<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>
61</td>
62<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>设置AbilitySlice主路由。</p>
63</td>
64</tr>
65<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>
66</td>
67<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>设置布局资源。</p>
68</td>
69</tr>
70<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>
71</td>
72<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>Ability生命周期状态回调,Ability启动时被回调。</p>
73</td>
74</tr>
75<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>
76</td>
77<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>Ability生命周期状态回调,Ability销毁时被回调。</p>
78</td>
79</tr>
80<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>
81</td>
82<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>Ability生命周期状态回调,Ability显示时被回调。</p>
83</td>
84</tr>
85<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>
86</td>
87<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>Ability生命周期状态回调,Ability隐藏时被回调。</p>
88</td>
89</tr>
90<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>
91</td>
92<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>Ability生命周期状态回调,Ability退到后台时被回调。</p>
93</td>
94</tr>
95<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>
96</td>
97<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>Service类型Ability第一次连接时被回调。</p>
98</td>
99</tr>
100<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>
101</td>
102<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>Service类型Ability断开连接被回调。</p>
103</td>
104</tr>
105<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>
106</td>
107<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>Service类型Ability接收消息处理。</p>
108</td>
109</tr>
110<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>
111</td>
112<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>dump Ability信息。</p>
113</td>
114</tr>
115<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>
116</td>
117<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>发起AbilitySlice跳转。</p>
118</td>
119</tr>
120<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>
121</td>
122<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>退出当前AbilitySlice。</p>
123</td>
124</tr>
125<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>
126</td>
127<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>设置当前AbilitySlice所在Ability的布局资源。</p>
128</td>
129</tr>
130<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>
131</td>
132<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>AbilitySlice生命周期状态回调,AbilitySlice启动时被回调。</p>
133</td>
134</tr>
135<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>
136</td>
137<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>AbilitySlice生命周期状态回调,AbilitySlice销毁时被回调。</p>
138</td>
139</tr>
140<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>
141</td>
142<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>AbilitySlice生命周期状态回调,AbilitySlice显示时被回调。</p>
143</td>
144</tr>
145<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>
146</td>
147<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>AbilitySlice生命周期状态回调,AbilitySlice隐藏时被回调。</p>
148</td>
149</tr>
150<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>
151</td>
152<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>AbilitySlice生命周期状态回调,AbilitySlice退到后台时被回调。</p>
153</td>
154</tr>
155<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>
156</td>
157<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>启动Ability。</p>
158</td>
159</tr>
160<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>
161</td>
162<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>停止Service类型的Ability。</p>
163</td>
164</tr>
165<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>
166</td>
167<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>销毁当前的Ability。</p>
168</td>
169</tr>
170<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>
171</td>
172<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>绑定Service类型的Ability。</p>
173</td>
174</tr>
175<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>
176</td>
177<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>解绑Service类型的Ability。</p>
178</td>
179</tr>
180<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>
181</td>
182<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>获取当前ability的对应应用的包名。</p>
183</td>
184</tr>
185<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>
186</td>
187<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>获取当前ability的对应应用的安装路径。</p>
188</td>
189</tr>
190<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>
191</td>
192<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>获取当前ability的对应应用的数据路径。</p>
193</td>
194</tr>
195<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>
196</td>
197<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>启动Ability,该接口可以不需要在基于Ability开发的应用中使用。</p>
198</td>
199</tr>
200<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>
201</td>
202<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>绑定Service类型的Ability,该接口可以不需要在基于Ability开发的应用中使用。</p>
203</td>
204</tr>
205<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>
206</td>
207<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>解绑Service类型的Ability,该接口可以不需要在基于Ability开发的应用中使用。</p>
208</td>
209</tr>
210<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>
211</td>
212<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>停止Service类型的Ability,该接口可以不需要在基于Ability开发的应用中使用。</p>
213</td>
214</tr>
215<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>
216</td>
217<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>绑定Service Ability的回调。</p>
218</td>
219</tr>
220<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>
221</td>
222<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>解绑Service Ability的回调。</p>
223</td>
224</tr>
225<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>
226</td>
227<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>投递任务到异步线程进行处理。</p>
228</td>
229</tr>
230<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>
231</td>
232<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>退出当前线程的消息循环。</p>
233</td>
234</tr>
235<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>
236</td>
237<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>获取当前线程的事件处理器。</p>
238</td>
239</tr>
240<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>
241</td>
242<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>执行当前线程的消息循环。</p>
243</td>
244</tr>
245<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>
246</td>
247<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>注册开发者的Ability到框架中。</p>
248</td>
249</tr>
250<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>
251</td>
252<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>注册开发者的AbilitySlice到框架中。</p>
253</td>
254</tr>
255</tbody>
256</table>
257
258## 开发步骤<a name="section10514141679"></a>
259
260### 创建Service类型的Ability<a name="section19921154214315"></a>
261
2621.  在my\_service\_ability.h中创建Ability的子类MyServiceAbility。
263
264    ```
265    class MyServiceAbility: public Ability {
266    protected:
267        void OnStart(const Want& want);
268        const SvcIdentity *OnConnect(const Want &want) override;
269        void MsgHandle(uint32_t funcId, IpcIo *request, IpcIo *reply) override;
270    };
271    ```
272
2732.  调用REGISTER\_AA宏将ServiceAbility注册到应用框架中,以便应用框架实例化开发者的MyServiceAbility。
274
275    ```
276    #include "my_service_ability.h"
277
278    REGISTER_AA(ServiceAbility)
279
280    void MyServiceAbility::OnStart(const Want& want)
281    {
282        printf("ServiceAbility::OnStart\n");
283        Ability::OnStart(want);
284    }
285
286    const SvcIdentity *MyServiceAbility::OnConnect(const Want &want)
287    {
288        printf("ServiceAbility::OnConnect\n");
289        return Ability::OnConnect(want);
290    }
291
292    void MyServiceAbility::MsgHandle(uint32_t funcId, IpcIo *request, IpcIo *reply)
293    {
294        printf("ServiceAbility::MsgHandle, funcId is %u\n", funcId);
295        int result = 0;
296        if (funcId == 0) {
297            result = IpcIoPopInt32(request) + IpcIoPopInt32(request);
298        }
299        // push data
300        IpcIoPushInt32(reply, result);
301    }
302    ```
303
3043.  实现Service相关的生命周期方法。Service也是一种Ability,Ability为服务提供了以下生命周期方法,用户可以重写这些方法来添加自己的处理。用户在重写的方法里,需要调用父类对应的方法。
305    -   OnStart\(\)
306
307        该方法在创建Service的时候调用,用于做一些Service初始化且耗时较短的工作,在Service的整个生命周期只会调用一次。
308
309        ```
310        void MyServiceAbility::OnStart(const Want& want)
311        {
312            printf("ServiceAbility::OnStart\n");
313            Ability::OnStart(want);
314        }
315        ```
316
317    -   OnConnect​\(\)
318
319        在组件和服务连接时调用,该方法返回SvcIdentity,组件可以通过它,与服务交互。
320
321        ```
322        const SvcIdentity *MyServiceAbility::OnConnect(const Want &want)
323        {
324            printf("ServiceAbility::OnConnect\n");
325            return Ability::OnConnect(want);
326        }
327        ```
328
329    -   OnDisconnect​\(\)
330
331        在组件与绑定的Service断开连接时调用。
332
333    -   OnStop\(\)
334
335        在Service销毁时调用。Service应通过实现此方法来清理任何资源,如关闭线程、注册的侦听器等。
336
3374.  重写消息处理方法。
338
339    MsgHandle是Service用来处理客户端消息的方法。其中funcId是客户端传过来的消息类型,request是客户端传过来的序列化请求参数。如果用户在处理完成之后想要把结果传回去,需要把结果序列化后写入reply中。
340
341    ```
342    void ServiceAbility::MsgHandle(uint32_t funcId, IpcIo *request, IpcIo *reply)
343    {
344        printf("ServiceAbility::MsgHandle, funcId is %d\n", funcId);
345        int result = 0;
346        if (funcId == PLUS) {
347            result = IpcIoPopInt32(request) + IpcIoPopInt32(request);
348        }
349        // push data
350        IpcIoPushInt32(reply, result);
351    }
352    ```
353
3545.  注册Service。
355
356    Service也需要在应用清单文件config.json中进行注册,注册类型type需要设置为service。
357
358    ```
359    "abilities": [{
360        "name": "ServiceAbility",
361        "icon": "res/drawable/phone.png",
362        "label": "test app 2",
363        "launchType": "standard",
364        "type": "service",
365        "visible": true
366    }
367    ]
368    ```
369
3706.  启动Service。
371    -   Ability为用户提供了StartAbility\(\)方法来启动另外一个Ability,因为Service也是Ability的一种,开发者同样可以通过将Want传递给该方法来启动Service。
372
373        开发者可以通过Want的SetWantElement \(\)来设置目标服务信息。ElementName结构体的两个主要参数:第一个参数为包名称;第二个参数为目标Ability。
374
375        ```
376        {
377            Want want = { nullptr };
378            ElementName element = { nullptr };
379            SetElementBundleName(&element, "com.company.appname");
380            SetElementAbilityName(&element, "ServiceAbility");
381            SetWantElement(&want, element);
382            StartAbility(want);
383            ClearElement(&element);
384            ClearWant(&want);
385        }
386        ```
387
388        StartAbility\(\) 方法会立即执行,如果Service尚未运行,则系统首先会调用OnStart\(\)。
389
390    -   停止Service。
391
392        Service一旦创建就会一直保持在后台运行,开发者可以通过调用StopAbility\(\)来停止Service。
393
3947.  连接Service。
395    -   如果Service需要与Page Ability或其他应用组件中的Service进行交互,则应创建用于连接的Service。Service支持其他Ability通过ConnectAbility\(\)与其进行连接,ConnectAbility\(\)需要传入目标Service的Want,以及IAbilityConnection的实例来处理回调。IAbilityConnection提供了两个方法供用户实现,OnAbilityConnectDone\(\)用来处理连接的回调,OnAbilityDisconnectDone\(\)用来处理断开连接的回调。
396
397        ```
398        {
399            // ability创建IAbilityConnection对象和定义IAbilityConnection的两个方法实现
400            IAbilityConnection abilityConnection = new IAbilityConnection();
401            abilityConnection->OnAbilityConnectDone = OnAbilityConnectDone;
402            abilityConnection->OnAbilityDisconnectDone = OnAbilityDisconnectDone;
403
404            void OnAbilityConnectDone(ElementName *elementName, SvcIdentity *serviceSid,
405                int resultCode, void *data)
406            {
407                if (resultCode != 0) {
408                    return;
409                }
410                // push data
411                IpcIo request;
412                char dataBuffer[IPC_IO_DATA_MAX];
413                IpcIoInit(&request, dataBuffer, IPC_IO_DATA_MAX, 0);
414                IpcIoPushInt32(&request, 10);
415                IpcIoPushInt32(&request, 6);
416
417                // send and getReply
418                IpcIo reply;
419                uintptr_t ptr = 0;
420                if (Transact(nullptr, *serviceSid, 0, &request, &reply,
421                    LITEIPC_FLAG_DEFAULT, &ptr) != LITEIPC_OK) {
422                    printf("transact error\n");
423                    return;
424                }
425                int result = IpcIoPopInt32(&reply);
426                printf("execute add method, result is %d\n", result);
427                if (ptr != 0) {
428                    FreeBuffer(nullptr, reinterpret_cast<void *>(ptr));
429                }
430            }
431
432            void OnAbilityDisconnectDone(ElementName *elementName,
433                int resultCode, void *data)
434            {
435                printf("elementName is %s, %s\n",
436                    elementName->bundleName, elementName->abilityName);
437            }
438        }
439        ```
440
441    -   发起connect和disconnect。
442
443        ```
444        {
445            // ability发起connect
446            Want want = { nullptr };
447            ElementName element = { nullptr };
448            SetElementBundleName(&element, "com.company.appname");
449            SetElementAbilityName(&element, "ServiceAbility");
450            SetWantElement(&want, element);
451            ConnectAbility(want, *abilityConnection, this);
452
453            // ability发起disconnect
454            DisconnectAbility(*abilityConnection);
455        }
456        ```
457
458
459
460### 包管理接口使用指导<a name="section1724016743217"></a>
461
462**安装应用**
463
464安装接口只能给内置的系统应用使用。根据应用的安装路径,可以在安装应用时进行选择:
465
466-   将应用安装到系统默认的文件目录/storage/app/。
467-   将应用安装到系统外挂的存储介质中,例如micro sdcard。
468
469这两种选择可以在创建InstallParam实例的时候指定,当InstallParam的成员变量installLocation为 INSTALL\_LOCATION\_INTERNAL\_ONLY时,意味着应用将会被安装到/storage/app/目录下;当InstallParam的成员变量installLocation为INSTALL\_LOCATION\_PREFER\_EXTERNAL时,意味着应用将被安装到存储介质,其安装目录是/sdcard/app/。由于安装应用的过程是异步的,所以需要使用类似信号量的机制来确保安装的回调可以被执行。
470
471安装应用的步骤如下(示例代码以安装到系统目录为例):
472
4731.  将经过安全签名的应用放置于指定的目录下。
4742.  创建InstallParam实例和信号量。
475
476    ```
477    InstallParam installParam = {
478    .installLocation = INSTALL_LOCATION_INTERNAL_ONLY, // 安装到系统目录
479    .keepData = false
480    };
481    static sem_t g_sem;
482    ```
483
4843.  定义回调函数。
485
486    ```
487    static void InstallCallback(const uint8_t resultCode, const void *resultMessage)
488    {
489         std::string strMessage = reinterpret_cast<const char *>(resultMessage);
490         if (!strMessage.empty()) {
491            printf("install resultMessage is %s, %d\n", strMessage.c_str(),resultCode);
492         }
493         sem_post(&g_sem);
494    }
495    ```
496
4974.  调用Install接口。
498
499    ```
500    const uint32_t WAIT_TIMEOUT = 30;
501    sem_init(&g_sem, 0, 0);
502    std::string installPath = “/storage/bundle/demo.hap”; // hap包的存储路径
503    bool result = Install(installPath.c_str(), &installParam, InstallCallback);
504    struct timespec ts = {};
505    clock_gettime(CLOCK_REALTIME, &ts);
506    ts.tv_sec += WAIT_TIMEOUT; // 超时即释放信号量
507    sem_timedwait(&g_sem, &ts);
508    ```
509
510
511**卸载应用**
512
513卸载应用的时候可以选择是否保留应用的数据,开发者可以通过创建的InstallParam实例的成员变量keepData来确定。当keepData为true, 卸载应用之后将保留应用的数据,当keepData为false时,卸载应用之后将不会保留应用的数据。
514
5151.  创建InstallParam实例和信号量。
516
517    ```
518    static sem_t g_sem;
519    InstallParam installParam = {
520    .installLocation = 1,
521         .keepData = false // 不保留应用数据
522    };
523    ```
524
5252.  定义回调函数。
526
527    ```
528    static void UninstallCallback(const uint8_t resultCode, const void *resultMessage)
529    {
530        std::string strMessage = reinterpret_cast<const char *>(resultMessage);
531        if (!strMessage.empty()) {
532            printf("uninstall resultMessage is %s\n", strMessage.c_str());
533            g_resultMessage = strMessage;
534        }
535        g_resultCode = resultCode;
536        sem_post(&g_sem);
537    }
538    ```
539
5403.  调用Uninstall接口。
541
542    ```
543    sem_init(&g_sem, 0, 0);
544    const uint32_t WAIT_TIMEOUT = 30;
545    std::string BUNDLE_NAME = “com.huawei.demo”; // 卸载应用的包名
546    Uninstall(BUNDLE_NAME.c_str(), &installParam, UninstallCallback);
547    struct timespec ts = {};
548    clock_gettime(CLOCK_REALTIME, &ts);
549    ts.tv_sec += WAIT_TIMEOUT;
550    sem_timedwait(&g_sem, &ts);
551    ```
552
553
554**查询已安装应用的包信息**
555
556开发者可以利用BundleManager提供的接口GetBundleInfo来查询系统内已安装应用的包信息。
557
5581.  创建以及初始化BundleInfo。
559
560    ```
561    BundleInfo bundleInfo;
562    (void) memset_s(&bundleInfo, sizeof(BundleInfo), 0, sizeof(BundleInfo));
563    ```
564
5652.  调用GetBundleInfo接口,指定查询应用的包名,同时指定flag来确定获取的BundleInfo中是否含有元能力信息(实例代码以含有元能力信息为例)。
566
567    ```
568    std::string BUNDLE_NAME = "com.huawei.demo";
569    uint8_t ret = GetBundleInfo(BUNDLE_NAME.c_str(), 1, &bundleInfo); // flags = 1,获取包信息中含有元能力信息
570    ```
571
5723.  使用完获取的BundleInfo之后,要及时清理掉其内部所占用的内存空间避免内存泄漏。
573
574    ```
575    ClearBundleInfo(&bundleInfo);
576    ```
577
578
579### Hap包打包<a name="section171771212328"></a>
580
581打包工具一般集成到开发工具或者ide中,开发者一般不涉及直接使用该工具,下面的介绍开发者可以作为了解。打包工具的jar包在开源代码中的位置:developtools/packing\_tool/jar。
582
583-   打包命令行参数
584
585    **表 2**  打包所需要的资源文件描述
586
587    <a name="table2151102833212"></a>
588    <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>命令参数</p>
589    </th>
590    <th class="cellrowborder" valign="top" width="25%" id="mcps1.2.5.1.2"><p id="p214722819322"><a name="p214722819322"></a><a name="p214722819322"></a>对应的资源文件</p>
591    </th>
592    <th class="cellrowborder" valign="top" width="25%" id="mcps1.2.5.1.3"><p id="p214714286324"><a name="p214714286324"></a><a name="p214714286324"></a>说明</p>
593    </th>
594    <th class="cellrowborder" valign="top" width="25%" id="mcps1.2.5.1.4"><p id="p1014712863211"><a name="p1014712863211"></a><a name="p1014712863211"></a>是否可缺省</p>
595    </th>
596    </tr>
597    </thead>
598    <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>
599    </td>
600    <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>
601    </td>
602    <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.3 "><p id="p11481228143215"><a name="p11481228143215"></a><a name="p11481228143215"></a>为“hap”字段,打包生成hap</p>
603    </td>
604    <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.4 "><p id="p11148132811325"><a name="p11148132811325"></a><a name="p11148132811325"></a>否</p>
605    </td>
606    </tr>
607    <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>
608    </td>
609    <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.2 "><p id="p214810286325"><a name="p214810286325"></a><a name="p214810286325"></a>清单文件config.json</p>
610    </td>
611    <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>
612    </td>
613    <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.4 "><p id="p4148182813326"><a name="p4148182813326"></a><a name="p4148182813326"></a>否</p>
614    </td>
615    </tr>
616    <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>
617    </td>
618    <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.2 "><p id="p414914286320"><a name="p414914286320"></a><a name="p414914286320"></a>资源文件resources</p>
619    </td>
620    <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>
621    </td>
622    <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.4 "><p id="p1114922812327"><a name="p1114922812327"></a><a name="p1114922812327"></a>是</p>
623    </td>
624    </tr>
625    <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>
626    </td>
627    <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.2 "><p id="p314918286324"><a name="p314918286324"></a><a name="p314918286324"></a>资源文件assets</p>
628    </td>
629    <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>
630    </td>
631    <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.4 "><p id="p9149122817324"><a name="p9149122817324"></a><a name="p9149122817324"></a>是</p>
632    </td>
633    </tr>
634    <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>
635    </td>
636    <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.2 "><p id="p16149162823212"><a name="p16149162823212"></a><a name="p16149162823212"></a>依赖库文件</p>
637    </td>
638    <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>
639    </td>
640    <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.4 "><p id="p614962853217"><a name="p614962853217"></a><a name="p614962853217"></a>是</p>
641    </td>
642    </tr>
643    <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>
644    </td>
645    <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.2 "><p id="p15150112814322"><a name="p15150112814322"></a><a name="p15150112814322"></a>共享库文件</p>
646    </td>
647    <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.3 "><p id="p20150128113212"><a name="p20150128113212"></a><a name="p20150128113212"></a>针对系统应用的共享库,特殊情况下使用</p>
648    </td>
649    <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.4 "><p id="p181501928183214"><a name="p181501928183214"></a><a name="p181501928183214"></a>是</p>
650    </td>
651    </tr>
652    <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>
653    </td>
654    <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文件</p>
655    </td>
656    <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>
657    </td>
658    <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.4 "><p id="p1315052811325"><a name="p1315052811325"></a><a name="p1315052811325"></a>是</p>
659    </td>
660    </tr>
661    <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>
662    </td>
663    <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.2 "><p id="p1115012813325"><a name="p1115012813325"></a><a name="p1115012813325"></a>资源索引</p>
664    </td>
665    <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.3 "><p id="p111501028123220"><a name="p111501028123220"></a><a name="p111501028123220"></a>资源索引文件由资源生成工具生成,由资源流水线会集成该工具</p>
666    </td>
667    <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.4 "><p id="p1115122811326"><a name="p1115122811326"></a><a name="p1115122811326"></a>是</p>
668    </td>
669    </tr>
670    <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>
671    </td>
672    <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>
673    </td>
674    <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.3 "><p id="p11151152833217"><a name="p11151152833217"></a><a name="p11151152833217"></a>生成的hap包输出路径,默认为当前目录</p>
675    </td>
676    <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.4 "><p id="p1815110281328"><a name="p1815110281328"></a><a name="p1815110281328"></a>是</p>
677    </td>
678    </tr>
679    <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>
680    </td>
681    <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>
682    </td>
683    <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.3 "><p id="p9151928183218"><a name="p9151928183218"></a><a name="p9151928183218"></a>是否覆盖原有同名文件,默认为false</p>
684    </td>
685    <td class="cellrowborder" valign="top" width="25%" headers="mcps1.2.5.1.4 "><p id="p171511728143217"><a name="p171511728143217"></a><a name="p171511728143217"></a>是</p>
686    </td>
687    </tr>
688    </tbody>
689    </table>
690
691-   打包示例
692    -   开发视图
693
694        ![](figure/zh-cn_image_0000001062942690.png)
695
696    -   编译视图
697
698        ![](figure/zh-cn_image_0000001062334618.png)
699
700    -   使用打包工具执行以下命令打包:
701
702        ![](figure/zh-cn_image_0000001062476933.png)
703
704        ```
705        $ 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
706        ```
707
708
709
710