开发

获取apk包接口

1 简介

  • 接口类: ISwanApkFetcher
  • 依赖模块: deps.business.swan.core
  • 默认实现: ISwanApkFetcher.DefaultImpl
  • 是否必须实现:
  • 可选择性依赖的实现:

宿主根据 pkgUri 等参数,获取 apk 包的能力接口,小程序框架获取 apk 的能力接口。

注:目前用于 接管代理小程序下载 apk 能力接口的默认实现,并将其委托给宿主进行自定义实现。

2 示例实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
/**
* 示例实现
*
* 假设1:宿主需要接管代理小程序下载 apk 能力接口的默认实现
* 假设2:宿主实现 apk 包获取过程的会话类 `ApkFetchingSession`,并根据 pkgUri 维护了会话对象
*/
@Service // 必要 pyramid IoC 注解,用于依赖注入该实现类
@Singleton // 可选 pyramid IoC 注解,建议宿主使用单例模式实现该能力
class SwanApkFetcherImpl extends SwanWrapper implements ISwanApkFetcher {

/**
* 根据 pkgUri 查询 apk 包获取过程的会话
*
* @param pkgUri 给定 pkgUri
* @return 给定 pkgUri 对应的 apk 包获取过程的会话对象
*/
@NonNull
ApkFetchingSession querySessionByUri(@NonNull String pkgUri) {
// 实现根据 pkgUri 查询 apk 包获取过程的会话
return sessionOfPkgUri;
}

@Override
public boolean delegateForAdDownloadByDefault() {
return true; // 返回 true 表示该实现类可以接管代理小程序下载 apk 能力接口的默认实现
}

@Override
public void addCallback(@NonNull String pkgUri, @Nullable Callback callback) {
// 添加 pkgUri 对应的事件回调监听器对象,要求所有已添加的监听器去重处理,
// 并在 ISwanApkFetcher.FetchStates 中定义的可枚举事件触发时,遍历通知所有回调对象。
querySessionByUri(pkgUri).addCallback(callback);
}

@Override
public void delCallback(@NonNull String pkgUri, @Nullable Callback callback) {
// 删除 pkgUri 对应的事件回调监听器对象
querySessionByUri(pkgUri).delCallback(callback);
}

@Override
public void status(@NonNull String pkgUri, @NonNull Params params) {
// 查询取包的状态,手动触发一次取包状态的回调 {@link Callback#onStateChange(FetchStates, int)}
querySessionByUri(pkgUri).status(params);
}

@Override
public void start(@NonNull String pkgUri, @NonNull Params params) {
// 开始执行 pkgUri 对应的取包逻辑
querySessionByUri(pkgUri).start(params);
}

@Override
public void pause(@NonNull String pkgUri, @NonNull Params params) {
// 暂停执行 pkgUri 对应的取包逻辑
querySessionByUri(pkgUri).pause(params);
}

@Override
public void cancel(@NonNull String pkgUri, @NonNull Params params) {
// 取消执行 pkgUri 对应的取包逻辑
querySessionByUri(pkgUri).cancel(params);
}

@Override
public void resume(@NonNull String pkgUri, @NonNull Params params) {
// 恢复执行 pkgUri 对应的取包逻辑
querySessionByUri(pkgUri).resume(params);
}

@Override
public void release() {
// 释放资源
}
}

3 主要方法及参数参考

3.1 ISwanApkFetcher

1
public interface ISwanApkFetcher

APK 取包器,小程序框架获取 apk 的能力接口

3.1.1 Nested classes

3.1.2 Public methods

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/**
* 代理 ISwanAppAdDownload 接口的默认实现
*
* @return 可以代理 ISwanAppAdDownload 接口默认实现则为真
*/
boolean delegateForAdDownloadByDefault();

/**
* 添加 pkgUri 对应的事件监听器,同一个 pkgUri 重复添加相同监听器对象时需要去重处理
*
* @param pkgUri 取包 uri
* @param callback 事件监听器 {@link Callback}
*/
void addCallback(@NonNull String pkgUri,@Nullable Callback callback);

/**
* 删除事件回调
*
* @param pkgUri 取包 uri
* @param callback 事件监听器 {@link Callback}
*/
void delCallback(@NonNull String pkgUri,@Nullable Callback callback);

/**
* 查询取包的状态,根据取包 uri 字段触发回调一次取包状态回调 {@link Callback#onStateChange(FetchStates, int)}
*
* @param pkgUri 取包 uri
* @param params 可选参数容器,参数要求详见: {@link Params}
*/
void status(@NonNull String pkgUri,@NonNull Params params);

/**
* 开始取包,根据取包 uri 字段,开始执行对应的取包逻辑
*
* @param pkgUri 取包 uri
* @param params 可选参数容器,参数要求详见: {@link Params}
*/
void start(@NonNull String pkgUri,@NonNull Params params);

/**
* 暂停取包,根据取包 uri 字段,暂停执行对应的取包逻辑
*
* @param pkgUri 取包 uri
* @param params 可选参数容器,参数要求详见: {@link Params}
*/
void pause(@NonNull String pkgUri,@NonNull Params params);

/**
* 取消取包,根据取包 URI 字段,取消执行对应的取包逻辑
*
* @param pkgUri 取包 uri
* @param params 可选参数容器,{@link Params}
*/
void cancel(@NonNull String pkgUri,@NonNull Params params);

/**
* 继续取包,根据取包 uri,恢复执行对应的取包逻辑
*
* @param pkgUri 取包 uri
* @param params 可选参数容器,参数要求详见: {@link Params}
*/
void resume(@NonNull String pkgUri,@NonNull Params params);

/**
* 销毁取包器并释放被引用的资源
*/
void release();

3.2 ISwanApkFetcher.Callback

1
interface ISwanApkFetcher.Callback

取包事件监听器

3.2.1 Public methods

1
2
3
4
5
6
7
/**
* 取包逻辑状态回调
*
* @param state 取包逻辑执行状态
* @param progress 取包逻辑执行进度
*/
void onStateChange(FetchStates state,int progress);

3.3 ISwanApkFetcher.FetchStates

1
enum ISwanApkFetcher.FetchStates

取包事件监听器

3.3.1 Enum values

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/** 未开始 */
PENDING,
/** 取包中 */
FETCHING,
/** 取包暂停 */
FETCH_PAUSED,
/** 取包完成 */
FETCHED,
/** 取包失败 */
FETCH_FAILED,
/** 安装完成 */
INSTALLED,
/** 取包完成文件删除 */
DELETED,
/** 准备取包 */
FETCH_PREPARE,
/** 等待中 */
WAITING,
/** 结束,对应每个URI的取包过程,无论成功失败,都会回调一次,回调结束后,宿主应清空 URI 对应的监听器集合,不再发回调,防止内存泄露 */
FINISHED

3.4 ISwanApkFetcher.DefaultImpl

1
class DefaultImpl extends SwanWrapper implements ISwanApkFetcher

默认空实现

3.4.1 Public methods

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
@Override
public boolean delegateForAdDownloadByDefault(){
return false; // 返回 false 表示默认实现不接管代理小程序下载 apk 能力接口的默认实现
}

@Override
public void addCallback(@NonNull String pkgUri,@Nullable Callback callback){}

@Override
public void delCallback(@NonNull String pkgUri,@Nullable Callback callback){}

@Override
public void status(@NonNull String pkgUri,@NonNull Params params){}

@Override
public void start(@NonNull String pkgUri,@NonNull Params params){}

@Override
public void pause(@NonNull String pkgUri,@NonNull Params params){}

@Override
public void cancel(@NonNull String pkgUri,@NonNull Params params){}

@Override
public void resume(@NonNull String pkgUri,@NonNull Params params){}

@Override
public void release(){}

3.5 Params

1
public final class Params extends Properties<Params>
  • ISwanApkFetcher 的可选参数容器
  • 默认的可选参数字段见:{@link Keys}
  • 默认的可选参数字段都有相应的同名 getter、setter 和 contains 方法

3.5.1 Nested classes

3.5.2 Public methods

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286

@Override
public Params self(){
return this;
}

/**
* 存 {@link Keys#TITLE}
*
* @param title 值
* @return 自身
*/
public Params title(String title){
return putString(Keys.TITLE,title);
}

/**
* 取 {@link Keys#TITLE}
*
* @return
*/
public String title(){
return getString(Keys.TITLE);
}

/**
* 容器是否包含字段 {@link Keys#TITLE}
*
* @return 包含则为真
*/
public boolean containsTitle(){
return containsKey(Keys.TITLE);
}

/**
* 存 {@link Keys#PKG_NAME}
*
* @param pkgName 值
* @return 自身
*/
public Params pkgName(String pkgName){
return putString(Params.Keys.PKG_NAME,pkgName);
}

/**
* 取 {@link Keys#PKG_NAME}
*
* @return
*/
public String pkgName(){
return getString(Params.Keys.PKG_NAME);
}

/**
* 容器是否包含字段 {@link Keys#PKG_NAME}
*
* @return 包含则为真
*/
public boolean containsPkgName(){
return containsKey(Keys.PKG_NAME);
}

/**
* 存 {@link Keys#DESCRIPTION}
*
* @param description 值
* @return 自身
*/
public Params description(String description){
return putString(Keys.DESCRIPTION,description);
}

/**
* 取 {@link Keys#DESCRIPTION}
*
* @return
*/
public String description(){
return getString(Keys.DESCRIPTION);
}

/**
* 容器是否包含字段 {@link Keys#DESCRIPTION}
*
* @return 包含则为真
*/
public boolean containsDescription(){
return containsKey(Keys.DESCRIPTION);
}

/**
* 存 {@link Keys#AUTO_INSTALL}
*
* @param autoInstall 值
* @return 自身
*/
public Params autoInstall(Boolean autoInstall){
return putBoolean(Keys.AUTO_INSTALL,autoInstall);
}

/**
* 取 {@link Keys#AUTO_INSTALL}
*
* @return
*/
public Boolean autoInstall(){
return getBoolean(Keys.AUTO_INSTALL,false);
}

/**
* 容器是否包含字段 {@link Keys#AUTO_INSTALL}
*
* @return 包含则为真
*/
public boolean containsAutoInstall(){
return containsKey(Keys.AUTO_INSTALL);
}

/**
* 存 {@link Keys#CURRENT_SWAN_APP}
*
* @param currentSwanApp 值
* @return 自身
*/
public Params currentSwanApp(String currentSwanApp){
return putString(Keys.CURRENT_SWAN_APP,currentSwanApp);
}

/**
* 取 {@link Keys#CURRENT_SWAN_APP}
*
* @return
*/
public String currentSwanApp(){
return getString(Keys.CURRENT_SWAN_APP);
}

/**
* 容器是否包含字段 {@link Keys#CURRENT_SWAN_APP}
*
* @return 包含则为真
*/
public boolean containsCurrentSwanApp(){
return containsKey(Keys.CURRENT_SWAN_APP);
}

/**
* 存 {@link Keys#CONTENT_DISPOSITION}
*
* @param contentDisposition 值
* @return 自身
*/
public Params contentDisposition(String contentDisposition){
return putString(Keys.CONTENT_DISPOSITION,contentDisposition);
}

/**
* 取 {@link Keys#CONTENT_DISPOSITION}
*
* @return
*/
public String contentDisposition(){
return getString(Keys.CONTENT_DISPOSITION);
}

/**
* 容器是否包含字段 {@link Keys#CONTENT_DISPOSITION}
*
* @return 包含则为真
*/
public boolean containsContentDisposition(){
return containsKey(Keys.CONTENT_DISPOSITION);
}

/**
* 存 {@link Keys#MIME_TYPE}
*
* @param mimeType 值
* @return 自身
*/
public Params mimeType(String mimeType){
return putString(Keys.MIME_TYPE,mimeType);
}

/**
* 取 {@link Keys#MIME_TYPE}
*
* @return
*/
public String mimeType(){
return getString(Keys.MIME_TYPE);
}

/**
* 容器是否包含字段 {@link Keys#MIME_TYPE}
*
* @return 包含则为真
*/
public boolean containsMimeType(){
return containsKey(Keys.MIME_TYPE);
}

/**
* 存 {@link Keys#USER_AGENT}
*
* @param userAgent 值
* @return 自身
*/
public Params userAgent(String userAgent){
return putString(Keys.USER_AGENT,userAgent);
}

/**
* 取 {@link Keys#USER_AGENT}
*
* @return
*/
public String userAgent(){
return getString(Keys.USER_AGENT);
}

/**
* 容器是否包含字段 {@link Keys#USER_AGENT}
*
* @return 包含则为真
*/
public boolean containsUserAgent(){
return containsKey(Keys.USER_AGENT);
}

/**
* 存 {@link Keys#CONTENT_LENGTH}
*
* @param contentLength 值
* @return 自身
*/
public Params contentLength(String contentLength){
return putString(Keys.CONTENT_LENGTH,contentLength);
}

/**
* 取 {@link Keys#CONTENT_LENGTH}
*
* @return
*/
public String contentLength(){
return getString(Keys.CONTENT_LENGTH);
}

/**
* 容器是否包含字段 {@link Keys#CONTENT_LENGTH}
*
* @return 包含则为真
*/
public boolean containsContentLength(){
return containsKey(Keys.CONTENT_LENGTH);
}

/**
* 存 {@link Keys#EXT_INFO}
*
* @param extInfo 值
* @return 自身
*/
public Params extInfo(String extInfo){
return putString(Keys.EXT_INFO,extInfo);
}

/**
* 取 {@link Keys#EXT_INFO}
*
* @return
*/
public String extInfo(){
return getString(Keys.EXT_INFO);
}

/**
* 容器是否包含字段 {@link Keys#EXT_INFO}
*
* @return 包含则为真
*/
public boolean containsExtInfo(){
return containsKey(Keys.EXT_INFO);
}

3.6 Params.DefaultImpl

1
public interface Keys

key 定义

3.6.1 Constants

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
/** key 前缀 */
String _PREFIX="SwanApkFetcher.Params";

/**
* 包的 title
*
* @see #title()
* @see #title(String)
*/
String TITLE=joinPrefix(_PREFIX,"title");

/**
* 包名
*
* @see #pkgName()
* @see #pkgName(String)
*/
String PKG_NAME=joinPrefix(_PREFIX,"pkg_name");

/**
* 包的描述信息
*
* @see #description()
* @see #description(String)
*/
String DESCRIPTION=joinPrefix(_PREFIX,"description");

/**
* 是否自动执行安装包
*
* @see #autoInstall()
* @see #autoInstall(Boolean)
*/
String AUTO_INSTALL=joinPrefix(_PREFIX,"should_auto_install");

/**
* 当前环境正在运行的小程序 id
*
* @see #currentSwanApp()
* @see #currentSwanApp(String)
*/
String CURRENT_SWAN_APP=joinPrefix(_PREFIX,"current_swan_app");

/**
* MIME 协议扩展
*
* @see #contentDisposition()
* @see #contentDisposition(String)
*/
String CONTENT_DISPOSITION=joinPrefix(_PREFIX,"content_disposition");

/**
* MIME 协议扩展
*
* @see #mimeType()
* @see #mimeType(String)
*/
String MIME_TYPE=joinPrefix(_PREFIX,"mime_type");

/**
* UA
*
* @see #userAgent()
* @see #userAgent(String)
*/
String USER_AGENT=joinPrefix(_PREFIX,"user_agent");

/**
* 包资源的内容长度
*
* @see #contentLength()
* @see #contentLength(String)
*/
String CONTENT_LENGTH=joinPrefix(_PREFIX,"content_length");

/**
* 额外信息
*
* @see #extInfo()
* @see #extInfo(String)
*/
String EXT_INFO=joinPrefix(_PREFIX,"ext_info");