android studio生成aar包并在其他工程引用aar包
- arr引用和jar引用的区别
- 1.ARR实现简单的JAVA/Kotlin类和函数调用过程
- 1.1.新建需要打包成AAR的模块类
- 1.2.新建需要调用的类
- 1.3 创建 AAR 文件:
- 1.4 AAR文件使用
- 1.5 函数调用
- 2.实现AAR中activity的调用过程
- 2.1 ==**特别说明**==:
- 2.1.1 名称的设置
- 2.1.2 android:exported属性设置
- 2.2 新建需要封装的 android library
- 2.2.1 AAR打包文件的新建
- 2.2.2 AAR打包文件的调用
- 3 MainActivity2调用AAR完整code
arr引用和jar引用的区别
JAR文件,即Java Archive File,主要包含了class文件和清单文件,而不包含资源文件,如图片等所有res中的文件。因此,JAR文件更适合用于简单的类库。
而AAR文件,全称Android Application Resource,它包含了class文件以及res资源文件,这意味着它包含了所有Android应用程序可能需要的资源。因此,如果你的项目是一个UI库,包含一些自己写的控件布局文件以及字体等资源文件,那么就只能使用ARR文件
1.ARR实现简单的JAVA/Kotlin类和函数调用过程
1.1.新建需要打包成AAR的模块类
在现有工程中创建一个 Android Library 项目/module类:
在 Android Studio 中创建一个新的 Android Library 项目,例如命名为 myapplication。
在 Library 项目中创建 Kotlin /java类和函数:
(也可以新建Module,修改新建的build.gradle,将id 'com.android.application’修改为 id ‘com.android.library’,
并注释applicationId “com.example.myapplication1”)
1.2.新建需要调用的类
在 MyKotlinLibrary 项目中创建一个 Kotlin 类,例如 mylibrary.kt和mylibrary_java.java,
mylibrary.kt
package com.example.myapplication1public class mylibrary {public fun helloFromLibrary(): String {return "Hello from the kotlin library!"}
}
mylibrary_java.java
package com.example.myapplication1;public class mylibrary_java {public static String hellofromjava(){return "come from java library";}}
1.3 创建 AAR 文件:
在 Android Studio 中执行 Build -> Make Project,生成 AAR 文件。文件目录“C:\Users…\MyApplication222\myapplication1\build\outputs\aar”
1.4 AAR文件使用
在另一个 Android 应用项目中使用 AAR 文件:
将生成的 AAR 文件复制到另一个 Android 应用项目的 libs 目录下。
在应用项目的 build.gradle 文件中添加以下依赖:
dependencies {implementation files('libs/myapplication1-debug.aar')}
或者直接
implementation fileTree(include: ['*.jar',"*.aar"],dir:'libs')
说明:以上两种方法对应工程中的gradle版本为7.4其他版本的引用方式请参考其他教程
1.5 函数调用
局部函数(完整code见文末链接)
val button1 =findViewById<Button>(R.id.button)button1.setOnClickListener {val message: String = mylibrary_java.hellofromjava()Log.d("MainActivityfromjava", message)val message2 = mylibrary()val dismessage : String? = message2.helloFromLibrary()if (dismessage != null) {Log.d("MainActivity", dismessage)}}
结果
2.实现AAR中activity的调用过程
activity的调用通过新建module或者android library都可以实现
2.1 特别说明:
2.1.1 名称的设置
在通过AAR打包和调用时一定要注意自己设计的类名、函数名、UI界面元素ID名保证AAR中所有的名称与目标工程文件中的类名、函数名、UI界面元素ID名不一样否则会发生如下报错
W/libEGL: EGLNativeWindowType 0xb4000076c669b580 disconnect failed
这种情况可能由多种原因引起,包括但不限于:
资源释放问题:在某些情况下,当图形资源(如 Surface 或纹理)被错误地释放或重复释放时,可能会出现此类警告。
线程同步问题:如果图形操作(如渲染或资源释放)在不同的线程中进行,并且没有正确的同步机制,可能会出现竞态条件,导致此类警告。
应用或框架问题:有时,应用程序或框架本身可能存在错误,导致图形资源的管理不当。
设备或驱动问题:在某些设备上,图形驱动可能存在问题或不完全兼容,导致此类警告。
为了避免类似的错误发生在设计AAR时一定要注意类名、函数名、UI界面元素ID名的唯一性
2.1.2 android:exported属性设置
在AndroidManifest.xml文件中,android:exported属性用于指定一个组件(如Activity、Service、BroadcastReceiver或ContentProvider)是否可以被其他应用程序访问。这个属性有两个可能的取值:true和false。
android:exported=“true”:
当android:exported="true"时,表示该组件可以被其他应用程序访问。
其他应用程序可以通过Intent来启动该组件,发送广播给该组件,或者访问该组件提供的内容。
如果您希望其他应用程序能够与您的应用程序中的某个组件进行交互,您可以将android:exported设置为true。
android:exported=“false”:
当android:exported="false"时,表示该组件不可以被其他应用程序访问。
其他应用程序无法直接启动该组件,发送广播给该组件,或者访问该组件提供的内容。
如果您希望限制其他应用程序对您的应用程序中某个组件的访问权限,您可以将android:exported设置为false。
总的来说,android:exported="true"允许其他应用程序访问组件,而android:exported="false"则限制了对组件的访问。
2.2 新建需要封装的 android library
2.2.1 AAR打包文件的新建
在 com.example.mylibrary_test上点击右键,新建一个activty->emptyactivity,
局部函数(完整code见文末链接)
Main2Activity文件
class Main2Activity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main2)}
}
ui文件
局部函数(完整code见文末链接)
<TextViewandroid:id="@+id/textView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="main2activity"tools:layout_editor_absoluteX="209dp"tools:layout_editor_absoluteY="360dp" />
</androidx.constraintlayout.widget.ConstraintLayout>
AAR的生成和应用与"JAVA/Kotlin类和函数调用"小节”方法一致
2.2.2 AAR打包文件的调用
直接在需要调用的按钮事件中添加
局部函数(完整code见文末链接)
try {Log.e("MainActivity", "starting activity try")val intent = Intent(this, com.example.myapplication1.mylibMainActivity::class.java)//val intent = Intent(this, com.example.mylibrary_test.Main2Activity::class.java)//val intent = Intent(this, com.example.my)Log.e("MainActivity", "starting activity try111111")startActivity(intent)} catch (e: ActivityNotFoundException) {// 处理 ActivityNotFoundException,例如显示一个错误消息Log.e("MainActivity", "ActivityNotFoundException: ${e.message}")} catch (e: SecurityException) {// 处理 SecurityException,例如提示用户授予权限Log.e("MainActivity", "SecurityException: ${e.message}")} catch (e: IllegalArgumentException) {// 处理 IllegalArgumentException,这通常意味着 Intent 没有被正确设置Log.e("MainActivity", "IllegalArgumentException: ${e.message}")} catch (e: IllegalStateException) {// 处理 IllegalStateException,例如尝试在已经销毁的 Activity 中启动新的 ActivityLog.e("MainActivity", "IllegalStateException: ${e.message}")} catch (e: Exception) {// 捕获所有其他未明确处理的异常Log.e("MainActivity", "An unexpected exception occurred: ${e.message}", e)}
新建需要封装的 module方法类似(需要对AndroidManifest.xml进行application和applicationId相关的修改生成library)
AndroidManifest.xml相关修改见文末完整code链接
3 MainActivity2调用AAR完整code
完整代码链接
参考链接1: