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_logo, 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 onfoolistener { 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,没有使用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会报错:enums are discouraged in android apis [enum],因此一般都用@intdef代替,使用新的注解表示。
以上就是android 12解决push framework.jar无法开机的方法小结的详细内容,更多关于android 12 push framework.jar无法开机的资料请关注代码网其它相关文章!
发表评论