最近有朋友在我的博客私信我,向我咨询一些关于Android SDK开发的相关知识,借此机会,将我自己在开发SDK过程中的一些心得分享给大家,谢谢。
1. 什么是SDK?
SDK(Software Development Kit 即 软件开发工具包),而我们自己开发的Android sdk本质上与Google提供的Android SDK是一样的,都是用于Android 应用程序的开发,你可以想象为是一个工具袋,当别人要用的时候,只需要知道这个工具袋有什么作用以及怎么使用就OK,而无需知道怎么制作这个工具袋。
2. SDK有哪几种表现形式?
就目前而言,Android 端sdk的表现形式有很多种,我大致列举一下常见的几种表现形式:
1、jar包形式
2、aar形式
3、module形式
4、远程依赖库形式
3. 各种形式的开发需要注意什么?
1.Jar包形式
jar包形式是最常见的一种sdk表现形式,优点在于:体积小、编译速度快,缺点是:不能含有xml布局文件,以及直接使用图片等资源文件,但是,如果我们的sdk需要提供界面,又需要使用图片资源的时候该怎么办呢?在这里为大家提供一种常用的解决方案,由于jar打包生成之后不能包含xml布局,以及图片资源文件,所以我们可以采用代码动态布局,例如:
/**
* Created by lxh on 2017/2/10.
* QQ-632671653
*/
public class Test1 extends Activity {
private Context mContext;
@Override
public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
super.onCreate(savedInstanceState, persistentState);
this.mContext = this;
//创建一个根布局
RelativeLayout rootLayout = new RelativeLayout(mContext);
RelativeLayout.LayoutParams rootLP = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT);
rootLayout.setLayoutParams(rootLP);
//创建一个TextView
TextView testTV = new TextView(mContext);
testTV.setLayoutParams(new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
testTV.setText("这里是动态创建的布局");
//将TextView加入到根布局中
rootLayout.addView(testTV);
//将布局添加到activity
setContentView(rootLayout);
}
}
对于图片资源的处理,我们可以有多种处理办法,第一种:将图片放置在asset目录中,
然后使用以下方法获取到图片的位图
/**
* 获取asset目录下图片的位图
* @param picName
* @return
*/
private Bitmap getAssetPic(String picName){
Bitmap bitmap;
InputStream is= null;
try {
is = mContext.getAssets().open(picName);
bitmap = BitmapFactory.decodeStream(is);
return bitmap;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
获取到bitmap之后就可以很轻松的设置到imageview或者相关自定义控件上面了如:
imageView.setImageBitmap(getAssetPic("xxxxx.jpg"));
导出jar包时,将asset目录一同导出,具体导出方法请参考我的另一篇博客:http://blog.csdn.net/qq_23286245/article/details/50344071
另外一种方法是先将图片转化为字符串,将字符串用一个静态常量存储,使用时再转化为图片的方式显示,如:
/**
* 将bitmap转为字符串
* @param bitmap
* @return
*/
public String bitmaptoString(Bitmap bitmap){
String string=null;
ByteArrayOutputStream bStream=new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG,100,bStream);
byte[]bytes=bStream.toByteArray();
string= Base64.encodeToString(bytes,Base64.DEFAULT);
return string;
}
/**
* 将字符串转bitmap
* @param string
* @return
*/
public Bitmap stringtoBitmap(String string){
Bitmap bitmap=null;
try {
byte[]bitmapArray;
bitmapArray=Base64.decode(string, Base64.DEFAULT);
bitmap=BitmapFactory.decodeByteArray(bitmapArray, 0, bitmapArray.length);
} catch (Exception e) {
e.printStackTrace();
}
return bitmap;
}
2.aar形式
aar相当于jar的进化版,为了解决jar不能包含资源文件而应运而生,aar是可以包含图片文件夹和xml布局的,可以直接将aar发布给他人使用,也可以将aar发布到maven,供他人远程依赖使用,但是再制作aar的时候也会有一些不大不小的坑,给大家分享一些常规的注意事项吧,详情见:https://my.oschina.net/u/1393188/blog/492576
http://blog.csdn.net/dliyuedong/article/details/49408931
由于笔者较懒,所以就不多说了,其他的例如包冲突的坑,大家自行百度解决吧,百度是你最好的老师之一哦。
3.module形式
在日常开发中,我们经常会在不同的项目中遇到重复的功能,或者相似的功能,但是如果一遍一遍的CV,终究不是可取之道,那么我们就可以采用模块化的思想,将一些常规的功能封装到一个模块中,也就是一个module,使用时主app module依赖这个module就可以了,开发效率也会大大提高,module适用于自己日常开发使用,但是凭借Android的开源精神,也可以发布给其他人使用,由于module是代码可见,并且可以轻松改动的形式,所以更适用于一些相似功能的封装,以便于修改源码。
4.远程依赖形式
使用Android studio可以直接在gradle中配置远程依赖,不用自己再去下载各种库,用着可是不能再爽了,并且可以很方便的持续更新维护,目前很常用的远程仓库有maven和jcenter等,至于上传方式各有不同,由于这个已经在网上有很多的教程,再次也就不过多赘述了,贴上几篇博客以供大家参考:
http://blog.csdn.net/lmj623565791/article/details/51148825
http://www.jianshu.com/p/e443456bb506
http://blog.csdn.net/zhangbuzhangbu/article/details/51730402
至此,差不多该去吃午饭了,有更多疑问的朋友,欢迎加QQ:632671653交流,感谢各位大佬的博客,贸然引用,还请见谅,笔者已然懒癌晚期。。。嘿嘿。皮皮虾,我们走。。。。