Android 12解决push framework.jar无法开机的方法小结

2025-05-03 18:50

本文主要是介绍Android 12解决push framework.jar无法开机的方法小结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Android12解决pushframework.jar无法开机的方法小结》:本文主要介绍在Android12中解决pushframework.jar无法开机的方法,包括编译指令、框架层和s...

1. Android 编译指令

以前使用make framework -j16或者在framework/base目录下使用mm编译都不会生成framework.jar。

1.1 framework层的编译指令

make -j32 framework-minus-apex

编译通过后,输出路径为 out\target\product\blueline\system\framework\framework.jar

1.2 替换framework.jar

adb root
adb remount
adb shell "rm -rf /system/framework/arm"
adb shell "rm -rf /system/framework/arm64"
adb push framework.jar /system/framework
adb shell sync
adb reboot

或者

adb root
adb remount
adb push arm /system/framework
adb push arm64 /system/framework
adb push framework.jar /system/framework
adb shell sync
adb reboot

1.3 编译frameworks/base/core/res

如果修改frameworks/base/core/res目录下的文件,例如AndroidManifest.XML或者其他资源文件,不需要整编framework层,只需要在该目录下mm单编就可以。

会在out/target/product/qssi/system/framework/framework-res.apk生成framework-res.apk, 把该apk用adb push到设备目录/system/framework/下即可。

2. 编译services

2.1编译指令

在frameworks/base/services目录下执行 mm

或者在android目录下执行

mmm frameworks/base/services -j32

或者

make -j32 services

编译通过后,输出路径为 out\target\product\blueline\system\framework\services.jar

2.2 替换services.jar

adb root
adb remount
adb shell "rm -rf /system/framework/arm"
adb shell "rm -rf /system/framework/arm64"
adb push services.jar /system/framework
adb shell "rm -rf /data/dalvik-cache/arm/system@framework@services.jar@classes.* "
adb shell sync
adb reboot

3. Android 12的API标准规范

3.1 注解的使用

3.1.1 @NonNull和@Nullable

@NonNull:表示返回值、参数或者field不能是null。 @Nullable:表示返回值、参数或者field可以是null。 如果没有标注,则会报异常:Missing nullability on parameter,当编译报这个错误时,根据需要添加这两个注解。 getter/setter的Nullablility必须一致。

3.1.2 @IntDef和@StringDef

用来接受一组有限的int或者String类型的public常量,可以使用这两个注解这个。这个注解通常结合@interface来使用来创建一个新的注解。例如:

public final class Log {
    /** @hide */
    @IntDef({ASSERT, ERROR, WARN, INFO, DEBUG, VERBOSE})
    @Retention(RetentionPolicy.SOURCE)
    public @interface Level {}
 
    public static final int VERBOSE = 2;
    public static final int DEBUG = 3;
    public static final int INFO = 4;
    public static final int WARN = 5;
    public static final int ERROR = 6;
    public static final int ASSERT = 7;
}

建议使用同一的前缀。

/** @hide */
@IntDef(prefix = { “FLAG_” }, value = {
  FLAG_USE_LOGChina编程O,
  FLAG_SHOW_HOME,
  FLAG_HOME_AS_UP,
});
@Retention(RetentionPolicy.SOURCE)
public @interface DisplayOptions {}

3.1.3 Listener和Callback的规则

当只有一个回调方法且永远不会有其他回调方法时使用Listener,且注册监听和解注册监听的方法必须是add/remove开头,否则Android Lint编译不过。

public interface OnpythonFooListener {
    void onFoo();
}
public void addOnFooListener(@NonNull OnFooListener listener) {}
 
public void removeOnFooListener(@NonNull OnFooListener listener) {}

当有多个回调方法时,或者有关联的常量时,应该使用Callback。Callback类可以是一个interface或者abstract class。添加callback和去掉callback应该使用register和unregister开头的方法。

callback中的方法应该以on-开头。

使用MyObjectCallback代替MyObjectObserver。这个是否报错不确定,我是把Listener改为Callback,没有使js用Observer作为回调。

public abstract class FooCallback {
  public abstract void onStarted();
  public abstract void onStopped();
}
public void registerFooCallback(@NonNull FooCallback callback) {}
 
public void unregisterFooCallback(@NonNull FooCallback callback) {}

如果上述注册方法没有在明确的线程中时,则需要在注册的时候包含Executor参数,如果不加的话,默认在主线程中回调。

我的register方法没有添加Executor,则编译报错:

Registration methods should have overload that accepts delivery Executor: registerFooCallback [ExecutorRegistration]

因此,改为下边的注册方法:

public void registerFooCallback( @NonNull @CallbackExecutor Executor executor,
                                 @NonNull FooCallback callback)
//unregister方法不需要添加Executor
public void unregisterFooCallback(@NonNull FooCallback callback) {}

避免使用枚举类enum

在Framework层使用enum会报编程China编程错:Enums are discouraged in Android APIs [Enum],因此一般都用@intDef代替,使用新android的注解表示。

以上就是Android 12解决push framework.jar无法开机的方法小结的详细内容,更多关于Android 12 push framework.jar无法开机的资料请关注China编程(www.chinasem.cn)其它相关文章!

这篇关于Android 12解决push framework.jar无法开机的方法小结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1154472

相关文章

Android开发环境配置避坑指南

《Android开发环境配置避坑指南》本文主要介绍了Android开发环境配置过程中遇到的问题及解决方案,包括VPN注意事项、工具版本统一、Gerrit邮箱配置、Git拉取和提交代码、MergevsR... 目录网络环境:VPN 注意事项工具版本统一:android Studio & JDKGerrit的邮

Android实现定时任务的几种方式汇总(附源码)

《Android实现定时任务的几种方式汇总(附源码)》在Android应用中,定时任务(ScheduledTask)的需求几乎无处不在:从定时刷新数据、定时备份、定时推送通知,到夜间静默下载、循环执行... 目录一、项目介绍1. 背景与意义二、相关基础知识与系统约束三、方案一:Handler.postDel

在.NET平台使用C#为PDF添加各种类型的表单域的方法

《在.NET平台使用C#为PDF添加各种类型的表单域的方法》在日常办公系统开发中,涉及PDF处理相关的开发时,生成可填写的PDF表单是一种常见需求,与静态PDF不同,带有**表单域的文档支持用户直接在... 目录引言使用 PdfTextBoxField 添加文本输入域使用 PdfComboBoxField

SQLyog中DELIMITER执行存储过程时出现前置缩进问题的解决方法

《SQLyog中DELIMITER执行存储过程时出现前置缩进问题的解决方法》在SQLyog中执行存储过程时出现的前置缩进问题,实际上反映了SQLyog对SQL语句解析的一个特殊行为,本文给大家介绍了详... 目录问题根源正确写法示例永久解决方案为什么命令行不受影响?最佳实践建议问题根源SQLyog的语句分

Java NoClassDefFoundError运行时错误分析解决

《JavaNoClassDefFoundError运行时错误分析解决》在Java开发中,NoClassDefFoundError是一种常见的运行时错误,它通常表明Java虚拟机在尝试加载一个类时未能... 目录前言一、问题分析二、报错原因三、解决思路检查类路径配置检查依赖库检查类文件调试类加载器问题四、常见

gradle第三方Jar包依赖统一管理方式

《gradle第三方Jar包依赖统一管理方式》:本文主要介绍gradle第三方Jar包依赖统一管理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景实现1.顶层模块build.gradle添加依赖管理插件2.顶层模块build.gradle添加所有管理依赖包

解决IDEA报错:编码GBK的不可映射字符问题

《解决IDEA报错:编码GBK的不可映射字符问题》:本文主要介绍解决IDEA报错:编码GBK的不可映射字符问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录IDEA报错:编码GBK的不可映射字符终端软件问题描述原因分析解决方案方法1:将命令改为方法2:右下jav

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

MyBatis模糊查询报错:ParserException: not supported.pos 问题解决

《MyBatis模糊查询报错:ParserException:notsupported.pos问题解决》本文主要介绍了MyBatis模糊查询报错:ParserException:notsuppo... 目录问题描述问题根源错误SQL解析逻辑深层原因分析三种解决方案方案一:使用CONCAT函数(推荐)方案二:

判断PyTorch是GPU版还是CPU版的方法小结

《判断PyTorch是GPU版还是CPU版的方法小结》PyTorch作为当前最流行的深度学习框架之一,支持在CPU和GPU(NVIDIACUDA)上运行,所以对于深度学习开发者来说,正确识别PyTor... 目录前言为什么需要区分GPU和CPU版本?性能差异硬件要求如何检查PyTorch版本?方法1:使用命