含着泪写组价化

284 阅读2分钟

现状

当前项目中引用了很多的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'
        }
    }