android studio看架构引用,Android进阶之路 - AndroidStudio内快速生成与引用.jar包与.arr包...

前言

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

声明

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

结构概览

前期了解

生成 .jar包、.arr包

引用 .jar包、.arr包

扩展内容

前期了解

.jar 与 .aar的区别

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

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

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

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

库/build/libs/mysdk.jar

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

生成 .jar包、.arr包

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

5e042e65a8c43e4240320fa573fa66d3.png

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

图2-1

f9b837a2b6e3f358ebbb079604e2ca7c.png

图2-2

7fbd11f30ce30dd9df98a8334c9787dd.png

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

7aaa61c4315db8b3061ffdfb153c552e.png

4.mylibrary - bulid.gradle 初始状态

133bcdea0f1460844e26ae57f4a233eb.png

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 加入以下配置信息

987c6185a2cc316bbf5c54c54efe36dc.png

可直接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

63919d47cf1bf393fb7c2533baf6fc8d.png

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

图7-1

82809a24510f73d447f80bb42c4af853.png

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

89304cf006a0ce6a2a865ea1149d0b66.png

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

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

423669de606c648b6a249191a6008a68.png

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

41d5717ff7b092eb55096f2e5ae512eb.png

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

fec5eae1ec9085fc0bc5c2f0606af4d8.png

引用 .jar包、.arr包

引用.jar包

1.copy之前生成的.jar包到我们app - libs

b32e6c6b9ab90f177016597eaa5e14e3.png

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

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

图2-1

dc3974a6a7456fd0ac08729745e7bdcc.png

图2-2

d773099ccc572c88b0f7227109540cb1.png

方式二:build.gradle(app) 自己添加引用的.jar包地址

ed51d485920a0bd0aeca42bc23b2862a.png

引用.arr包

1.将我们生成的.arr包copy一份到我们app - libs

b265d1ad4421794abb476c592221c984.png

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包的内容)

ca80fca60897473a5afca04cbfd7c98f.png

代码调用:

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

}

});

}

}

执行前提醒:

9eac15b0c649cc3c79f8c48a467629d2.png

项目运行结果图:

a27eacb7e7d512b63ae4ea9832aadd82.png

扩展内容

把资源(图片,布局,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.右键点击项目,调出选项界面

ab2f98132c5b9f3150676eff2fc1da0a.png

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

c7d21eb4c1b20976b4ed5946200e8aa4.png

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

f2364771aef15b19f2ad166c6fc2dab2.png

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

ae31e8b0f5a6ab902bc27a6ab1695b72.png

如果遇过遇到 Could not resolve all dependencies for configuration 问题,可尝试通过这里进行解决,主要好像需要下载对应版本的gradle版本~

文章借鉴:

Android studio中生成引用.aar和.jar的方法详解

AndroidStudio项目打包成jar的简单方法

Android Studio 如何打JAR包

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值