现状
当前项目中引用了很多的Library,然后这些Library隔离了业务逻辑,每次编译的时候,会对每一个Library进行编译,非常的消耗时间。
生成jar
将Library生成jar
1、首先要在settings.gradle中打开baseLibrary
2、在baseLibrary的build.gradle的结尾增加
//task to delete the old jar
task deleteOldJar(type: Delete) {
delete 'release/AndroidPlugin.jar'
}
//task to export contents as jar
task exportJar(type: Copy) {
from('build/intermediates/aar_main_jar/debug/') into('release/')
include('classes.jar')
///Rename the jar
rename('classes.jar', 'AndroidPlugin.jar')
}
exportJar.dependsOn(deleteOldJar, build)
3、然后选中baseLibrary,然后点击右边的Gradle侧边栏。
然后选择base->Tasks->other->exportJar
生成aar
MyLibrary引用了BaseLibarry的aar,Mylibrary生成aar供主App使用
1、选择baseLibrary,然后点击Build - Make Module 'baseLibrary',生成aar文件。
2、然后在MyLibrary中的build.gradle中android属性下添加下面的属性
repositories {
flatDir {
dirs 'libs','mylibrary/libs'
}}
3、然后在MyLibrary Module的build.gradle中的dependencies中添加
implementation(name: 'base-debug', ext: 'aar')
4、选中mylibrary,然后点击Build - Make Module 'mylibrary',生成aar文件。
2、然后在App Module的build.gradle中的android中添加下面属性
repositories {
flatDir {
dirs 'libs'
}}
3、然后在App Module的build.gradle中的dependencies中添加
implementation(name: 'mylibrary-debug', ext: 'aar')
implementation(name: 'base-debug', ext: 'aar')
BaseLibrary中BaseTest
package com.example.base;
import android.util.Log;
public class BaseTest {
public void test(){
Log.e("BaseTest","BaseTest-test");
}
}
MyLibrary中
package com.example.mylibrary;
import android.util.Log;
import com.example.base.BaseTest;
public class MyLibraryTest {
public void test(){
Log.e("MyLibraryTest","MyLibraryTest-test");
BaseTest baseTest = new BaseTest();
baseTest.test();
}
}
这个类中调用了Base Library中的方法。
主App Module中MainActivity的逻辑如下
package com.example.test;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import com.example.mylibrary.MyLibraryTest;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyLibraryTest test = new MyLibraryTest();
test.test();
}
}
在onCreate方法中调用了MyLibrary中的方法。
优点:
1、BaseLibrary中的代码进行了复用。
缺点:
在App中没有办法查看BaseLibrary中的代码逻辑。
更优的解决办法:
可以将BaseLibrary中的一些工具类拷贝到MyLibrary中,这样我们只需要生成一个aar文件就好。
引用aar注意事项
1、比如A库中使用了okhttp3的依赖,然后将A转换成了aar文件,那么在b中使用aar的时候,必须要引入okhttp3的依赖。
注意:如果想在b中使用A库的aar文件的时候,不需要引入okhttp的依赖,必须要加上transitive = false
2、比如有aar文件A,然后Library B里面引用了A,然后C引用了Library B,在C中必须要写上
// 依赖要去哪里找
repositories {
flatDir{
dirs 'libs','../Core/libs'
}
}