相信做Android开发的小伙伴,肯定使用过很多第三方的 SDK,比如极光 SDK、支付宝 SDK、微博 SDK 等等。所谓 SDK 就是一个开发工具包,全称是 Software Development Kit,翻译过来是软件开发工具包。SDK 通常是为辅助开发某类软件而编写的特定软件包。
App 开发与 SDK 开发的工作有什么区别呢?App开发更偏向于用户层面,从 UI 展示到业务逻辑处理,全程处理用户的行为。而SDK开发更偏向于功能方面,注重功能的开发实现,轻 UI。
SDK设计原则
核心原则:一定要稳定,不能引起客户 App 的崩溃。Android SDK 开发来说,要注意 try…catch 的使用、对象的检查等等。
首先需要明确,一方面,SDK 的价值是给调用者带来价值。所以要努力降低用户的上手难度,易于理解。另一方面要时 SDK 代码易于维护。
1.接口易用性。
2.命名规范要统一。
3.跨端接口尽量保持一致。
4.尽量不依赖第三方库。
5.SDK 包尽量小。
6.兼容性。
接下来,Java 23种设计模式便大派用场了。SDK架构设计最常用的就是单例模式、建造者模式、代理模式、桥接模式、观察者模式等等,SDK设计过程中都遵循Java编程思想和Java设计六大原则。话不多说,我们现在就通过项目看下SDK开发架构设计是如何设计的,如何选型Java 23种设计模式其中的一种。
首先创建Android studio项目,其次创建Android Library就可以了。
如下:
在SDK层测试代码如下:
运行此项目,看app层能不能正常调用SDK层,运行结果如下:
由上图可以看出,app层可以正常调用SDK层,说明SDK已经集成到Android app项目里面了,接下来我们可以在SDK层开发架构设计了。
XLKClientSdk项目结构如下:
源码如下:
IWarpper.java
package com.xlk.client_sdk.warpper;
import android.content.Context;
public abstract interface IWarpper {
void configuration();
}
Creator.java
public abstract class Creator {
//创建一个产品对象,其输入参数类型可以自行设置
public abstract IWarpper createProduct(Class clazz);
}
CreatorImpl.java
/**
* 这样设计,可以随意生产产品了。
*/
public class CreatorImpl extends Creator{
@Override
public IWarpper createProduct(Class clazz) {
IWarpper product = null;
try {
product = (IWarpper) Class.forName(clazz.getName()).newInstance();
} catch (Exception e) { //异常处理
e.printStackTrace();
}
return (T) product;
}
}
HUAWEIWarpper.java
/**
* SDK层类,不允许外层调用该类。
*/
public class HUAWEIWarpper implements IWarpper {
@Override
public void configuration() {
SDKLogcatUtil.e("华为手机配置SDK层处理");
}
}
XIAOMIWarpper.java
/**
* SDK层类,不允许外层调用该类。
*/
public class XIAOMIWarpper implements IWarpper {
@Override
public void configuration() {
SDKLogcatUtil.e("小米手机配置SDK层处理");
}
}
HUAWEIProxy.java
/**
* 代理模式
*/
public class HUAWEIProxy implements IWarpper {
private HUAWEIWarpper instance= new HUAWEIWarpper();
/**
* 每次HUAWEIProxy类加载的时候HUAWEIWarpper都会创建对象
*/
@Override
public void configuration() {
SDKLogcatUtil.e("----HUAWEIWarpper对象创建"+instance);
instance.configuration();
}
}
XIAOMIProxy.java
/**
* 代理模式
*/
public class XIAOMIProxy implements IWarpper {
private XIAOMIWarpper instance = new XIAOMIWarpper();
/**
* 每次HUAWEIProxy类加载的时候HUAWEIWarpper都会创建对象
*/
@Override
public void configuration() {
SDKLogcatUtil.e("----XIAOMIWarpper对象创建"+instance);
instance.configuration();
}
}
XLKClientSdk.java
public class XLKClientSdk {
private static Context context;
/**
* 持有Context引用
* @param context
*/
public static void initContext(Context context){
XLKClientSdk.context = context;
}
/**
* 采用工厂模式
* @param clazz
* @param
* @return
*/
public static IWarpper getModule(Class clazz){
return new CreatorImpl().createProduct(clazz);
}
}
以上就是SDK层代码,上述代码可以看出,此项目开发采用了Java设计模式的两种,分别是代理模式和工厂模式。
接下来,我们通过app层来调用SDK层代码,代码如下:
public class MainActivity extends AppCompatActivity {
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = findViewById(R.id.method);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
XLKClientSdk.getModule(XIAOMIProxy.class).configuration();
XLKClientSdk.getModule(HUAWEIProxy.class).configuration();
}
});
}
}
运行结果如下:
这就是SDK层项目整个逻辑了。但接下来我们发现了一个问题,我刚点了第一次按钮了,我在点击一次看看,打印log如下:
从上面可以看出,HUAWEIProxy、XIAOMIProxy类每次加载的时候都会去分别创建HUAWEIWarpper、XIAOMIWarpper对象,这就有问题了,频繁创建对象和回收该对象,会引发性能问题,那小伙伴们,该如何解决呢?我相信,小伙伴们第一个想到的就是Java设计模式中的单例模式,那除了单例模式还有其他的吗?还有我突然想到HUAWEIWarpper、XIAOMIWarpper类是不允许外部调用此类,因为我读过Context源码,Context类里面用到了代理模式。
如下图:
如上图可以看出,我们不希望HUAWEIWarpper、XIAOMIWarpper类暴露给外层。
以上两种问题期待下回讲述。
上述整个就是开发架构整个设计过程,开发过程中都遵循Java编程思想和Java设计六大原则以及设计模式,作为开发者,需要必备架构设计的能力。下期会讲述关于SDK层更多的设计模式,享元模式,策略模式,桥接模式,观察者模式等等,搜索并关注公众号“Android技术迷”,可查看更多有关的SDK层源码相关文章。