开发

Android接入指南

SDK集成步骤

  • 1、到 https://ossunion.baidu.com/opensource/home/setting.html 注册宿主信息,并下载配置文件union-cfg.json
  • 2、将配置文件union-cfg.json放到宿主的assets/config/下,无此路径新建即可。
  • 3、local-maven仓库整个复制到项目的根目录(local-maven仓库内部存放pyramid和swan需要的所有lib库,但是这些lib不会全部打包进宿主APP中,所以不用关心这个文件夹的体积问题,直接将生成SDK的local-maven文件夹复制到宿主工程即可)。
  • 4、添加依赖

    • 工程根目录build.gradle

      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
      buildscript {
      repositories {
      // 配置目前私有库所在的位置
      maven { url uri("${rootDir}/local-maven") }

      }
      dependencies {

      // kotlin
      classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.20"

      // 编译注入,仅仅在application中使用(apply plugin: 'com.baidu.pyramid.di')
      classpath "com.baidu.pyramid:di-gradle-plugin:0.8.71"

      // scheme收集器,每个有描述表的module需要使用(宿主主要关心extension所在的module需要apply plugin: 'com.baidu.pyramid.generate-scheme-class')
      classpath "com.baidu.pyramid:generate-scheme-class:0.8.71"

      // scheme汇总,仅仅在application中使用(apply plugin: 'com.baidu.pyramid.scheme-classify')
      classpath "com.baidu.pyramid:scheme-classify:0.8.71"
      }
      }

      allprojects {

      repositories {
      // 配置目前私有库所在的位置
      maven { url uri("${rootDir}/local-maven") }
      }
      }
    • 实现小程序sdk接口的工程的build.gradle需要依赖以下模块

      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
      dependencies {
      // 必要依赖, TARGET_BUILD_VERSION 就是sdk的版本号
      // 1.小程序与核心层
      implementation "com.baidu.swan:swan-core:${TARGET_BUILD_VERSION}"
      // 2.小程序接口层
      implementation "com.baidu.swan:swan-facade:${TARGET_BUILD_VERSION}"

      // ********************* 以下需要宿主自己根据需要配置 **************************//
      // 默认实现,二选一或者宿主自己实现
      // 1. t7、v8内核 可以选择集成,也可以选择so后下载
      // 1.1 如果需要依赖精简版(无T7内核,只有v8引擎的)使用com.baidu.swan:swan-sailor-so-lite:
      // 1.2 如果希望进行so后下载,则不需要依赖任何so,直接删除此依赖即可,然后再SailorSoDownloadImpl中配置so后下载(后下载参考下文的so后下载章节)
      implementation "com.baidu.swan:swan-sailor-so:${TARGET_BUILD_VERSION}"

      // 2. 定位和地图组件,可以选择精简版(只有定位能力),和完整版(也具有地图组件)
      // 2.1 如果考虑体积问题希望不想引入地图组件,可以使用精简版com.baidu.swan:bd-map-only-location:
      implementation "com.baidu.swan:bd-map-full:${TARGET_BUILD_VERSION}"

      // 3. 视频组件的实现
      // 3.1 如果希望自己实现播放器,则删除此库,按照此库中的代码修改和引入成自己的播放器即可
      implementation "com.baidu.swan:bd-videoplayer-impl:${TARGET_BUILD_VERSION}"

      // 4. 集成百度cuid体系
      implementation "com.baidu.swan:swan-cuid-impl:${TARGET_BUILD_VERSION}"

      }
    • app工程的build.gralde(即application工程)中添加以下依赖(需要在apply plugin: ‘com.android.application’之后添加)

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      apply plugin: 'com.baidu.pyramid.di'
      apply plugin: 'com.baidu.pyramid.scheme-classify'


      // 配置依赖注入插件
      pyramidConfig {
      // 是否打开依赖注入
      enable true
      // 是否打开依赖注入插件的debug开关
      debug false
      // 是否应用增量编译模式
      enableIncremental false
      }

      // 配置端能力描述表插件,不需要修改
      schemeClassifyConfig {
      // 端能力所属框架
      schemeClassifyList = ['base', 'swan/v8', 'swan/webview', 'empty', 'swan/v8_ab', 'swan/webview_ab']
      }
  • 5、初始化,在Application中

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

@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
// 必须在attachBaseContext中初始化
SwanAppInitHelper.initContext(this);
}

@Override
public void onCreate() {
super.onCreate();

// 1.必须在attachBaseContext之后初始化

// 2.如果需要延时初始化,在真正打开小程序的时候再初始化(提前初始化有利于提升打开小程序的速度)
// SwanAppInitHelper.initModules(this, true);

// 3.如果只希望在android5.0及以上系统使用小程序,使用以下函数初始化
// 如果使用了t7内核so,则可以支持5.0以下的rom,否则建议从5.0开始支持
// 因为5.0以下系统的webview较旧,有可能出现页面的显示兼容问题
// SwanAppInitHelper.initModules(this, false, true);

// demo 默认立即初始化 & 打开5.0以下入口
SwanAppInitHelper.initModules(this);


// 如果使用了so后下载,可以使用此方式再合适的时机进行so的预下载
// SwanAppUtils.postOnUi(new Runnable() {
// @Override
// public void run() {
// SailorSoDownloadConfig.downloadSoSilent();
// }
// },3000);
}
  • 6、Manifest配置
1
2
3
4
5
6
7
8
9
10
<application>
<!-- *****************以下是使用百度地图时需要注册的信息*********************** -->

<!-- 如果使用了百度定位SDK,则需要加此meta-data 第三方开发者必须自己到官网注册API_KEY,这里只是用作demo,使用了debug的签名 -->
<!-- 申请地址:http://lbsyun.baidu.com/apiconsole/key -->
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="yA7FBoWjWxltPSfcC1qojEvNsX94GF0c" />
<!-- END LBS地图SDK -->
</application>
  • 7、混淆文件(必须添加混淆文件,否则release包无法正常工作)
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
-keep public interface com.baidu.browser.core.INoProGuard
-keepattributes Exceptions,InnerClasses,Signature,*Annotation*
-keepclasseswithmembernames class * {
native <methods>;
}

-keep class * implements com.baidu.browser.core.INoProGuard {
*;
}

-keep class * implements com.baidu.searchbox.NoProGuard {
*;
}

-keep class * extends com.baidu.browser.core.INoProGuard {
*;
}

-keep class com.baidu.webkit.sdk.** {
*;
}

-keep interface com.baidu.webkit.sdk.** { *; }


-keep class com.baidu.browser.sailor.platform.nativeability.mime.** {
*;
}

-keepclassmembers class com.baidu.browser.sailor.** {
@android.webkit.JavascriptInterface <methods>;
}

-keep enum com.baidu.browser.sailor.BdSailorWebView* {
*;
}

-keep enum com.baidu.browser.sailor.BdSailorWebViewClientExt* {
*;
}
-keep enum com.baidu.browser.sailor.webkit.BdWebSettings* {
*;
}
-keep enum com.baidu.browser.sailor.BdSailorClient* {
*;
}
# Keep our interfaces so they can be used by other ProGuard rules.
# See http://sourceforge.net/p/proguard/bugs/466/
-keep,allowobfuscation @interface com.facebook.common.internal.DoNotStrip

# Do not strip any method/class that is annotated with @DoNotStrip
-keep @com.facebook.common.internal.DoNotStrip class *
-keepclassmembers class * {
@com.facebook.common.internal.DoNotStrip *;
}

# Keep native methods
-keepclassmembers class * {
native <methods>;
}



-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
-dontoptimize

-useuniqueclassmembernames
# 增加行号
-renamesourcefileattribute SearchBox
-keepattributes SourceFile,LineNumberTable
-ignorewarnings


# com.google.protobuf
-keep class com.google.protobuf.** { *; }
-keep interface com.google.protobuf.** { *; }


# com.baidu.webkit.sdk
-keep class com.baidu.blink.** { *; }
-keep interface com.baidu.blink.** { *; }
-keep class com.baidu.debuggerd.** { *; }
-keep interface com.baidu.debuggerd.** { *; }
-keep class com.baidu.dumper.** { *; }
-keep interface com.baidu.dumper.** { *; }
-keep class com.baidu.htmlNotification.** { *; }
-keep interface com.baidu.htmlNotification.** { *; }
-keep class com.baidu.webkit.sdk.** { *; }
-keep interface com.baidu.webkit.sdk.** { *; }

-keep class org.chromium.base.library_loader.** { *; }
-keep interface org.chromium.base.library_loader.** { *; }

# com.baidu.android.common.security
-keep class com.baidu.android.common.security.** { *; }
-keep interface com.baidu.android.common.security.** { *; }
# com.baidu.android.common.util
-keep class com.baidu.android.common.util.** { *; }
-keep interface com.baidu.android.common.util.** { *; }
-keep interface google.zxing.searchbox.** { *; }




# 保持@JavascriptInterface annotations 不被混淆掉

-keepattributes *JavascriptInterface*

-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}

# for UBC
-keep class com.baidu.ubc.UBC { *; }
-keep class com.baidu.ubc.Flow { *; }

# for lib-network
# okhttp & okio
-dontwarn okhttp3.**
-dontwarn okio.**
-dontwarn org.conscrypt.**

-keep class okhttp3.**{ *; }
-keep class okio.**{ *; }
-keep class org.conscrypt.** { *; }
# A resource is loaded with a relative path so the package of this class must be preserved.
-keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase

# searchbox http
-keep class com.baidu.searchbox.http.** { *; }

-keep @com.baidu.searchbox.v8engine.NotProguard class * {*;}
-keep,allowobfuscation @interface com.baidu.searchbox.v8engine.NotProguard
-keepclassmembers class * {
@com.baidu.searchbox.v8engine.NotProguard *;
}
-keepclassmembers class * {
@com.baidu.searchbox.v8engine.V8JavascriptField <fields>;
}

# rxjava
-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {
long producerIndex;
long consumerIndex;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {
rx.internal.util.atomic.LinkedQueueNode producerNode;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef {
rx.internal.util.atomic.LinkedQueueNode consumerNode;
}

# 百度地图sdk的keep规则
-keep class com.baidu.android.bbalbs.common.** { *; }
-keep class com.baidu.ar.npc.** { *; }
-keep class com.baidu.lbsapi.** { *; }
-keep class com.baidu.location.** { *; }
-keep class com.baidu.mapapi.** { *; }
-keep class com.baidu.mapframework.open.aidl.** { *; }
-keep class com.baidu.mapsdkplatform.** { *; }
-keep class com.baidu.mapsdkvi.** { *; }
-keep class com.baidu.pano.platform.** { *; }
-keep class com.baidu.platform.** { *; }
-keep class mapsdkvi.com.gdi.bgl.** { *; }

#-libraryjars libs/bdplayer.jar
-keep class com.baidu.cloud.media.**{ *;}
  • 8、需要实现的接口

    • ISwanAppScanCode : 二维码扫码能力
    • ISwanAppPayment :支付能力,包括百度支付、微信支付、支付宝支付
    • ISwanAppSocialShare : 分享能力,即将小程序分享给好友的能力
  • 9、可以根据业务实现的接口

    • IHostExtensionAdapter : 私有扩展能力,用于开发自己的私有能力
    • ISwanAppChooseInvoice : 选择发票,目前联盟账号未收录发票,需要宿主自己实现
    • AbsSwanAppNightMode : 夜间模式,小程序自带夜间模式能力,如果需要和宿主打通,需要实现此抽象类
    • ISailorSoDownloadAdapter : 如果需要采用T7和V8的so后下载来减少体积,则需要实现此接口
    • ISwanAppPkgLoadStatus : 小程序包打开失败时的回调,宿主可以进行截获
  • 10、账号,SDK默认采用联盟账号实现,宿主如要使用自己的账号体系,需要自己搭建一套Server体系,并且需要实现ISwanAppAccount 和 AbsSwanAppConfig全部接口

  • 11、视频组件,提供了百度播放内核默认实现,如若宿主希望用自己的播放器实现,则可以参考提供的默认实现的代码,实现ISwanAppVideoPlayer、ISwanAppLive和IInlineVideo接口。
  • 12、地图组件和定位能力,默认采用百度地图的定位SDK实现,提供了2种默认实现,一个是包含地图组件和定位能力的实现,一种是仅仅包含定位能力,不包含地图组件的实现(不包含地图组件,会让使用到地图组件的小程序无法正常运行),宿主根据体积和运行的小程序自行选择(包含地图组件和定位能力:bd-map-full;仅仅包含定位能力:bd-map-only-location)
  • 13、小程序、小游戏默认使用到的V8和T7内核是放到lib-swan-webview/lib-swan-sailor-so(lib-swan-webview/lib-swan-sailor-so-lite仅包含v8,不包含T7的so)中的,宿主可也选择依赖然后打包到自己的apk中;也可选择SO后下载,如果希望进行so后下载,则在上述第四步添加依赖时,不需要依赖上述的任何lib(即,不需要依赖lib-swan-webview/lib-swan-sailor-so或lib-swan-webview/lib-swan-sailor-so-lite),直接删除此依赖即可,然后再SailorSoDownloadImpl中配置so后下载。
  • 14、其他各种接口,默认已经提供了实现,不需要宿主关心,如果宿主希望定制,则可以使用自己的实现,具体的接口在com.baidu.swan.apps.ioc.interfaces 和 com.baidu.swan.apps.adaptation.interfaces 包下。
  • 15、打开小程序的入口:SwanAppLaunchHelper.launch(scheme)
    • scheme为要打开的小程序或小游戏的scheme协议.
    • 小程序:宿主的schemeHead://swan/appKey,appKey就是要打开小程序的唯一标识字符串,比如小程序中心的是”sc9Tq1iKawTnj5GhG6i77vzeIt4Crt5u”,每个小程序的appkey可以从宿主平台查询,具体的可以参见小程序调启方式。
    • 小游戏:宿主的schemeHead://swangame/appKey,appKey就是要打开小游戏的唯一标识字符串,比如“转一转”的是“duG5QNDKyzwIn2RUGObsiwql4vU6wEwU”,每个小游戏的appkey可以从宿主平台查询。
    • 查询链接 :https://ossunion.baidu.com/opensource/home/appmanagement.html

so后 下载说明

  • 1、关于T7内核的说明:
    • T7内核是百度自研的高性能浏览内核,对于提高小程序的性能具有明显的效果,同时也可以屏蔽低版本系统webview的兼容性问题。
    • 同层渲染能力(如视频、input、textarea等组件)强烈依赖T7内核,如果没有T7内核会自动退化为普通的H5元素,功能和性能上会不及同层渲染。
    • 一些提升性能的策略,比如SetData能力,也是强烈依赖T7内核,如果没有T7内核也会降级成普通的js端能力调用java代码实现,性能上会有一定的损失。
    • 如不是态注重体积问题,建议使用T7内核以提高性能和体验。
  • 2、首先在依赖里,去除对”com.baidu.swan:swan-sailor-so:${TARGET_BUILD_VERSION}”或”com.baidu.swan:swan-sailor-so-lite:${TARGET_BUILD_VERSION}”的依赖。
  • 3、实现一个so后下载的类,继承于“DefaultSailorSoDownloadAdapter”如下:

    1
    2
    3
    4
    5
    6
    7
    8
       @Service
    public class SailorSoDownloadImpl extends DefaultSailorSoDownloadAdapter {
    @Override
    public boolean isNeedDownload() {
    // so 后下载返回 true;直接依赖so则返回false
    return true;
    }
    }

    可参考demo工程的/aiapps/demo/src/main/java/com/baidu/swan/impl/so/SailorSoDownloadImpl.java

  • 7、so后下载的时机是在第一次打开小程序的时候才进行,由于so的体积较大(18M),会导致第一次打开的时间较长,如果希望在打开之前合适的时机主动触发预下载,可以使用

    1
    2
    3
    // 1.此方法只可以在主进程中调用,子进程调用无效
    // 2.此方法线程安全,也是非阻塞调用,不耗时
    SailorSoDownloadConfig.downloadSoSilent()

注意事项

  • 1、建议使用联盟账号,SDK内已经提供默认实现,如若使用自己的账号,则需要自己实现一套Server体系和授权过程,比较复杂。
  • 2、建议在进入小程序之前申请获取imei的权限,广告相关业务需要获取,否则可能会造成广告统计不准
  • 3、SDK中一部分代码采用Kotlin编写,所以需要工程引入Kotlin环境。
  • 4、需要实现的接口,都提供了参考实现,都在aiapps/demo/src/main/java/com/baidu/swan/impl/这个包下。
  • 5、protobuf的版本,小程序分支默认3.0版本,如果不兼容需要重新输出SDK。
  • 6、android Q版本以后对于应用访问权限进一步收紧,访问图片相册等路径需要在manifest文件添加android:requestLegacyExternalStorage=”true”
  • 7、2.19.0之后版本的联盟登陆需要重新申请union-cfg.json配置文件,否则可能会出现无法登陆的情况