来自自己简书博客:原文地址:https://www.jianshu.com/p/4d092c915ef1

首先SDK是提供给别人调用的工具。所以常见的SDK都是以jar包,so库,aar包等方式导入APP项目中。然后提供一些公开的API供接入方调用。所以在Androidstudio中如果需要生成jar或者aar,就需要将module变成library。

1、AndroidStudio生成library

在这里介绍AndroidStudio两种生成library的方式。

1.1、两种生成library的方式
新建library module。



这种会直接生成可编译成jar和aar的module。

新建Android项目,然后修改app下的build.gradle

apply plugin: 'com.android.application'修改成apply plugin: 'com.android.library'

然后去掉applicationId "com.mg.axe.helloworld"就把可运行的Android module变成了一个library module。

注意:这种方式在编译前一定要做以下事情

* 删除自定义的Application和在AndroidManifest.xml的配置。

* 去点入口的Activity,否则在Android Studio接入时会生成两个图标入口。

1.1、使用gradle所带的命令编译

这些命令可以自己在控制台使用,可以直接点开右上角的Gradle直接使用。

  • assembleRelease&assembleDebug



在build下的assembleRelease和assembleDebug都可以生成aar包。这边和APP开发很相似,可以在buildTypes下对release包做混淆等等操作。

如果编译的命令执行完毕,可以在当前module下的build文件下找到编译好的.aar文件。



如果需要jar包,则只需将这个aar文件解压即可。



classes.jar就是编译成jar的class文件。

1.2、aar和jar
  • .aar是适用于AndroidStudio的接入方式,不需要过多的考虑当SDK存在界面,图片等资源文件的情况。解压aar也可以看到,aar是一个将源码(jar)和资源文件都打包好的文件。当然也可以在eclipse中使用,前提是eclipse需要安装gradle编译环境。

  • jar只包含编译好的源代码,如果SDK包含资源文件,则需要额外导入,适用于eclipse导入;AndroidStudio也同样适用,不过当SDK包含资源文件时,导入aar将会更方便。

2、两种接入方式

一般情况接入方式为AndroidStudio和Eclipse。其他的接入方式就不考虑了,可能大同小异,最主要的是其他的接入方式我也不会。

2.1、AndroidStudio接入方式

这里只介绍.aar的接入方式,AndroidStudio接入jar方式就不做介绍。

* 将.aar文件复制到项目的libs中。

* 并在app下的build.gradle中的android中添加如下代码

repositories{
flatDir {
dirs 'libs'
}
}
  • 在dependencies中添加依赖的代码
  // implementation(name: 'aar包的名字', ext: 'aar')
implementation(name: 'game_sdk', ext: 'aar')

然后点击同步(Sync Now),就成功的将.arr导入项目了。

可以在External Libraries中找到导入的aar依赖。



点开aar,可以看(源代码)jar和(资源文件)res。

2.2、Eclipse接入方式

eclipse一般是接入jar包的方式接入SDK,当SDK存在界面、资源文件时,接入方式比AndroidStudio接入aar稍微麻烦点,需要将jar包和资源文件分开导入。

* 解压aar文件。

* 将jar包复制到libs文件加下,并添加依赖(add to path) 。

* 如果有资源文件,则需要将res下的资源文件复制到项目对应的位置。

* 如果SDK用到了Activity等组件,还需去注册等,这些都应在SDK接入文档中指明清楚。

2.3、两种接入方式都需要注意的问题

在SDK中声明的权限,制定的Android版本范围等都要在SDK接入文档中指明清楚。

3、可能踩的坑

3.1、资源文件无法获取的问题。

如果编译好的jar中使用了资源文件,然后使用了R.xx.xx这样的代码,可能会出现这样的异常。

java.lang.NoClassDefFoundError: Failed resolution of: Lcom/ysyc/axechen/R$id

找不到id。最后是参照开源的TypeSDK才解决了这个问题。通过如下的方法去寻找id。

public class GetResId {
public static int getId(Context context, String paramString1, String paramString2) {
return context.getResources().getIdentifier(paramString2, paramString1, context.getPackageName());
}
}

加载布局和控件的方法:

// 获取布局id
GetResId.getId(this, "layout", "activity_main") // 获取控件id
GetResId.getId(this, "id", "login")
3.2、三方包冲突问题

如果SDK用到了三方库,然后接入方的项目中也用到了同样的三方库,那么当编译的时候就会出现类冲突,无法编译通过。这个时候就要求在编译SDK时不要将三方的依赖编译到SDK的jar中。那么在添加依赖时需要使用compileOnly关键字。

compileOnly files('libs/gson-2.8.5.jar')

或者

compileOnly 'com.google.code.gson:gson:2.8.5'

这样才不会将引入的依赖编译到SDK的jar中,这个时候需要接入方导入这些依赖,当然SDK的接入文档要详细说明。

3.3、请使用最平常的api和习惯

最好不去使用一些新的特性。如果接入方没有使用到这些特性,可能编译无法通过,尤其是eclipse接入时会出现更多问题。我遇到的问题:我在编译SDK时就是因为使用了lamada表达式导致eclipse无法编译通过。

4、混淆

SDK的混淆和做app的混淆是一样的。

 buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}

在混淆的时候,如果使用了三方库,三方库混淆的要求同样需要加上混淆。

如果接入方需要做混淆,请记住加上SDK的混淆要求和三方库的混淆要求。免得SDK的代码混淆之后又被接入方混淆导致出错。

5、关于SDK的其他解决方案

实际上,用原生的界面做SDK并不是非常好的解决方案,主要是不利于SDK的更新和跨平台。最好的方式是加载H5,更新起来更方便,SDK实现起来更简单。

6、一些开源的SDK

https://github.com/typesdk/TypeSDK

https://github.com/zuowutan/ShareGameSdk

如果这篇文章对你有帮助,还请点个赞再走吧:)

AndroidStudio封装SDK的那些事的更多相关文章

  1. ubuntu下搭建android开发环境核心篇安装AndroidStudio、sdk、jdk

    本文系转载http://blog.csdn.net/lsyz0021/article/details/52215996 一.安装前的准备 1.1.如果你还没有安装ubuntu 14.04 LTS系统, ...

  2. iOS 封装SDK以及封装时bundle文件的处理

    这篇教程的主要目的是解释怎么样在你的iOS工程中创建并使用一个SDK,俗称.a文件. 环境:xcode 9.0 创建一个静态库工程 打开Xcode,点击File\New\Project, 选择iOS\ ...

  3. cordova 和 java ( JDK ) 和 android-studio (SDK)的初始安装和配置

    一:前言(2018) 之前封装APP都是用的HBuilder结合mui来封装的简单app,有空的时候想研究下之前的phonegap来封装app.然后遇到的问题还是蛮多的,毕竟之前没弄过. 下面的步骤主 ...

  4. 接入 SDK 结果翻车了?了解 SDK 的那些事

    前段时间,二狗子的朋友圈被工信部发布的<关于下架侵害用户权益 App 名单的通报>给刷屏了.公告中指出有 90 款 App 未按照要求完成整改将会下架.而这 90 款 App 涉及全国各地 ...

  5. jeecg扩展封装tag的那些事

    版权声明:本文为楼主原创文章,未经楼主允许不得转载,如要转载请注明来源. 目前公司开发一直使用的是jeecg框架,简单好用,但有时候不如自己写的随心所欲.最近项目遇到一个需求, 想封装配置加解密,本来 ...

  6. C# 封装SDK 获取摄像头的水平角度和垂直角度

    最近需要做一个C#版本的控制终端,控制摄像头,获取摄像头的水平角度和垂直角度 获取当前摄像头的角度,需要调用一个名为NET_DVR_GetDVRConfig的bool类型的函数 在C++中,函数定义: ...

  7. iOS代码封装成.a文件(封装SDK)

    在众多开源的大神的博客里经整理如下:(已测试ok) 一.描述一下 Build ActiveArchitecture Only设置成YES: Architectures按Xcode默认配置,arm64向 ...

  8. AndroidStudio——Android SDK

    前言 安卓的SDK包,跨过长城下载好的,分享出来一下~ Android Studio版本 | 3.4.1 下载地址 微云下载地址 | 链接:https://share.weiyun.com/5rm6l ...

  9. 封装sdk API 应用

    1 #include "QWinApp.h" 2 #include "QGlobal.h" 3 int WINAPI _tWinMain(HINSTANCE h ...

随机推荐

  1. BC 52 div2 A Victor and Machine

    简单数学题,把这道题目贴上去的不过为了不想看到这个月写了某个数字篇博客,该数字有点不吉利... 近期没有学习的欲望.. . 集中不了注意力,今天打BC还是做出来一题,尽管涨分了,真心希望能接近cf的水 ...

  2. 位数(digits)的处理

    主要针对:二进制表示法,以及十进制表示法: 1. 获取位数 已知该数 n 采用十进制进行表示 二进制形式的位数:⌊log2n⌋+1 十进制形式的位数:⌊log10n⌋+1 2. 截断(保留前/后 m ...

  3. 用多年前据说买买提上理论水平最高的帖子做镇楼贴---NASA有吹牛了

    美国国会一直有意把nasa 划入国防部,取消太空探索所关联的部门,因为这些部门都是些烧钱的大包袱,而把具有军事意义的部门留下.国会想把烧钱部卖给google,可能是要价太高,最后没有谈拢,不了了之.但 ...

  4. jmeter--使用badboy录制脚本

    JMeter录制脚本有多种方法,其中最常见的方法是用第三方工具badboy录制,另外还有JMeter自身设置(Http代理服务器+IE浏览器设置)来录制脚本,但这种方法录制出来的脚本比较多且比较乱,个 ...

  5. 基于Qt Assistant制作软件帮助文档

    Qt Assistant是Qt自带的一款可定制.可重新发行的帮助文件浏览器.Qt Assistant支持HTML文件,用户可以利用其定制自己的功能强大的帮助文档浏览器.关于Qt Assistant定制 ...

  6. 开发板 视频04_05 ubuntu的联网及基本设置

    4g内存 如果电脑有两g,只能给1.5g 处理器可以根据实际选 usb3.0 或者 2.0 联网模式:: 桥接模式 启动式连接,,,,网是不固定的 仅主机模式,主机和虚拟机在一个网络 第三种联网,自定 ...

  7. HDU1392:Surround the Trees(凸包问题)

    Surround the Trees Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  8. php spl标准库简介(SPL是Standard PHP Library(PHP标准库)(直接看代码实例,特别方便)

    php spl标准库简介(SPL是Standard PHP Library(PHP标准库)(直接看代码实例,特别方便) 一.总结 直接看代码实例,特别方便易懂 thinkphp控制器利眠宁不支持(说明 ...

  9. zeros() 函数——MATLAB

    zeros函数——生成零矩阵 ones函数——生成全1阵 [zeros的使用方法] B=zeros(n):生成n×n全零阵. B=zeros(m,n):生成m×n全零阵. B=zeros([m n]) ...

  10. Python安装后,Python IDLE等的位置

    安装后,Python的目录下有如下文件: