Skip to content

Latest commit

 

History

History
228 lines (166 loc) · 5.27 KB

添加自定义模块之 Java 库.md

File metadata and controls

228 lines (166 loc) · 5.27 KB

添加自定义模块之 Java 库

1. Android.mk 方式集成

aosp/device/mycompamy/product/ 目录下创建以下的目录和文件:

.
├── AndroidProducts.mk
├── lib
│   ├── Android.mk
│   └── com
│       └── ahaoddu
│           └── mytriangle
│               └── Triangle.java
├── main
│   ├── Android.mk
│   └── com
│       └── ahaoddu
│           └── main
│               └── TriangleDemo.java
└── myaosp.mk

其中 AndroidProducts.mk myaosp.mk 是 配置product 中添加的 product 配置文件。

1.1 java 库

lib 是一个 java 库。其 Android.mk 内容如下:

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
## 包含当前目录及子目录下的所有 java 文件
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_MODULE := libmytrianglemk
# 编译到 product 分区,Android 10 下 java 库必须编译到 product 分区才能通过编译
LOCAL_PRODUCT_MODULE := true
# 这是一个 java 库
include $(BUILD_JAVA_LIBRARY)

Triangle.java 内容如下:

package com.ahaoddu.mytriangle;

public class Triangle
{
	private int a;
	private int b;
	private int c;


	public Triangle(int a, int b, int c)
	{
		this.a = a;
		this.b = b;
		this.c = c;
	}


	public Triangle()
	{
		this(9, 12, 15);
	}

	public int zhouChangFunc()
	{
		return (a+b+c);
	}

	public double areaFunc()
	{
		double p = zhouChangFunc()/2.0;

		return Math.sqrt(p*(p-a)*(p-b)*(p-c));
	}

}

接下来我们就可以在 lib 目录下执行 mm 命令,编译当前模块:

mm

1.2 main

main 引用了 lib,main目录下:

Android.mk:

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_JAVA_LIBRARIES := libmytrianglemk 

LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_MODULE := TriangleDemomk
# 编译到 product 分区
LOCAL_PRODUCT_MODULE := true
include $(BUILD_JAVA_LIBRARY)

TriangleDemo.java:

package com.ahaoddu.main;

import com.ahaoddu.mytriangle.Triangle;

public class  TriangleDemo
{
	public static void main(String[] args) 
	{
		Triangle t1;
		t1 = new Triangle(3, 4, 5);
		System.out.println("t1 area : "+t1.areaFunc());
		System.out.println("t1 round :"+t1.zhouChangFunc());

	}
}

同样,在 main 目录下通过 mm 命令编译。

mm

aosp/device/mycompamy/product/myaosp.mk 中添加:

PRODUCT_PACKAGES += libmytrianglemk
PRODUCT_PACKAGES += TriangleDemomk

接下来编译系统:

source build/envsetup.sh
lunch myaosp-eng
make -j16

编译完成启动虚拟机后:

# 进入模拟器shell
adb shell
# 配置 classpath
export CLASSPATH=/product/framework/libmytrianglemk.jar:/product/framework/TriangleDemomk.jar
app_process /product/framework/ com.ahaoddu.main.TriangleDemo

执行结果如下图所示:

2. Android.bp 方式集成

将上文的 lib/Android.mk 修改为 Android.bp:

java_library {
    name: "libmytriangle",
    installable: true,
    product_specific: true,
    srcs: ["**/*.java"],
}

product_specific 表示当前模块编译到 product 分区,测试发现,Android10 java lib 必须设置 product_specific: true 才能编译通过。

如果不指定 installable: true, 则编译出来的 jar 包里面是 .class 文件。这种包是没法安装到系统上的,只能给其他 java 模块作为 static_libs 依赖。 指定 installable: true, 则编译出来的 jar 包里面是 classes.dex 文件。这种才是 Android 虚拟机可以加载的格式。

main/Android.mk 修改为 Android.bp:

java_library {
    name: "libmytrianglebp",
    installable: true,
    product_specific: true,
    srcs: ["**/*.java"],
}

将 main/Android.mk 修改为 Android.bp

java_library {
    name: "TriangleDemobp",
    installable: true,

    libs: ["libmytriangle"],

    product_specific: true,

    srcs: ["**/*.java"],
}

在 myaosp.mk 中添加:

PRODUCT_PACKAGES += libmytrianglemk
PRODUCT_PACKAGES += TriangleDemomk

其余操作和 Android.mk 方式均相同,需要注意模块名的最后两个字符我改成了 bp。

示例源码

示例源码在这个链接下的 mk/javalib 和 bp/javalib 目录可以找到。

参考资料