初始化
1.准备工作
下载最新版 Android SDK,并解压到单独的 sdk 目录
将 sdk 目录放在工程的 app 模块同级别目录内,如图所示,App 模块与 sdk 目录处于同一级
3.确保你的整个工程正常编译
2.接入工作
1. 修改工程使用 AndroidX 开发
在工程目录中找到 gradle.properties,添加下面两行代码,改变工程为 AndroidX 工程
android.useAndroidX=true
android.enableJetifier=true
2. 修改 app 模块的 mulitDex 支持
打开 app 模块下的 build.gradle,找到 defaultConfig{},将下面的代码添加到 defaultConfig 里面
multiDexEnabled true //打开mulitDex支持
在 dependencies {}这里添加导入的库,具体代码如下,添加完成后,对于多 Dex 的支持完成
dependencies {
implementation 'androidx.multidex:multidex:2.0.1'
implementation 'androidx.multidex:multidex-instrumentation:2.0.0'
}
3. 加入 CPU 架构支持
请在 defaultConfig{}中加入下面的代码,完成对 cpu 不同架构的支持
ndk {
// 注意:这里需要添加项目所需CPU类型的最小集合,一般推荐使用'armeabi-v7a','arm64-v8a'
abiFilters "armeabi","armeabi-v7a","arm64-v8a","x86_64","x86"
}
###4. 引入 sdk 插件,配置所需模块 在第一行 apply plugin: 'com.android.application' 的后面加入下面的 gradle 代码 apply from: "../sdk/sdk.gradle"
ext { sdkplugins = [ "common","user","qq","onekey","share","voice","htlog","wechat" ] }
其中 apply from 是引入 sdk 文件夹下面的 sdk.gradle 文件工程配置 ext{}内的这是需要使用到的模块,目前支持的模块列表可以打开 sdk 文件夹下面的 sdk.gradle 文件查看 每个模块的具体功能描述如下
common sdk通用模块,使用SDK必须引用此模块,否则sdk无效
htlog sdk的tga日志打点模块,这个模块可以在需要的时候引入
wechat 微信模块,包含微信登录和微信分享功能,如果需要使用微信登录功能,则还需要引入user模块,如果使用微信分享,则需要额外引入share模块
user 用户模块,与登录和用户信息相关,此模块是sdk必须引入的模块,如果需要使用微信登录需要额外引入wechat模块,如果需要使用QQ登录需要额外引入qq模块,如果需要使用一键登录需要额外引入onekey模块,否则这些功能不可用,只有游客登录可用(注意:手机号登录的功能包含在一键登录内,所以使用手机号登录,请引入onekey模块)
qq QQ登录和分享模块,包含的功能QQ的登录和分享,但是这个模块不能单独使用,登录需要额外引入user模块,分享需要额外引入share模块
onekey 一键登录模块,该模块包含一键登录功能和短信登录功能,如果需要使用短信登录必须引入该模块,同时还要引入user模块
share 分享模块,该模块支持qq分享和微信分享,需要引入qq和wechat模块
voice 语音识别转文字模块,该模块提供了腾讯语音转文字服务,使用前需要引入user模块,登录后才可以使用
realname 实名认证模块,提供防沉迷和实名认证功能
注:同时 sdk 里面引入了方便运行时调试的日志查看插件,该插件仅在 debug 版本有效,如果不需要,则可以在 sdk.gradle 里面注释掉下面的代码即可
//debug模式才开启的调试日志查看功能,如果不需要请手工注释掉
p.dependencies.add('debugImplementation', 'com.hjq:logcat:9.2')
5. 设置使用 jdk 的版本和打包的排除项
在 app 的 build.gradle 文件中,android 标签内,添加下面的代码,设置使用 jdk 的版本和打包的排除项
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
packagingOptions {
exclude 'META-INF/DEPENDENCIES.txt'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt'
exclude 'META-INF/NOTICE'
exclude 'META-INF/LICENSE'
exclude 'META-INF/DEPENDENCIES'
exclude 'META-INF/notice.txt'
exclude 'META-INF/license.txt'
exclude 'META-INF/dependencies.txt'
exclude 'META-INF/LGPL2.1'
exclude 'META-INF/ASL2.0'
exclude 'lib/mips/libpl_droidsonroids_gif.so'
}
6.添加渠道号
具体的 gradle 配置和 AndroidManifest.xml 配置
//build.gradle配置文件
android{
defaultConfig{
manifestPlaceholders = [
Channel:"hortorTest" //红色字体为渠道具体内容
]
}
}
//AndroidManifest.xml配置
<application>
<!--添加的渠道meta data-->
<meta-data
android:name = "CHANNEL"
android:value = "${Channel}"/>
</application>
7.建议修改项目
如果你的配置文件中关于签名部分使用的绝对路径,看一下这个建议,修改成相对路径,方便后面编译使用,首先把 andriod 的签名放在与 app 模块同级的 key 文件夹内,再做下面的配置
//在app的build.gradle文件中,anroid标签内,添加下面的代码
signingConfigs {
debug {
storeFile file("../key/android.jks")
storePassword "123456"
keyAlias "android"
keyPassword "123456"
}
release {
storeFile file("../key/android.jks")
storePassword "123456"
keyAlias "android"
keyPassword "123456"
}
}
8.配置混淆项目
把 release 文件混淆配置指向 proguard-rules.pro
buildTypes {
release {
debuggable false
jniDebuggable false
renderscriptDebuggable false
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'),'../sdk/proguard-rules.pro'//这里的混淆指向sdk文件夹下面的proguard-rules.pro文件
signingConfig signingConfigs.release
externalNativeBuild {
ndkBuild {
arguments 'NDK_DEBUG=0'
}
}
}
debug {
debuggable true
jniDebuggable true
renderscriptDebuggable true
signingConfig signingConfigs.debug
externalNativeBuild {
ndkBuild {
arguments 'NDK_DEBUG=1'
}
}
}
}
9.代码接入
首先建立 com.hortorgames.gamesdk 的包,然后建立 SDKBridge.java 文件,具体代码请看SDKBridge.java文件
完成 SDKBridege 文件的建立,下面就可以引用和初始化 SDK 了,具体初始化请看红色字体部分代码
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//添加sdk初始化和Create回调函数
SDKBridge.initByConfig(this);
AppSDK.getInstance().onCreate(savedInstanceState);
}
@Override
protected void onPause() {
super.onPause();
AppSDK.getInstance().onPause(this);
}
@Override
protected void onResume() {
super.onResume();
AppSDK.getInstance().onResume(this);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable @org.jetbrains.annotations.Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
AppSDK.getInstance().onActivityResult(requestCode, resultCode, data);
}
@Override
protected void onDestroy() {
super.onDestroy();
AppSDK.getInstance().onDestroy();
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
AppSDK.getInstance().onRequestPermissionsResult(requestCode, permissions, grantResults);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
return AppSDK.getInstance().onKeyDown(keyCode, event);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
}
添加好 java 代码部分,我们接下来要加入 AndroidManifest.xml 文件一些配置
首先添加应用 app 的权限
<!--必须的基础权限-->
<uses-permission android:name = "android.permission.INTERNET"/>
<!--存储权限并非必须,但是如果使用分享等功能,必须加入,否则无法进行分享操作-->
<uses-permission android:name = "android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE"/>
<!--录音权限是语音转文字模块必须权限,如果使用该模块请加入-->
<uses-permission android:name = "android.permission.RECORD_AUDIO"/>
为了兼容 Android 的高版本,需要在 Application 标签下面添加下面的标签
android:usesCleartextTraffic = "true"//支持http访问
在 Application 标签的里面与 Activity 标签同级别的地方加入下面的代码
<uses-library
android:name = "org.apache.http.legacy"
android:required = "false"/>
<activity
android:name = "com.hortorgames.gamesdk.common.WebBrowser"
android:theme = "@android:style/Theme.Translucent.NoTitleBar"
android:screenOrientation = "behind"
/>
到此为止,我们的 SDK 模块基础功能接入已经完成,但是这里只是基础模块的接入,如果要使用 QQ,微信,一键登录等,还需要额外的配置,具体可以在AppSDK 文档目录索引对应的模块接入
10.Andriod Url Scheme 接入
Android 的跳转功能在低版本上面使用的是 Url Scheme 方式接入,目前高版本国内没有好的解决方案,只能满足低版本 Android 手机使用
具体配置如下
配置 App 的 AndroidManifest.xml 文件,在主 Activity 下面加入如下 intent-filter 过滤器, 这个的值就是 url 的解析开头,例子如下(红色字体部分)
AndroidManifest.xml 文件配置
<activity android:name = ".MainActivity"
android:exported="true" //注意此行代码最好也要加入一下
>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<data android:scheme="xxxx"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>
<intent-filter>
<action android:name = "android.intent.action.MAIN"/>
<category android:name = "android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
代码部分配置
请更新SDKBridge.java到最新,并检查代码里面是否有注册 urlScheme 监听器的代码,如果没有需要手动添加
/**
* 注册urlScheme 监听器
* @param callback
*/
public static void registerUrlScheme(ActionCallback callback) {
Action action = new Action(ActionConst.REQ_ACTION_SEND_URL_PARAM, Action.TAG_NATIVE, null);
nativeAction.put(action.action, callback);
//只需要注册回调,不要发送给sdk
}
同时请检查 Activity 是否重写了 onNewIntent 方法,具体如下
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);//需要调用setIntent方法
HashMap<String, String> params=SDKBridge.openUrl(); //获取到url的参数
}
11.Android 下载模块接入
首先在 app 的 manifest 中添加权限
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
然后在 Application 标签内添加 provider,针对 andriodx 工程
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileProvider"//${applicationId}为你的包名
android:grantUriPermissions="true"
android:exported="false">
<!-- 元数据 -->
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/download_path" />
</provider>
download_path 文件内容,需要建立在 res/xml 目录下,文件名为 download_path.xml
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-files-path
name="external_files_path"
path="Download" />
<external-files-path
name="Download"
path="/download" />
</paths>
注意:
<external-files-path>
代表的是/storage/emulated/0/Android/data/你的包名/files/目录、与 Context.getExternalFilesDir()方法获得的相同,所以上面的意思就是将 Context.getExternalFilesDir("")+“/download”文件夹下面的数据暴露给系统(如果不暴露,系统无法获取到安装文件,就没办法安装更新)
具体使用方法请查看[SDK API 函数说明文档]