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

前言

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

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

结构概览:

  • 前期了解

  • 生成.jar包与.arr包

  • 引用.jar包与.arr包

  • 扩展内容

前期了解

.jar 与 .aar的区别

  • .jar 中只包含class文件和清单文件(java application resource)

    扫描二维码关注公众号,回复: 1870833 查看本文章
  • .aar 中包含了class文件和其他所有资源文件,包括res中资源文件(android application resource)

分别存储位置(前期可忽略,只做借鉴之用)


     *.jar:库 /build/intermediates/bundles/debug(release)/classes.jar

           或
            <-- mysdj.jar名称自己设置-->
            库/build/libs/mysdk.jar

     *.aar:库 /build/outputs/aar/libraryname.aar

生成.jar包与.arr包

1.首先创建一个Library,File - New - New Module
这里写图片描述

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

图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();
            }
        });
    }
}

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

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


扩展内容

  • 把资源(图片,布局,string等)打进jar包呢

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

反射类:

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;
    }
}
  • library删除方式(如果你直接想通过Delete删除的话,你会发现根本没有这个选项,所以无法删除!故此请根据以下步骤进行操作)

1.右键点击项目,调出选项界面
这里写图片描述
2.选取需要删除的library,进行删除
这里写图片描述
3.当完成Modules下libray删除后,进行项目结构内的libray删除(这时候也可直接调用Delte进行删除)
这里写图片描述
4.直接选取yes干掉它就可以咯!
这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_20451879/article/details/80423642