背景:
经常在aosp开发时候会使用很多的java本身的核心库,这个核心库的类本身就不是单独针对android开发的,而是各个平台都可以使用,就像我们电脑上eclipse编译运行java代码一样,完全不需要android部分的framework代码。
这块代码源代码在哪呢?如果有需求需要在这块代码加入相关的打印或者一些定制业务逻辑该怎么办呢?其实vip群中有学员朋友提出这个需求:
学员的疑问简单说就是修改了相关的java核心库代码,不知道如何进行单独编译进行验证了。
针对这个问题本文带大家来一起解决。
实战过程
需求案例1:
经常在开发时候需要看看File文件在哪个进程进行的创建,可能会需要到File.java这个类中加入一些打印或者额外调试判断等,这里我们就打印一下File的名字。
libcore/ojluni/src/main/java/java/io/File.java
private File(String pathname, int prefixLength) {
this.path = pathname;
this.prefixLength = prefixLength;
//注意无法直接使用andorid的log打印,使用System.out代替
System.out.println("File pathname 111 " + pathname);
}
注意因为File属于java核心库的类,也就是完全可以脱离android的framework运行,就像我们后台开发一样完全是在电脑端运行的。所以自然在File类中进行日志打印是不可以使用android.util.Log类进行相关的打印。
重点来了,请问写完这个代码后如何进行编译呢?
方案1:直接进行整编使用make命令既可以,啥也不用管File这个类具体是要更新哪个模块,但是因为经常整编耗时,效率太低了。
方案2:因为整编耗时,要重新刷机等,是否可以想framework.jar一样进行单独编译更新呢?
这里马哥经过寻找发现可以使用如下命令:
make com.android.art
然后会生成/system/apex/com.android.art.capex文件,只需要更新这个文件既可以
adb root;adb remount
adb push out/target/product/gemini/system/apex/com.android.art.capex /system/apex/com.android.art.capex
adb reboot
然后抓取log结果如下:

需求案例2:
在系统开发中,经常一些app无故退出,这个时候测试可能会提出相关的故障,那么系统就需要对这个app无故退出进行分析,但是分析过程中发现也有很多app会主动调用System.exit等方法把自己进程直接退出。
那么这个时候系统开发可能经常就容易和app进行扯皮,所以需要考虑在System.exit等方法中加入相关的堆栈来证明app的退出是哪块代码触发的,所以就有需求在System.exit方法中加入相关的堆栈打印等。
因为不可以直接使用android的Log,只在java核心库中应该如何使用堆栈打印呢?
libcore/ojluni/src/main/java/java/lang/System.java
public static void exit(int status) {
//java的堆栈打印
Exception e = new Exception("System exit");
e.printStackTrace();
Runtime.getRuntime().exit(status);
}
同样和案例一样方式进行编译push
make com.android.art
然后会生成/system/apex/com.android.art.capex文件,只需要更新这个文件既可以
adb root;adb remount
adb push out/target/product/gemini/system/apex/com.android.art.capex /system/apex/com.android.art.capex
adb reboot
验证日志堆栈打印结果如下:

原文地址:https://mp.weixin.qq.com/s/qbC7MhomZ2SNF9ZkprrI_A
更多framework实战开发干货,请关注下面千里马学框架“”

被折叠的 条评论
为什么被折叠?



