一、前言
由于AOSP工程太过于庞大,如果每次修改完代码,都进行全量编译的话,会非常的耗费时间。今天我整理了一下:Java代码编译后,快速生效的方法。
-
修改Java代码
-
局部编译
-
编译后的Jar包推送到设备
-
重启并进行验证
二、修改Java代码
diff --git a/base/core/java/android/app/ActivityThread.java b/base/core/java/android/app/ActivityThread.javaindex 8af74edb8..0e2964b64 100644
--- a/base/core/java/android/app/ActivityThread.java
+++ b/base/core/java/android/app/ActivityThread.java
@@ -244,6 +244,8 @@ import java.util.Objects;
import java.util.TimeZone;
import java.util.concurrent.Executor;
import java.util.function.Consumer;
+import java.lang.Thread;
+import java.lang.RuntimeException;
@@ -2561,6 +2563,7 @@ public final class ActivityThread extends ClientTransactionHandler securityViolation, includeCode && (aInfo.flags & ApplicationInfo.FLAG_HAS_CODE) != 0, registerPackage);
+ Log.e("SKActivityThread","packageInfo created: ",new RuntimeException("A"));
if (mSystemThread && "android".equals(aInfo.packageName)) {
packageInfo.installSystemApplicationInfo(aInfo,
getSystemContext().mPackageInfo.getClassLoader());
diff --git a/base/core/java/android/app/LoadedApk.java b/base/core/java/android/app/LoadedApk.javaindex 74208c3a4..47547ac49 100644
--- a/base/core/java/android/app/LoadedApk.java
+++ b/base/core/java/android/app/LoadedApk.java
@@ -81,6 +81,7 @@ import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.Executor;
+import java.lang.RuntimeException;
final class IntentReceiverLeaked extends AndroidRuntimeException {
@UnsupportedAppUsage
@@ -399,6 +400,8 @@ public final class LoadedApk {
if (aInfo.requestsIsolatedSplitLoading() && !ArrayUtils.isEmpty(mSplitNames)) {
mSplitLoader = new SplitDependencyLoaderImpl(aInfo.splitDependencies);
}
+
+ Log.e("SKLoadedApk","setApplicationInfo", new RuntimeException());
}
如上面git diff 中16行和38行所示,分别ActivityThread的getPackageInfo和LoadedApk的setApplicationInfo方法增加了Log日志。
三、编译Framework.jar并推送设备
由于上述修改的代码位于frameworks/base/core/java/android目录下,最终会打包成Framework.jar包。所以我们直接通过构建Framework.jar,然后再将该jar包推送到目标设备,使其生效即可。
编译阶段:
source build/envsetup.shlunch <target> # 替换为你的目标设备或编译目标
make -j$(nproc) framework-minus-apex # $(nproc) 代表编译设备的线程数
然后静静等待:
推送到设备:
adb root
adb remount
adb shell "rm -rf /system/framework/arm /system/framework/arm64" # 删除旧的架构目录
adb push out/target/product/<your_device>/system/framework/framework.jar /system/framework/adb shell syncadb reboot
注意:如果启动出现问题,可以尝试清除一下Dalvik的缓存之后,再进行重启
adb shell "rm -rf /data/dalvik-cache/*"
四、验证
使用logcat查看打开App时的日志输出。
adb shell logcat -s SKLoadedApk SKActivityThread
发现添加的日志已经生效。
五、写在最后
未完,待续。。。