Android进阶之路 - 快速生成与引用.jar包与.arr包

好无奈啊,好无奈,一个简单的东西~竟然折腾了我满满一下午,主要原因在于从网上找的大部分文章都介绍不详细,有时候看的越多越容易混淆自己!不过最终结果是好的,总算搞了出来,所以此篇的存在主要在于快速解决像我一样遇到这类问题的人!

全文几乎图文并茂,如果你还掌握不了这个技能点的话,我会超级伤心的...伙计!

前期了解

.jar 与 .aar 区别

.jar包:包含class文件和清单文件java application resource

.aar包:包含了class文件和其他所有资源文件,包括res中资源文件(android application resource

.jar 与 .aar 存储位置

前期可忽略,只做借鉴之用


     *.jar:库 /build/intermediates/bundles/debug(release)/classes.jar
     
		   或
		    <-- mysdj.jar名称自己设置-->/build/libs/mysdk.jar
			  
     *.aar:库 /build/outputs/aar/libraryname.aar

.jar、.aar 生成引用

其实学会.jar、.aar 是在后期开发组件化、模块化中的必备技能之一

生成 .jar包、.arr包

1.首先创建 Library,File - New - New Module

这里写图片描述

2.创建Library时的步骤与说明

图2-1

图2-2

3.mylibrary - src - main创建我们想要被外部调用的类与方法mylibrary是我们当时创建Module时起的名字,之后的mylibrary 将不再进行解释

这里写图片描述

4.mylibrary - bulid.gradle 初始状态

这里写图片描述

FirstJar

package com.example.yongliu.mylibrary;

/**
 * author  yongliu
 * date  2018/5/24.
 * desc:
 */

public class FirstJar {
    public static void tellWhat(){
        System.out.println("Tell me what are you !");
    }
}

5.mylibrary - bulid.gradle 加入以下配置信息

这里写图片描述

可直接copy至android{ }

    task makeJar(type: Copy) {
        //删除旧的jar包
        delete 'build/libs/mysdk.jar'
        //原地址
        from('build/intermediates/bundles/release/')
        //导出jar包的地址
        into('build/libs/')
        //包含的jar包
        include('classes.jar')
        //重命名jar包为mysdk
        rename ('classes.jar', 'mysdk.jar')
    }
    makeJar.dependsOn(build)

    lintOptions{
        abortOnError false
    }

完整的mylibrary - bulid.gradle配置

apply plugin: 'com.android.library'

android {
    compileSdkVersion 26
    task makeJar(type: Copy) {
        //删除旧的jar包
        delete 'build/libs/mysdk.jar'
        //原地址
        from('build/intermediates/bundles/release/')
        //导出jar包的地址
        into('build/libs/')
        //包含的jar包
        include('classes.jar')
        //重命名jar包为mysdk
        rename ('classes.jar', 'mysdk.jar')
    }
    makeJar.dependsOn(build)

    lintOptions{
        abortOnError false
    }

    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])

    implementation 'com.android.support:appcompat-v7:26.1.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

6.AndroidStudio右侧上方的Gradle - mylibrary - Tasks - other

这里写图片描述

7.操作流程 -.- ~ Gradle - mylibrary - Tasks - other - makeJar

图7-1

这里写图片描述

图7-2 makeJar执行后的As界面

这里写图片描述

8.MakeJar执行完毕之后,查看我们生成的.jar包

方式一:通过mylibrary - intermediates - bundles 查看debug 或者 release下的 classes.jar

这里写图片描述

方式二:通过mylibrary - build - libs 查看mysdk.jar(.jar包名为我们在build.gradle设置的名称)

这里写图片描述

9.mylibray - build - outputs - aar 查看我们生成的.arr包

这里写图片描述


引用 .jar包、.arr包
  • 引用.jar包

    1.copy之前生成的.jar包到我们app - libs
    这里写图片描述

    2.引用当前libs下的.jar包

    方式一:.jar包(右键)- Add As Library

    图2-1
    这里写图片描述
    图2-2
    这里写图片描述
    方式二:build.gradle(app) 自己添加引用的.jar包地址
    这里写图片描述

  • 引用.arr包

    1.将我们生成的.arr包copy一份到我们app - libs
    这里写图片描述
    2.build.gradle(app)

  • android{}里添加如下内容

repositories {
    flatDir {
        dirs 'libs'
    }
}
  • dependencies ('mylibrary-release’是根据你libs下.aar包的名称所设置的)
compile(name: 'mylibrary-release', ext: 'aar')

build.gradle(app)完整代码:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 26
    defaultConfig {
        applicationId "com.example.yongliu.jardemo"
        minSdkVersion 15
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    repositories {
        flatDir {
            dirs 'libs'
        }
    }
}

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    compile(name:'mylibrary-release', ext:'aar')
}

注意
如果aar中也引用了第三方的lib,那么打包后的aar中是没有把这些三方库加入到aar中的,这样就需要在app中除了引用.aar外还要引用其中需要的其他第三方库


使用方式

  • 代码中通过类名调用(这里默认出现了.jar包的引入提示,所以引入的其实是我们.jar包的内容)
    这里写图片描述

代码调用:

FirstJar.tellWhat();

完整代码:

package com.example.yongliu.jardemo;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.InputType;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.widget.EditText;

import com.example.yongliu.mylibrary.FirstJar;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
		//随便设置了一个点击事件
        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                FirstJar.tellWhat();
            }
        });
    }
}

执行前提醒:
这里写图片描述

项目运行结果图:
这里写图片描述


课外小兴趣

如何在使用jar包时,又调用资源呢? 有没有曲线救国的方式?

曲线救国 - 1:既然不包含那我们就把jar包中用到的资源放到你使用该jar的工程里面,然后通过反射即可(此类放在引用的jar包内!!!)

与其想着如何让jar包和资源相关联,真不如打aar包,除非你因为包体积太大,想着优化优化...

反射类:

public class MResource {
    public static int getIdByName(Context context, String className, String resName) {
        String packageName = context.getPackageName();
        int id = 0;
        try {
            Class r = Class.forName(packageName + ".R");
            Class[] classes = r.getClasses();
            Class desireClass = null;
            for (Class cls : classes) {
                if (cls.getName().split("\\$")[1].equals(className)) {
                    desireClass = cls;
                    break;
                }
            }
            if (desireClass != null) {
                id = desireClass.getField(resName).getInt(desireClass);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return id;
    }
}
引用.jar、.aar后,如何删除原始的moudle库?

library删除方式(如果你直接想通过Delete删除的话,你会发现根本没有这个选项,所以无法删除!故此请根据以下步骤进行操作

1.右键点击项目,调出选项界面

这里写图片描述

2.选取需要删除的library,进行删除

这里写图片描述

3.当完成Modules下libray删除后,进行项目结构内的libray删除(这时候也可直接调用Delte进行删除)

这里写图片描述

4.直接选取yes干掉它就可以咯!

这里写图片描述

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

远方那座山

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值