微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 手机设计讨论 > MTK手机平台交流 > 有没有谁对recovery熟悉一点的朋友啊

有没有谁对recovery熟悉一点的朋友啊

时间:10-02 整理:3721RD 点击:
  我想做一个功能 ,就是恢复出厂设置的时候 ,让内置在data 目录下的应用,保留下来 。不被清楚掉 ,要怎么修改比较简单啊 。

MTK的ONLINE上有这个。
MTK已经做好了,你到上面看看。

1, 如何将带源码的 APK预置进系统?
2, 如何将无源码的APK预置进系统?
3, 如何预制APK使得用户可以卸载?
4, 如何使得用户在将预置的 APK卸载后,恢复出厂设置时能恢复?
[SOLUTION]
一、如何将带源码的APK预置进系统?
1)     在packages/apps 下面以需要预置的 APK的名字创建一个新文件夹,以预制一个名为Test的APK为例
2)     将 Test APK的Source code拷贝到 Test 文件夹下,删除 /bin和 /gen 目录
3)     在 Test目录下创建一个名为 Android.mk的文件,内容如下:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_PACKAGE_NAME := Test
include $(BUILD_PACKAGE)

4)     打开文件 build/target/product/${Project}.mk(其中 ${Project} 表示工程名)
将 Test添加到 PRODUCT_PACKAGES 里面。
5)     重新 build整个工程

二、如何将无源码的 APK预置进系统?

1)     在 packages/apps下面以需要预置的 APK 名字创建文件夹,以预制一个名为Test的APK为例
2)     将 Test.apk放到 packages/apps/Test 下面
3)     在 packages/apps/Test 下面创建文件 Android.mk,文件内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# Module name should match apk name to be installed
LOCAL_MODULE := Test
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE :=PRESIGNED
include $(BUILD_PREBUILT)

4)     打开文件 build/target/product/${Project}.mk(其中 ${Project} 表示工程名)
    将 Test 添加到 PRODUCT_PACKAGES 里面。
5)     将从Test.apk解压出来的 so库拷贝到alps/vendor/mediatek/${Project}/artifacts/out/target/product/${Project}/system/lib/目录下,若无 so 库,则去掉此步;
6)     重新 build整个工程


三、如何预置APK使得用户可以卸载?
有两种方法:
方法一:
7)     在 packages/apps下面以需要预置的 APK 名字创建文件夹,以预制一个名为Test的APK为例
8)     将 Test.apk放到 packages/apps/Test 下面;
9)     在 packages/apps/Test 下面创建文件 Android.mk,文件内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# Module name should match apk name to be installed
LOCAL_MODULE := Test
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE :=PRESIGNED
LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
include $(BUILD_PREBUILT)

10)   打开文件build/target/product/${Project}.mk (其中 ${Project}表示工程名)
    将 Test 添加到 PRODUCT_PACKAGES 里面。
11)   将从Test.apk解压出来的 so库拷贝到alps/vendor/mediatek/${Project}/artifacts/out/target/product/${Project}/system/lib/目录下,若无 so 库,则去掉此步;
12)   重新 build整个工程
注意:这个比不能卸载的多了一句
LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)

方法二:
4) 将需要预置的 apk拷贝到:
vendor/mediatek/${Project}/artifacts/out/target/product/${Project}/data/app/
5) 重新 build整个工程
注意:如果没有相应目录则需手动创建。

四、如何使得用户在将预置的 APK卸载后,恢复出厂设置时能恢复?
为了让用户在将预置的 APK 卸载后,恢复出厂设置时能恢复,敝司做了一个 Feature,但在ALPS.GB.TDFD.MP.V1.7和 ALPS.GB.FDD2.MP.V4.7版本后支持,若贵司版本低于此版本,请申请Patch ALPS00092543;
大致的做法是:
  - 在vendor/mediatek/project_name/artifacts/out/target/product/project_name/system目录下新建一个名为appbackup的文件夹,将该应用的apk文件copy到appbackup文件夹下
  - 在mediatek/config/project_name/ProjectConfig.mk文件中添加定义:MTK_SPECIAL_FACTORY_RESET=yes
   - 在vendor/mediatek/project_name/artifacts/out/target/product/project_name/data/app下创建一个.restore_list,并且在其中添加语句:
/system/appbackup/xxx.apk(注意,.restore_list中的每一行都要以"/system” 开头)
当卸载了data/app下的apk后,再恢复出厂设置,系统会从 .restore_list 中读取apk的名字,然后从 appbackup 文件中把apk重新拷贝到data/app下,从而恢复data/app下已经卸载了的apk。
以上操作过程,DCC 上面也有相应的文档可供参考,文档的名字叫:Android SD upgrade application note.docx,里面有一项:MTK special factory reset,就详细地介绍了以上操作步骤。

如何在手机第一次开机的时候,把用户放在外置SD卡上的APK预置安装到手机的存储卡 .
2013-01-03 12:05 313人阅读 评论(0) 收藏 举报
androidAndroidANDROIDSD APK[Description]
如何在手机第一次开机的时候,把用户放在外置SD卡上的APK自动安装到手机的存储卡。

[Solution]
设计思路:
1.    将APK放到SD卡上某个目录,如apks_preInstall目录.
(对那些有在AndroidManifest.xml中声明了存储路径是internalOnly的apk,不建议使用这种安装方法)
2.    在第一次开机的时候,等sd卡mount上来,去读取这个目录安装APK

实现代码:
1.  修改\packages\apps\PackageInstaller\AndroidManifest.xml
        <!--增加一个receiver -->
        <receiver android:name=".FirstInstallReceiver">
<intent-filter>
<action android:name="android.intent.action.MEDIA_MOUNTED_FOR_FIRTIME" />
</intent-filter>
</receiver>
       <!--end   -->

2. \packages\apps\PackageInstaller\src\com\android\packageinstaller下增加FirstInstallReceiver.java文件,用于接收第一次SD卡mount上来的广播,以便安装APK,内容如下:
package com.android.packageinstaller;

import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.content.BroadcastReceiver;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.util.Log;
import android.content.pm.IPackageInstallObserver;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import java.io.File;
import android.net.Uri;

public class FirstInstallReceiver extends BroadcastReceiver{
         private final String TAG="FirstInstallReceiver";
         private String action = "android.intent.action.MEDIA_MOUNTED_FOR_FIRTIME";

               /*下面变量apksPath是外置sd卡上的某个路径, 要修改默认预置的apk存放路径,请修改这个路径。
                 GB版本、GB2、ICS单卡项目:sd卡路径是/mnt/sdcard
                 GB2双卡项目:  默认外置sd卡路径是/mnt/sdcard/sdcard2, 如打开SDSwap Feature,外置SD卡路径则是:/mnt/sdcard
                 ICS双卡项目: 默认外置SD卡路径是/mnt/sdcard2, 如打开SDSwap Feature,外置SD卡路径则是:/mnt/sdcard
                 因此修改要针对不同情况,首先需要确认外置SD卡的路径。
              */

         private String apksPath = "/mnt/sdcard/apks_preInstall";    //这个例子假设外置SD卡路径为/mnt/sdcard////////////////////////////////////////////////////////////////////////////////////////////////////
         @Override
         public void onReceive(Context context, Intent intent) {
                   Log.d(TAG,"onReceive:"+intent);
                   new Thread()
                   {
                         public void run() {
                         try
                             {
                            File apksFile = new File(apksPath);
                            PackageManager pm = context.getPackageManager();
                            int installFlags = 0;
                            installFlags |= PackageManager.INSTALL_EXTERNAL;
                            if(apksFile.exists())  {
                                 File[] files = apksFile.listFiles();
                                 for(File f1:files)
  {
                                          String filename = f1.getName();
                                          String type = filename.substring(filename.lastIndexOf(".")+1);
                                          if(type!=null&&type.equals("apk"))
                                        {
                                             Uri mPackageURI = Uri.fromFile(f1);
                                                    pm.installPackage(mPackageURI, null, installFlags, null);
                                         }
                                     }
                            }
                              }
                   catch(Exception e)
                       {
                             Log.d(TAG,"onReceive:install failed:e:"+e);
                        }
                   }
                  }.start();
          }
}

3. 修改mountservice.java, 用于发送第一次开机sd卡mount上来的广播
private void notifyVolumeStateChange(String label, String path, int oldState, int newState) { .....
else if (newState == VolumeState.Mounted) {
         //mtk added
String isFirstBoot = SystemProperties.get("persist.sys.mount_is_first");
if(isFirstBoot == null || isFirstBoot.equals(""))
          {      
Slog.i(TAG, "first boot");
SystemProperties.set("persist.sys.mount_is_first", "DONE");
             Intent firIntent = new Intent("android.intent.action.MEDIA_MOUNTED_FOR_FIRTIME");
            mContext.sendStickyBroadcast(firIntent);
          }
         //mtk added
           
if (DEBUG_EVENTS)  Slog.i(TAG, "updating volume state mounted");
              updatePublicVolumeState(path, Environment.MEDIA_MOUNTED);
.....

风云必胜(592437233)  16:54:58
MTK有现成的宏
MTK_SPECIAL_FACTORY_RESET把这个宏打开就行了
saiv&&子章(240898515)  16:56:22
还要写个脚本
xia(383389038)  16:56:59
看你是什么版本,JB 上面不用写脚本。
阿茁(254911633)  16:57:11
ICS2
风云必胜(592437233)  16:59:08
全部保留就不需要写了吧
或者你直接改recovery.cpp
平  面(156666458)  16:59:36
这个是最直接的方式
阿茁(254911633)  16:59:44
vendor/mediatek/project_name/artifacts/out/target/product/project_name/system目录下新建一个名为appbackup的文件夹
平  面(156666458)  17:00:02
直接在干掉DATA的那个涵数RETURN
阿茁(254911633)  17:00:12
这样还是会把应用放到system 里面 会加大system 的空间吧
saiv&&子章(240898515)  17:00:21
方法 都贴到论坛了

阿茁(254911633)  17:00:44
我现在就是system 空间严重不足
xia(383389038)  17:01:06
JB以下只能那样。
阿茁(254911633)  17:01:15
才需要把应用放到data 目录下 ,但是恢复出厂设置 ,应用不能没有
saiv&&子章(240898515)  17:01:51
那你就放到其他地方
把拷贝路径修改下吗
嘿嘿
没试过
平  面(156666458)  17:03:06
recovery.c里面去看一下就知道了
阿茁(254911633)  17:03:35
recovery.cpp
还是
recovery.c
平  面(156666458)  17:03:50
我也记不大清楚了,
我这没代码,不过我弄过
在那里面有个WIPE DATA什么的函数,你直接RETURN就行了

~ fison~(214216101)  17:11:25
你是想应用不被删, system空间又不够,,为何不加大system的空间,改小data的空间?
saiv&&子章(240898515)  17:11:45
也是个办法哦
平  面(156666458)  17:12:04
把ANDROID代码部份改小也行
saiv&&子章(240898515)  17:12:11
在6589 eMMC中,JB的android\cache\userdata三个partition大小设定
[SOLUTION]
(1)android分区:
      a,预留更大的空间来安装apk
      b,如果未来不需要upgrade,可以适当缩写这个分区的大小
      c,建议这个分区不要小于512M。
(2)cache分区:
      a,这个分区的大小大于等于100M,以满足google的CDD测试
      b,FOTA升级的时候会用到cache分区
(3)userdata分区:
      a,至少是350M,以满足google的CDD测试
      b,可以给这个分区预置更大的空间来以便user安装更多的apk
      c,FOTA升级的时使用这个分区来download

MTK_SPECIAL_FACTORY_RESET把这个宏打开就行了 这个宏,在我的4.0,以及4.1的版本中都有问题,恢复出厂设置后,是所有的data/app中的应用都没有清除。而这里的要求是恢复出厂设置时,只恢复自己想要恢复的应用。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top