Android 12解決push framework.jar無法開機(jī)的方法小結(jié)
1. Android 編譯指令
以前使用make framework -j16或者在framework/base目錄下使用mm編譯都不會(huì)生成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單編就可以。
會(huì)在out/target/product/qssi/system/framework/framework-res.apk生成framework-res.apk, 把該apk用adb push到設(shè)備目錄/system/framework/下即可。
2. 編譯services
2.1編譯指令
在frameworks/base/services目錄下執(zhí)行 mm
或者在android目錄下執(zhí)行
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標(biāo)準(zhǔn)規(guī)范
3.1 注解的使用
3.1.1 @NonNull和@Nullable
@NonNull:表示返回值、參數(shù)或者field不能是null。 @Nullable:表示返回值、參數(shù)或者field可以是null。 如果沒有標(biāo)注,則會(huì)報(bào)異常:Missing nullability on parameter,當(dāng)編譯報(bào)這個(gè)錯(cuò)誤時(shí),根據(jù)需要添加這兩個(gè)注解。 getter/setter的Nullablility必須一致。
3.1.2 @IntDef和@StringDef
用來接受一組有限的int或者String類型的public常量,可以使用這兩個(gè)注解這個(gè)。這個(gè)注解通常結(jié)合@interface來使用來創(chuàng)建一個(gè)新的注解。例如:
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的規(guī)則
當(dāng)只有一個(gè)回調(diào)方法且永遠(yuǎn)不會(huì)有其他回調(diào)方法時(shí)使用Listener,且注冊監(jiān)聽和解注冊監(jiān)聽的方法必須是add/remove開頭,否則Android Lint編譯不過。
public interface OnFooListener { void onFoo(); }
public void addOnFooListener(@NonNull OnFooListener listener) {} public void removeOnFooListener(@NonNull OnFooListener listener) {}
當(dāng)有多個(gè)回調(diào)方法時(shí),或者有關(guān)聯(lián)的常量時(shí),應(yīng)該使用Callback。Callback類可以是一個(gè)interface或者abstract class。添加callback和去掉callback應(yīng)該使用register和unregister開頭的方法。
callback中的方法應(yīng)該以on-開頭。
使用MyObjectCallback代替MyObjectObserver。這個(gè)是否報(bào)錯(cuò)不確定,我是把Listener改為Callback,沒有使用Observer作為回調(diào)。
public abstract class FooCallback { public abstract void onStarted(); public abstract void onStopped(); }
public void registerFooCallback(@NonNull FooCallback callback) {} public void unregisterFooCallback(@NonNull FooCallback callback) {}
如果上述注冊方法沒有在明確的線程中時(shí),則需要在注冊的時(shí)候包含Executor參數(shù),如果不加的話,默認(rèn)在主線程中回調(diào)。
我的register方法沒有添加Executor,則編譯報(bào)錯(cuò):
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會(huì)報(bào)錯(cuò):Enums are discouraged in Android APIs [Enum],因此一般都用@intDef代替,使用新的注解表示。
以上就是Android 12解決push framework.jar無法開機(jī)的方法小結(jié)的詳細(xì)內(nèi)容,更多關(guān)于Android 12 push framework.jar無法開機(jī)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android ViewPager實(shí)現(xiàn)Banner循環(huán)播放
這篇文章主要為大家詳細(xì)介紹了Android ViewPager實(shí)現(xiàn)Banner循環(huán)播放,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09Android用Scroller實(shí)現(xiàn)一個(gè)可向上滑動(dòng)的底部導(dǎo)航欄
本篇文章主要介紹了Android用Scroller實(shí)現(xiàn)一個(gè)可上滑的底部導(dǎo)航欄,具有一定的參考價(jià)值,有興趣的小伙伴們可以參考一下2017-07-07Android JNI 調(diào)用時(shí)緩存字段和方法ID示例
這篇文章主要介紹了Android JNI 調(diào)用時(shí)緩存字段和方法ID示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-07-07RxJava和Retrofit2的統(tǒng)一處理單個(gè)請求示例詳解
這篇文章主要給大家介紹了關(guān)于RxJava和Retrofit2的統(tǒng)一處理單個(gè)請求的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11Android應(yīng)用中利用ViewPager實(shí)現(xiàn)多頁面滑動(dòng)切換效果示例
這篇文章主要介紹了Android應(yīng)用中利用ViewPager實(shí)現(xiàn)多頁面滑動(dòng)切換效果示例,配合了Fragment和PagerTabStrip,需要的朋友可以參考下2016-03-03Android 安全加密:消息摘要Message Digest詳解
本文主要介紹Android安全加密消息摘要Message Digest,這里整理了詳細(xì)的資料,并說明如何使用Message Digest 和使用注意事項(xiàng),有需要的小伙伴可以參考下2016-09-09