首先来看一下Android Studio默认Project中的app module,以及可创建的Android Library以及Java Library两种module的差异:
module | gradle plugin | 生成文件格式 | 是否可使用SDK API |
---|---|---|---|
app | com.android.application | apk | 可以使用 |
Android Library | com.android.library | aar | 可以使用 |
Java Library | java | jar | 不可使用 |
三种module主要差别就在于使用的 gradle plugin 上。
由于Android Studio限制,默认创建的Java Library无法使用Android的API。
如果想创建一个类似SDK的工程,就要创建Android Library模块,这又导致默认生成的是aar格式文件。网上查到的一些做法是编写自定义的gradle task,将生成aar过程中的中间产物 class.jar 复制出来并重命名。
实际还有一种方法,创建Java Library就可以。
Java Library默认的build.gradle为:1
2
3
4
5apply plugin: 'java'
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
}
因此在这个module工程中还可以引用其他jar库。那么直接将Android SDK的android.jar文件复制到module的libs文件夹下:
这样就可以正常使用Android的所有API了,同时生成出的文件是jar格式。
编写一个测试类作为最终要使用的jar:1
2
3
4
5
6
7
8
9
10
11public class FoobarTest {
private static final String TAG = "FoobarTest-TAG";
public TextView testMethod(Context context) {
Log.i(TAG, "Hello from FoobarTest");
TextView mText = new TextView(context);
mText.setText("Hello world");
return mText;
}
}
在这个类中我们调用了打印日志接口,并通过传入的Context变量创建一个TextView返回给上层调用者。
接下来运行gradle build命令,生成jar文件,并将其拷贝到测试的app工程目录下:
然后来编写一个测试的Activity,调用生成的jar文件:1
2
3
4
5
6
7
8
9
10
11
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContext = this;
mLinearLayout = (LinearLayout) findViewById(R.id.linear_layout_main);
mLinearLayout.addView(new FoobarTest().testMethod(mContext));
}
向Activity的LinearLayout添加了jar返回的TextView,运行测试APP,就可以看到界面中已经正确显示TextView中的内容了,并且控制台输出了jar中打印的log信息。