最近有朋友在我的博客私信我,向我咨询一些关于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目录一同导出,具体导出方法请参考我的另一篇博客:javascript:void(0)

另外一种方法是先将图片转化为字符串,将字符串用一个静态常量存储,使用时再转化为图片的方式显示,如:

/**
     * 将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的时候也会有一些不大不小的坑,给大家分享一些常规的注意事项吧,详情见:javascript:void(0)
javascript:void(0)
由于笔者较懒,所以就不多说了,其他的例如包冲突的坑,大家自行百度解决吧,百度是你最好的老师之一哦。
3.module形式
在日常开发中,我们经常会在不同的项目中遇到重复的功能,或者相似的功能,但是如果一遍一遍的CV,终究不是可取之道,那么我们就可以采用模块化的思想,将一些常规的功能封装到一个模块中,也就是一个module,使用时主app module依赖这个module就可以了,开发效率也会大大提高,module适用于自己日常开发使用,但是凭借Android的开源精神,也可以发布给其他人使用,由于module是代码可见,并且可以轻松改动的形式,所以更适用于一些相似功能的封装,以便于修改源码。
4.远程依赖形式 使用Android studio可以直接在gradle中配置远程依赖,不用自己再去下载各种库,用着可是不能再爽了,并且可以很方便的持续更新维护,目前很常用的远程仓库有maven和jcenter等,至于上传方式各有不同,由于这个已经在网上有很多的教程,