【安卓随笔】AAR开发实战——JAR、SO、资源、布局通通进我碗里来!

        每当引入某些第三方的库,或者将项目A中的功能集成到项目B中时,往往需要复制粘贴好多好多文件,jar、so、布局、图片甚至是Activity等等等等,一旦少复制一个,又会引起一连串的错误。相信你也曾因为这些苦恼过,那么今天我们就来介绍一种能将以上所有集成在一个文件的方法,那就是AAR组件开发。

        AAR(Android Archive)是Android库项目的二进制归档文件,我们常用的JAR一般情况下只能包含一些Class文件,而AAR则可以包含安卓开发中的一切资源,不管是JAR,还是SO,还是各种资源文件,通通可以放进AAR中。怎么样,很强大吧?那么我们就来介绍它应该怎么生成和使用。

一、准备工作

         由于本人手头的NDK程序都是一些商用的,考虑到源码的开放下载,所以决定临时写一些普通的SO库和JAR包做样例,这些过程如果也写出来就喧宾夺主了,所以今天就暂不介绍。我这次制作的JAR文件和SO库,JAR里包含了对SO库中的native方法的声明,SO库中是具体的实现。当然作为样例,功能是很简单的,传入一个int型的摄氏温度,通过SO库的计算返回一个int型的华氏温度。源码如下:

JAVA

public class TemperatureTrans {
    static {
        System.loadLibrary("TempTrans");
    }
    public static native int centigrade2Fahrenheit(int a);
}

C

#include "com_lbw_exampleaar_TemperatureTrans.h"

JNIEXPORT jint JNICALL Java_com_lbw_exampleaar_TemperatureTrans_centigrade2Fahrenheit(JNIEnv *env, jobject obj, jint a) {

    jint b = a * 9 / 5 + 32;
    return b;

}

然后我们就得到了这些文件,先别激动着导入他们,我们这次不是要说怎么使用一个开发好的SDK,而是怎么通过AAR使用它。


最后,为了证明图片资源的可用性,我们再随便度娘一张图片,然后准备工作就完成了。


(DVA爱你哟)


二、AAR的生成

我们先新建一个标准的安卓工程,然后新建一个Module,并将app加入此Module的依赖。然后在Module中补全jniLibs和mipmap等文件夹。


像以前一样,把SO文件放入jniLibs里,把JAR包放入libs里,把图片放入mipmap里,然后将JAR和Module关联起来。特别注意的是这里不是放入app工程里,而是放入我们刚刚创建的trans Module内。


我们这里的方法可以由外部单独调用,但为了体现AAR的强大,我决定在Module中写一个Activity来调用转换方法,然后外部来调用这个Activity。



public class TransActivity extends AppCompatActivity {
    EditText editText;
    TextView textView;
    Button btn;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_trans);
        editText = (EditText) findViewById(R.id.editText);
        textView = (TextView) findViewById(R.id.textView);
        btn = (Button) findViewById(R.id.button);

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                textView.setText("");
                int a = Integer.valueOf(editText.getText().toString());
                int b = TemperatureTrans.centigrade2Fahrenheit(a);
                textView.setText("华氏度:"+b);
            }
        });
    }
}

功能非常明了,在EditText输入一个摄氏温度,当点击转换按钮时,在TextView中显示出对应的华氏温度。当然,转换过程调用了我们刚才写的JNI方法。然后在中间显示出DVA的照片。

此时这个包含一切的Activity就写好了,现在点击Build->Rebuild Project,等待完成。


然后展开Module中的build/outputs/aar/,就可以看到AAR已经生成。


三、AAR的调用

我们再新建一个安卓工程,然后将刚才的AAR放入libs文件夹中,然后修改gradle如下:

apply plugin: 'com.android.application'
android {
    compileSdkVersion 24
    buildToolsVersion "24.0.2"
    defaultConfig {
        applicationId "com.lbw.aar4example"
        minSdkVersion 15
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    repositories {
        flatDir {
            dirs 'libs'
        }
    }
}
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:24.2.1'
    compile(name:'trans',ext:'aar')
}
在compile中name的值要和你的AAR文件名一样,文件名可以随便起,如trans。然后Sync,AAR的导入就完成了。

然后在MainActivty中直接启动AAR包内的TransActivity,然后查看运行结果。

startActivity(new Intent(this, TransActivity.class));


OK,打工告成,一切调用都没有问题,图片资源也正常,这样一个完整的AAR就做好了。


四、注意事项

        AAR的混淆不要写在Module里,否则调用时也需要调用abcd的方法,无比蛋疼...我们只需要在项目主工程里开启混淆即可。如果不需要混淆,则在proguard-rules中添加相应包名即可。

     AAR包虽然好用,但也不要随意使用,个人认为应该将一些常用而稳定不需要经常修改的功能做成AAR,否则在主工程内无法修改其中代码,还需要在AAR工程内修改后重新生成给主工程用,这样就会比较麻烦。


本期的分享就到这里,哪里有不足之处欢迎指出,下期也许会分享NDK开发的入门知识...


源代码下载






  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值