好无奈啊,好无奈,一个简单的东西~竟然折腾了我满满一下午,主要原因在于从网上找的大部分文章都介绍不详细,有时候看的越多越容易混淆自己!不过最终结果是好的,总算搞了出来,所以此篇的存在主要在于快速解决像我一样遇到这类问题的人!
全文几乎图文并茂,如果你还掌握不了这个技能点的话,我会超级伤心的…伙计!
.jar 中只包含class文件和清单文件(java application resource)
.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
1.首先创建一个Library,File - New - New Module
2.创建Libray时的步骤与说明
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
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包
2.引用当前libs下的.jar包
方式一:.jar包(右键)- Add As Library
引用.arr包
android{}里添加如下内容
repositories {
flatDir {
dirs 'libs'
}
}
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外还要引用其中需要的其他第三方库
使用方式
代码调用:
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包中用到的资源放到你使用该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;
}
}
1.右键点击项目,调出选项界面
2.选取需要删除的library,进行删除
3.当完成Modules下libray删除后,进行项目结构内的libray删除(这时候也可直接调用Delte进行删除)
4.直接选取yes干掉它就可以咯!
如果遇过遇到 Could not resolve all dependencies for configuration 问题,可尝试通过这里进行解决,主要好像需要下载对应版本的gradle版本~
文章借鉴:
Android studio中生成引用.aar和.jar的方法详解
AndroidStudio项目打包成jar的简单方法
Android Studio 如何打JAR包