一、先写一个自己的jar包
我的jar包是testjar,建一个testjar的文件夹,里面的Android.bp
// MAP API module
java_library {
srcs: ["src/**/*.java"],
name: "testjar",
installable: true,
}
在testjar建src/com/anwtest/anwbt/testjar.java
package com.anwtest.anwbt;
import android.util.Log;
public class testjar{
private static final String INFO_TAG = "testjar";
private static final boolean DBG = true;
private static testjar sTestjar;
public static synchronized testjar getDefaultAnwBtService(){
if(sTestjar == null){
Log.d(INFO_TAG,"sTestjar now new");
sTestjar = new testjar();
}else{
Log.d(INFO_TAG,"sTestjar has new, directly using");
}
return sTestjar;
}
public testjar()
{
debugLog("run testjar_1");
debugLog("run testjar_2");
debugLog("run testjar_3");
debugLog("run testjar_4");
}
private void debugLog(String msg) {
if (DBG) {
Log.d(INFO_TAG, msg);
}
}
}
注意:
Android.bp里面一定要加installable: true,不然编译image的时候会报错:
internal error: failed to find dex jar path for module "testjar"
java_library表示是动态jar包
name表示jar包名
二、增加package白名单
在源码的build/make/core/tasks/check_boot_jars/package_whitelist.txt最后增加jar包白名单
###################################################
# testjar.jart
com\.anwtest\.anwbt
com\.anwtest\.anwbt\..*
不然会报错:
Error: out/target/common/obj/JAVA_LIBRARIES/testjar_intermediates/classes.jar contains class file com/anwtest/anwbt/testjar.class, whose package name com.anwtest.anwbt is not in the whitelist build/make/core/tasks/check_boot_jars/package_whitelist.txt of packages allowed on the bootclasspath.
三、在源码/build/target/product/base_system.mk中找到PRODUCT_BOOT_JARS,在最后面加上testjar
# The order matters for runtime class lookup performance.
PRODUCT_BOOT_JARS := \
$(TARGET_CORE_JARS) \
framework \
ext \
telephony-common \
voip-common \
ims-common \
updatable-media \
testjar
四、services.jar用到testjar,则需要在frameworks/base/services/core/Android.bp的libs里面添加上testjar,如下所示:
libs: [
"services.net",
"android.hardware.light-V2.0-java",
"android.hardware.power-V1.0-java",
"android.hardware.tv.cec-V1.0-java",
"testjar",
],
否则在用到类的地方会提示找不到testjar对应的包
五、make –j8编译源码
六、将编译出来的image烧录到设备上,启动设备,然后就能看到testjar.jar里面的log了。
七、修改testjar.jar后,需要把/system/framework/arm和/system/framework/arm64里面的boot-testjar.oat、boot-testjar.art和boot-testjar.vdex删除。然后把testjar.jar放到/system/framework/里面,然后这个jar包就可以使用了。之后修改jar包只需要替换jar包就可以。如果不把boot-testjar.oat、boot-testjar.art和boot-testjar.vdex删除,修改的jar包替换进去会提示找不到jar包里面的类