cpe移植framework后,。解决问题的现有数据库

最近,该公司的业务需求,原始订单apk的形式CPE。渗透framework层。这被剥离cpe,从事相当长的一段,终于有时间来写博客,记下遇到的问题,未来。

第一个问题是,原来的apk有些事情,移植framework层后,。不同的环境,我们必须做出一些改变。

比如,

1.ContentProvider,因没有提供给其它程序数据共享,要么去掉。所有改为sqlite直接调用。要么把这个ContentProvider剥离出来。形成一个apk。固定到framework。给cpe提供ContentProvider.

2.SharedPreferences,打入framework后,SharedPreferences没有地方存放由它生成的xml文件,因此也要去掉,去掉后怎样保存它要保存的数据呢,比如终端启动信息和初始化信息等。终于确定使用一个文件来保存。依赖于Properties这个工具类读写数据,Properties最初还遇到了写数据的问题,后来还是攻克了。主要是        mProperties.setProperty(name,value);仅仅是把数据写入内存,而没有写入到文件,纠结了半天,改动了一下代码。ok了。


try {
            os=new FileOutputStream(CONFIGPATH);
            
            mProperties.setProperty(name,value);
            mProperties.store(os, null);  
        } catch (Exception e) {
            e.printStackTrace();
        }  finally{
            try {
                os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

3.CPE原有的配置文件。在framework层后,文件夹结构不一样,得找个地方存放这些配置文件。改动了引用这些配置文件所在文件夹,最后统一移植到/system/etc/cpe/文件夹下。

4.CPE依赖的第三方jar包,CPE打入framework后,其本身就是一个jar形式存在,仅仅只是由SystemService传入Context其它它。那么CPE所依赖的第三方jar包也得进入framework,開始的时候所有导入到framework,编译并执行后。发现板子上还有一个apk也引用了我导入的CPE jar,冲突了。为了避免这个问题。决定改动CPE的包名。

5.如同SharedPreferences,apk生成的db文件。默认在/data/data/包名/database/文件夹下。而打入framework后。db文件得找个地方存放,为了解决问题,查找了非常多资料,測试了半天,最终实现了,并将db文件存放在/data/cpe/文件夹下。由于是apk在測试时候,没打入framework,板子上的文件夹是没有权限写数据的,仅仅能用U盘做測试,写入/sdcard/文件夹下測试的。说了半天。即指定文件夹存放db文件。

定义帮助类继承SQLiteOpenHelper:

public class DatabaseHelper extends SQLiteOpenHelper

构造方法:

private static final String PATH ="/sdcard/cpe";

public DatabaseHelper(Context context, String name) {
        super(new CustomPathDatabaseContext(context, PATH), name, null, VERSION);
    }

注意构造方法中的CustomPathDatabaseContext.java:


public class CustomPathDatabaseContext extends ContextWrapper{
    
    private static final String TAG = CustomPathDatabaseContext.class.getSimpleName();

    private String mDirPath;
    public CustomPathDatabaseContext(Context base,String name) {
        super(base);
        mDirPath = name;
    }
    
    @Override
    public File getDatabasePath(String name) {
        File result = new File(mDirPath + File.separator + name);
        if (!result.getParentFile().exists())
        {
            result.getParentFile().mkdirs();
        }
        return result;
    }
    
    @Override
    public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory)
    {
        Log.d(TAG, "openOrCreateDatabase");
        return SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name), factory);
    }
    @Override
    public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory, DatabaseErrorHandler errorHandler){
        Log.d(TAG,"openOrCreateDatabase...");
        return SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name).getAbsolutePath(), factory, errorHandler);
    }
}

为什么要这样定义。查看源代码,ContextWrapper就是Context的实现类。在getReadableDatabase(),或getWriteableDatabase()调用后,会运行openOrCreateDatabase(),4.0版本号后运行第二个openOrCreateDatabase(),这指定db夹。


版权声明:本文博客原创文章,博客,未经同意,不得转载。

你可能感兴趣的:(framework)