您好,登錄后才能下訂單哦!
恢復(fù)出廠設(shè)置核心代碼:
sendBroadcast(new Intent("android.intent.action.MASTER_CLEAR"));
即發(fā)送一個(gè)廣播,需要在AndroidManifest.xml配置
<receiver android:name="com.android.server.MasterClearReceiver" android:permission="android.permission.MASTER_CLEAR" android:priority="100" > <intent-filter> <!-- For Checkin, Settings, etc.: action=MASTER_CLEAR --> <action android:name="android.intent.action.MASTER_CLEAR" /> <!-- MCS always uses REMOTE_INTENT: category=MASTER_CLEAR --> <category android:name="android.intent.category.MASTER_CLEAR_NOTIFICATION" /> </intent-filter> </receiver>
并加入權(quán)限
<uses-permission android:name="android.permission.MASTER_CLEAR" />
基本上以上就可以實(shí)現(xiàn)恢復(fù)出廠設(shè)置的。系統(tǒng)的設(shè)置功能就是這樣完成恢復(fù)出廠設(shè)置的,但是這個(gè)過程中有很多問題,主要是因?yàn)闄?quán)限造成的。
最明顯的問題是,添加android.permission.MASTER_CLEAR權(quán)限時(shí)會報(bào)錯(cuò)。
Permission is only granted to system apps
這里就說明了我們自己實(shí)現(xiàn)恢復(fù)出廠設(shè)置和系統(tǒng)設(shè)置恢復(fù)出廠的區(qū)別
這個(gè)錯(cuò)誤很好解決,只需要 project\clean 一下就去掉錯(cuò)誤了
但是運(yùn)行程序時(shí),當(dāng)然不會恢復(fù)出廠啦,提示是權(quán)限不足,
E/AndroidRuntime(2562): java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.intent.action.MASTER_CLEAR_NOTIFICATION from pid=2562, uid=10027
根據(jù)提示可以看出是廣播的權(quán)限,但是我們已經(jīng)聲明了權(quán)限
android:permission="android.permission.MASTER_CLEAR"
在android/platform/frameworks/base/core/res/AndroidManifest.xml文件中,可以看到
<!-- ================================================ --> <!-- Special broadcasts that only the system can send --> <!-- ================================================ -->
<protected-broadcast android:name="android.intent.action.MASTER_CLEAR_NOTIFICATION" />
當(dāng)然還有很多類似的
也就是說我們不能使用這個(gè)廣播,但是沒有其他辦法的情況下只能鏟除這塊石頭
直接把這條注釋掉,然后重新編譯系統(tǒng),燒錄,然后就能夠前進(jìn)一步
繼續(xù)運(yùn)行會發(fā)現(xiàn)新的錯(cuò)誤
E/MasterClear(1060): Can't perform master clear/factory reset E/MasterClear(1060): java.io.FileNotFoundException: /cache/recovery/command: open failed: EACCES (Permission denied)
依然是權(quán)限問題,即沒有/cache/recovery/文件夾的操作權(quán)限
網(wǎng)上有好幾種解決辦法,我只說我最終解決問題的辦法
(1)AndroidManifest.xml添加android:sharedUserId="android.uid.system" (2)Android.mk添加LOCAL_CERTIFICATE := platform
此時(shí),程序是不能安裝的,提示錯(cuò)誤:
Installation error: INSTALL_FAILED_SHARED_USER_INCOMPATIBLE
大概意思就是要給apk添加系統(tǒng)權(quán)限
我用系統(tǒng)自帶
在platform/build/target/product/security/中找到platform.pk8 platform.x509.pem等簽名文件
signapk.jar:由/platform/build/tools/signapk/編譯產(chǎn)出,可以在/out/host/linux-x86/framework/中找到
把這幾個(gè)文件與apk放到同一目錄下,命令行執(zhí)行
java -jar signapk.jar platform.x509.pem platform.pk8 FactoryTest.apk FactoryTest_signed.apk
把MyFactoryTest_signed.apk安裝后,發(fā)現(xiàn)任然不能安裝,錯(cuò)誤
Failure [INSTALL_FAILED_SHARED_USER_INCOMPATIBLE]
采用另一種方法,用
mm命令
在Android源碼環(huán)境下編譯得到apk
將eclipse中的項(xiàng)目MyFactoryTest整個(gè)拷貝到android/platform/packages/apps/目錄下
在android源碼根目錄下執(zhí)行:source build/envsetup.sh
到剛才的項(xiàng)目目錄下(cd android/platform/packages/apps/MyFactoryTest)執(zhí)行:mm
安裝android/platform/out/target/product/mt8658sdk/system/app/MyFactoryTest1.2.apk
出現(xiàn)錯(cuò)誤Failure [INSTALL_FAILED_DEXOPT]
這是因?yàn)?span >在system\app下面的apk是經(jīng)過優(yōu)化的,而dex文件不會打包到apk中,dex文件會被優(yōu)化后,生成odex文件。
下面就是程序經(jīng)編譯之后,在workspace/out/target/product/generic/system/app/下生成的.odex和.apk兩個(gè)文件
Install: out/target/product/generic/system/app/xxx.odex Install: out/target/product/generic/system/app/xxx.apk
這樣安裝apk時(shí),就會缺少dex文件,導(dǎo)致報(bào)錯(cuò)[INSTALL_FAILED_DEXOPT]。
找到未優(yōu)化過的apk,即在out/target/product/generic/obj/APPS/下找到對應(yīng)的APP:package.apk.unaligned
當(dāng)然可以重命名一下 package.apk.unaligned ————>FactoryTest.apk
安裝后完成
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。