在 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 配置文件。
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
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
将上文的 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 目录可以找到。