全部产品

使用第三方 AAR 资源

更新时间:2020-07-16 14:48:28

本文介绍在使用组件化接入方式(即 Portal&Bundle 接入方式)的场景下如何使用非 com.android.support 的第三方资源。您可以下载并使用本文提供的示例工程,参考下面的使用方法进行体验。

示例工程中包含 SharedResNew、ZHDemo、ZHDemoLauncher 三个工程:

  • SharedResNew:需要被共享的 Bundle,其中包含三方 AAR
  • ZHDemoLauncher:使用到三方资源的 Bundle
  • ZHDemo:Portal 工程

使用第三方资源的过程主要分为以下四步:

  1. 引入第三方资源
  2. 使用 public.xml 导出资源
  3. 验证资源是否导出成功
  4. 使用第三方资源

引入第三方资源

在 SharedResNew 中,com.flyco.tablayout:FlycoTabLayout_Lib:2.1.2@aar 这个包需要外部使用,因此需要通过SharedResNew 的 api 工程使用 compile 方式引入该包。注意,不能使用 implementation 方式。

  1. compile 'com.flyco.tablayout:FlycoTabLayout_Lib:2.1.2@aar'

使用 public.xml 导出资源

app 项目中导出您需要使用的属性。属性将通过 public.xml 文件输出,文件路径固定为 app/src/main/res/values/public.xml

例如,若要导出属性 tl_bar_color,则 public.xml 内容如下:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <public name="tl_bar_color" id="0x60010027" type="attr" />
  4. </resources>

其中,

  • name:需所需属性名保持一致
  • id:在第一次 debug 编译(此时没有 public.xml 文件)之后,您可以从 app/build/generated/source/r/debug/\[com/zh/demo\]\(包名文件夹\)/R.java 中找到 id 值,例如:

    1. public static final int tl_bar_color=0x60010027;
  • type:指属性所属的类。以 tl_bar_color 为例,其对应的类如下,其 type 值为 attr

    1. public static final class attr {
    2. ....
    3. }

验证资源是否导出成功

进行验证资源是否导出成功前,需确保您已成功构建 SharedResNew。若已完成构建,请完成以下操作进行验证。

步骤 1:找到 aapt 路径

找到 aapt,该文件通常在 Android SDK 中。

假设您的电脑用户名为“username”,那么在不同的操作系统下,aapt 的路径如下:

  • Mac 操作系统

    如果您的 Android SDK 位置为:/Users/username/Code/android-sdk
    则 aapt 路径一般为: /Users/username/Code/android-sdk/build-tools/28.0.3/aapt

  • Windows 操作系统

    如果您的 Android SDK 位置为:C:\Users\用户名\AppData\Local\Android\Sdk
    则 aapt 路径一般为: C:\Users\用户名\AppData\Local\Android\Sdk\build-tools\28.0.3\aapt.exe

说明:build 工具版本需为 26.0.0 或以上版本。

步骤 2:找到本地 bundle 包

打开 SharedResNew > app > build.gradle 后,您会看到如下内容:

  1. version = "1.0.0-SNAPSHOT"
  2. group = "com.zh.demo.shared.res"

其中,group 是 maven gav 中最前面的字段;version 指版本号。

您打开 Android Studio 时可以看见 app 工程的名称是 app [sharedresnew-build],那么该 bundle 的本地 gav 就是 com.zh.demo.shared.res:sharedresnew-build:1.0.0-SNAPSHOT

对应的本地 maven 仓库目录是:

  • Mac 操作系统

    ~/.m2/repositories/com/zh/demo/shared/res/sharedresnew-build/1.0.0-SNAPSHOT/

  • Windows 操作系统

    C:\Users\用户名.m2\respositories\com\zh\demo\shared\res\sharedresnew-build\1.0.0-SNAPSHOT

在该目录下,您会看见以下文件:

  1. ivy-1.0.0-SNAPSHOT.xml
  2. ivy-1.0.0-SNAPSHOT.xml.sha1
  3. sharedresnew-build-1.0.0-SNAPSHOT-AndroidManifest.xml
  4. sharedresnew-build-1.0.0-SNAPSHOT-AndroidManifest.xml.sha1
  5. sharedresnew-build-1.0.0-SNAPSHOT-api.jar
  6. sharedresnew-build-1.0.0-SNAPSHOT-api.jar.sha1
  7. sharedresnew-build-1.0.0-SNAPSHOT-raw.jar
  8. sharedresnew-build-1.0.0-SNAPSHOT-raw.jar.sha1

步骤 3:执行验证命令

使用上述步骤中找到的 aapt 路径,执行以下验证命令:

  • Mac 操作系统

    1. /Users/username/Code/android-sdk/build-tools/28.0.3/aapt d --values resources ./sharedresnew-build-1.0.0-SNAPSHOT-api.jar > res.txt
  • Windows 操作系统

    1. C:\Users\用户名\AppData\Local\Android\Sdk\build-tools\28.0.3\aapt.exe d --values resources ./sharedresnew-build-1.0.0-SNAPSHOT-api.jar

执行命令后,您会得到一个 res.txt 文件,用记事本之类的软件打开此文件,里面的内容如下所示:

  1. Package Groups (1)
  2. Package Group 0 id=0x60 packageCount=1 name=com.zh.demo
  3. DynamicRefTable entryCount=22:
  4. 0x3a -> com.alipay.android.liteprocess
  5. 0x7b -> com.alipay.android.multimediaext
  6. 0x6e -> com.alipay.android.phone.falcon.falconlooks
  7. 0x45 -> com.alipay.android.phone.falcon.img

在文件中搜索“tl_bar_color”,会找到如下内容。如果后面有(PUBLIC)标记,则表示资源导出成功;若没有,则表示资源导出失败。

  1. resource 0x60010027 com.zh.demo:attr/tl_bar_color: <bag> (PUBLIC)
  2. Parent=0x00000000(Resolved=0x60000000), Count=1
  3. #0 (Key=0x01000000): (color) #00000010

使用第三方资源

在使用资源的地方,比如 ZHDemoLauncher 项目的任意一个 layout 中,在 xml 顶部增加 xml 命名空间。下面以 ZHDemoLauncher/app/src/main/res/layout/main.xml 为例:

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. xmlns:abc="http://schemas.android.com/apk/res/com.zh.demo"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent">
  7. <!-- xxxx -->
  8. </LinearLayout>
注意xmlns:abc="http://schemas.android.com/apk/res/com.zh.demo" 这一行中,
  • abc为自定义名称,您可以任意命名;
  • http://schemas.android.com/apk/res/为固定值;
  • com.zh.demo是您在 SharedResNew 的 AndroidManifest.xml 中定义的 package 值。该包值也可以在使用 aapt 导出的 .txt 文件看到,例如resource 0x60010027 com.zh.demo:attr/tl_bar_color,冒号前面的 com.zh.demo 就是需要用的值。

然后,在使用的地方加上一行:

  1. <com.flyco.tablayout.SegmentTabLayout
  2. ....
  3. abc:tl_bar_color="#f00" />

合起来就是:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. xmlns:app="http://schemas.android.com/apk/res-auto"
  5. xmlns:abc="http://schemas.android.com/apk/res/com.zh.demo"
  6. android:layout_width="match_parent"
  7. android:layout_height="match_parent"
  8. android:orientation="vertical"
  9. tools:ignore="ResAuto">
  10. <com.flyco.tablayout.SegmentTabLayout
  11. android:id="@+id/myView"
  12. android:layout_width="wrap_content"
  13. android:layout_height="32dp"
  14. android:layout_gravity="center_horizontal"
  15. android:layout_marginTop="10dp"
  16. abc:tl_bar_color="#f00"
  17. tools:visibility="visible" />
  18. </LinearLayout>

至此,您已经完成编译。

代码示例

点击 下载示例代码