初始化

1.准备工作

  1. 下载最新版 Android SDK,并解压到单独的 sdk 目录

  2. 将 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.javaopen in new window文件

完成 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 文档目录open in new window索引对应的模块接入

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.javaopen in new window到最新,并检查代码里面是否有注册 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 函数说明文档]

Last Updated:
Contributors: jslgo, liaoxiaomin