每当引入某些第三方的库,或者将项目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开发的入门知识...