Android恢复出厂设置
恢复出厂设置核心代码:
sendBroadcast(newIntent("android.intent.action.MASTER_CLEAR"));
即发送一个广播,需要在AndroidManifest.xml配置
<receiverandroid:name="com.android.server.MasterClearReceiver"android:permission="android.permission.MASTER_CLEAR"android:priority="100"><intent-filter><!--ForCheckin,Settings,etc.:action=MASTER_CLEAR--><actionandroid:name="android.intent.action.MASTER_CLEAR"/><!--MCSalwaysusesREMOTE_INTENT:category=MASTER_CLEAR--><categoryandroid:name="android.intent.category.MASTER_CLEAR_NOTIFICATION"/></intent-filter></receiver>
并加入权限
<uses-permissionandroid:name="android.permission.MASTER_CLEAR"/>
基本上以上就可以实现恢复出厂设置的。系统的设置功能就是这样完成恢复出厂设置的,但是这个过程中有很多问题,主要是因为权限造成的。
最明显的问题是,添加android.permission.MASTER_CLEAR权限时会报错。
Permissionisonlygrantedtosystemapps
这里就说明了我们自己实现恢复出厂设置和系统设置恢复出厂的区别
这个错误很好解决,只需要 project\clean 一下就去掉错误了
但是运行程序时,当然不会恢复出厂啦,提示是权限不足,
E/AndroidRuntime(2562):java.lang.SecurityException:PermissionDenial:notallowedtosendbroadcastandroid.intent.action.MASTER_CLEAR_NOTIFICATIONfrompid=2562,uid=10027
根据提示可以看出是广播的权限,但是我们已经声明了权限
android:permission="android.permission.MASTER_CLEAR"
在android/platform/frameworks/base/core/res/AndroidManifest.xml文件中,可以看到
<!--================================================--><!--Specialbroadcaststhatonlythesystemcansend--><!--================================================-->
<protected-broadcastandroid:name="android.intent.action.MASTER_CLEAR_NOTIFICATION"/>
当然还有很多类似的
也就是说我们不能使用这个广播,但是没有其他办法的情况下只能铲除这块石头
直接把这条注释掉,然后重新编译系统,烧录,然后就能够前进一步
继续运行会发现新的错误
E/MasterClear(1060):Can'tperformmasterclear/factoryresetE/MasterClear(1060):java.io.FileNotFoundException:/cache/recovery/command:openfailed:EACCES(Permissiondenied)
依然是权限问题,即没有/cache/recovery/文件夹的操作权限
网上有好几种解决办法,我只说我最终解决问题的办法
(1)AndroidManifest.xml添加android:sharedUserId="android.uid.system"(2)Android.mk添加LOCAL_CERTIFICATE:=platform
此时,程序是不能安装的,提示错误:
Installation error: INSTALL_FAILED_SHARED_USER_INCOMPATIBLE
大概意思就是要给apk添加系统权限
我用系统自带
用Android自带的signapk.jar + .x509.pem + .pk8签名应用程序在platform/build/target/product/security/中找到platform.pk8 platform.x509.pem等签名文件
signapk.jar:由/platform/build/tools/signapk/编译产出,可以在/out/host/linux-x86/framework/中找到
把这几个文件与apk放到同一目录下,命令行执行
java-jarsignapk.jarplatform.x509.pemplatform.pk8FactoryTest.apkFactoryTest_signed.apk
把MyFactoryTest_signed.apk安装后,发现任然不能安装,错误
Failure [INSTALL_FAILED_SHARED_USER_INCOMPATIBLE]
采用另一种方法,用
mm命令
在Android源码环境下编译得到apk
将eclipse中的项目MyFactoryTest整个拷贝到android/platform/packages/apps/目录下
在android源码根目录下执行:source build/envsetup.sh
到刚才的项目目录下(cd android/platform/packages/apps/MyFactoryTest)执行:mm
安装android/platform/out/target/product/mt8658sdk/system/app/MyFactoryTest1.2.apk
出现错误Failure [INSTALL_FAILED_DEXOPT]
这是因为在system\app下面的apk是经过优化的,而dex文件不会打包到apk中,dex文件会被优化后,生成odex文件。
下面就是程序经编译之后,在workspace/out/target/product/generic/system/app/下生成的.odex和.apk两个文件
Install:out/target/product/generic/system/app/xxx.odexInstall:out/target/product/generic/system/app/xxx.apk
这样安装apk时,就会缺少dex文件,导致报错[INSTALL_FAILED_DEXOPT]。
找到未优化过的apk,即在out/target/product/generic/obj/APPS/下找到对应的APP:package.apk.unaligned
当然可以重命名一下package.apk.unaligned ————>FactoryTest.apk
安装后完成
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。