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

相关文章

Java继承映射的三种使用方法示例

《Java继承映射的三种使用方法示例》继承在Java中扮演着重要的角色,它允许我们创建一个类(子类),该类继承另一个类(父类)的所有属性和方法,:本文主要介绍Java继承映射的三种使用方法示例,需... 目录前言一、单表继承(Single Table Inheritance)1-1、原理1-2、使用方法1-

Android DataBinding 与 MVVM使用详解

《AndroidDataBinding与MVVM使用详解》本文介绍AndroidDataBinding库,其通过绑定UI组件与数据源实现自动更新,支持双向绑定和逻辑运算,减少模板代码,结合MV... 目录一、DataBinding 核心概念二、配置与基础使用1. 启用 DataBinding 2. 基础布局

解决Entity Framework中自增主键的问题

《解决EntityFramework中自增主键的问题》:本文主要介绍解决EntityFramework中自增主键的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录Entity Framework中自增主键问题解决办法1解决办法2解决办法3总结Entity Fram

Android ViewBinding使用流程

《AndroidViewBinding使用流程》AndroidViewBinding是Jetpack组件,替代findViewById,提供类型安全、空安全和编译时检查,代码简洁且性能优化,相比Da... 目录一、核心概念二、ViewBinding优点三、使用流程1. 启用 ViewBinding (模块级

SpringBoot中使用Flux实现流式返回的方法小结

《SpringBoot中使用Flux实现流式返回的方法小结》文章介绍流式返回(StreamingResponse)在SpringBoot中通过Flux实现,优势包括提升用户体验、降低内存消耗、支持长连... 目录背景流式返回的核心概念与优势1. 提升用户体验2. 降低内存消耗3. 支持长连接与实时通信在Sp

Conda虚拟环境的复制和迁移的四种方法实现

《Conda虚拟环境的复制和迁移的四种方法实现》本文主要介绍了Conda虚拟环境的复制和迁移的四种方法实现,包括requirements.txt,environment.yml,conda-pack,... 目录在本机复制Conda虚拟环境相同操作系统之间复制环境方法一:requirements.txt方法

Nginx 重写与重定向配置方法

《Nginx重写与重定向配置方法》Nginx重写与重定向区别:重写修改路径(客户端无感知),重定向跳转新URL(客户端感知),try_files检查文件/目录存在性,return301直接返回永久重... 目录一.try_files指令二.return指令三.rewrite指令区分重写与重定向重写: 请求

MySQL 打开binlog日志的方法及注意事项

《MySQL打开binlog日志的方法及注意事项》本文给大家介绍MySQL打开binlog日志的方法及注意事项,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录一、默认状态二、如何检查 binlog 状态三、如何开启 binlog3.1 临时开启(重启后失效)

Nginx 配置跨域的实现及常见问题解决

《Nginx配置跨域的实现及常见问题解决》本文主要介绍了Nginx配置跨域的实现及常见问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来... 目录1. 跨域1.1 同源策略1.2 跨域资源共享(CORS)2. Nginx 配置跨域的场景2.1

Python中提取文件名扩展名的多种方法实现

《Python中提取文件名扩展名的多种方法实现》在Python编程中,经常会遇到需要从文件名中提取扩展名的场景,Python提供了多种方法来实现这一功能,不同方法适用于不同的场景和需求,包括os.pa... 目录技术背景实现步骤方法一:使用os.path.splitext方法二:使用pathlib模块方法三