zoukankan      html  css  js  c++  java
  • 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夹。


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

  • 相关阅读:
    JVM垃圾收集器以及内存分配
    VisualVM工具的使用
    jstack的使用
    内存溢出的定位与分析
    JVM的内存模型
    JVM运行参数
    kafka-高效读写数据+zookeeper作用+事务
    重定向机制
    HTTP协议、时间戳
    TCP常见面试题 
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4644459.html
Copyright © 2011-2022 走看看