Android项目管理之配置管理
在Android开发中难免会遇到一系列的配置管理,例如版本配置、数据库版本号配置、预置数据配置、网络接口配置、加密信息配置、日志配置、异常捕获配置等。本文将对这些内容给出一个较为合理的解决方案。
首先:为什么需要这些配置信息呢?
1.版本配置:发布版本的时候毋庸置疑,需要在每次发布的时候修改版本号和版本名称,提醒用户升级也是根据版本号来判断的,所以版本配置是必须的
2. 数据库版本配置:每次对用户版本的升级,如果涉及到数据库变更,必须要升级数据库,而数据库的升级是由SQLiteHelper根据数据库版本号来判断 的,即数据库自身保存了上一版本的数据库版本号,如果此次传入的版本号大余自身的版本号,则对数据库upgread,并将新的版本号存储为自身版本号。
3.预置数据配置:对于一个需要联网获取内容显示给用户的应用,如果首次用户打开你的应用是在没有网络的环境下进行的,你的应用会呈现出什么样子呢?提供些预制数据吧,当然预置数据还可以包含更多信息,如设置信息等
4.网络接口配置:为了灵活地应对网络接口的变更,对网络接口进行配置应该是比较好的方法,当然,还可以配置多套网络接口,例如调试地址、正式地址、测试地址等
5.加密信息处理:如果你在项目中需要对某些预制内容加密或者压缩、而又希望开发的时候能够以源码的方式进行
6.日志配置:你在不同的环境下希望日志有不同的表现,例如在正式发布后希望不要显示日志、调试时显示debug日志、测试时显示warning日志等
7.异常配置:是否希望开启异常捕获,并将异常信息反馈到你的服务器
二:如何配置?
1.对于1版本配置对于Android开发而言,需要在Manifest中进行
2.对于2数据库版本配置、6日志配置、7异常配置在/res/raw/system.properties(位置和文件名可以是任意的,个人推荐位置是这里)中配置
3.对于3预置数据配置,可以建立一个单独的文件,用于配置预置数据
4.对于4网络接口配置,可以2方法和3方法配合使用,2中配置环境,3中配置接口详细信息
5. 对于5加密信息处理,首先要保证发布时信息被加密货压缩,其次要保证开发时不受影响,我们可以在项目的根目录下建立一个文件夹,名称随便叫什么,然后需要 加密或压缩的文件放在这里,如果压缩或者加密工具比较小的话也可以放在这里,执行压缩或加密脚本,将内容结果拷贝到需要的位置
三:最佳实践
对二中给出的配置做实际性的处理
对二中给出的配置做实际性的处理
1.版本配置
Manifest.xml
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="xxx.xxx.xxx"
- android:versionCode="xxx"
- android:versionName="xxx" >
2.数据库版本,日志及异常配置
/res/raw/system.properties
在系统初始化的时候初始化基本配置信息
- #the output versioin
- version:9
- #appName
- appName:xxx
- #log open or close
- log:true
- #carch exception ;true catch , false not carch
- exception:false
- #database version,when database is modified ,plus 1
- dbversion:9
- /**
- * 系统参数初始化
- *
- * @param appllicationContext
- */
- public static void initSystemProperties(Context appllicationContext) {
- InputStream is = appllicationContext.getResources().openRawResource(
- R.raw.system);
- Properties properties = new Properties();
- try {
- properties.load(is);
- Variable.versionCode = Integer.parseInt(properties.getProperty(
- Common.VERSION, "1"));
- Variable.isLogOpened = Boolean.parseBoolean(properties.getProperty(
- Common.LOG, "false"));
- Variable.dbVersion = Integer.parseInt(properties.getProperty(
- Common.DBVERSION, "1"));
- Variable.appName = properties.getProperty(Common.APPNAME);
- Variable.dbchange = properties.getProperty(Common.DBCHANGE, "");
- Variable.isExceptionOpened = Boolean.parseBoolean(properties.getProperty(
- Common.EXCEPTION, "false"));
- } catch (IOException e) {
- Util.error(e.getMessage());
- } finally {
- Util.closeStream(is);
- }
- }
2.1DBHelper作为单例,实例化时将数据库版本号传入
- public static DBHelper getInstance() {
- if (helper == null) {
- helper = new DBHelper(Variable.appllicationContext, DB_NAME, null,
- Variable.dbVersion);
- }
- return helper;
- }
2.2日志
- /**
- * Common log
- *
- * @param tag
- * @param msg
- * @param level
- */
- public static void log(String tag, String msg, int level) {
- if (Variable.isLogOpened) {
- String msgs = msg;
- String tags = tag;
- Exception e = new Exception();
- StackTraceElement[] els = e.getStackTrace();
- String logDetails = Common.PACKAGENAME;
- for (int i = 0, l = els.length; i < l; i++) {
- if (els[i].getClassName().startsWith(Common.PACKAGENAME)
- && !els[i].getClassName().equals(Util.class.getName())) {
- logDetails = els[i].getFileName() + "->"
- + els[i].getMethodName() + ":"
- + els[i].getLineNumber() + " ";
- msgs = logDetails + msgs;
- if ("".equals(tags)) {
- tags = els[i].getFileName().substring(0,
- els[i].getFileName().indexOf("."));
- }
- break;
- }
- }
- switch (level) {
- case Log.DEBUG:
- Log.d(tags, msgs);
- break;
- case Log.INFO:
- Log.i(tags, msgs);
- break;
- case Log.WARN:
- Log.w(tags, msgs);
- break;
- case Log.ERROR:
- Log.e(tags, msgs);
- break;
- default:
- Log.d(tag, msgs);
- break;
- }
- }
- }
- /**
- * Simple log
- *
- * @param tag
- * @param msg
- */
- public static void log(String tag, String msg) {
- log(tag, msg, Log.WARN);
- }
- public static void log(String msg) {
- log("", msg);
- }
- public static void info(String msg) {
- log("", msg, Log.INFO);
- }
- public static void error(String msg) {
- log("", msg, Log.ERROR);
- }
- public static void debug(String msg) {
- log("", msg, Log.DEBUG);
- }
2.3异常
BaseActivity的onCreate方法中添加
- if(Variable.isExceptionOpened){
- CrashHandler handler = CrashHandler.getInstance();
- handler.init(getApplicationContext());
- Thread.setDefaultUncaughtExceptionHandler(handler);
- }
3.预置数据
/home/chenze/workspace/trunk/assets/init.json
推荐使用json格式,占用小,易解析,这里主要就是解析特定格式的数据,然后存不存储看项目了,可以入库等
4.网络接口:
由上面的2和3看,思路基本就是这样了,2.中配环境,3中配地址
5.加密和压缩信息处理
须 知在Android项目打包过程中,Android的根目录中除了创建项目时的文件夹,其他的内容都不会被打包进去,这样我们就可以在根目录中随意存储内 容了(当然不建议太多)。我这里建立了一个general目录,存放压缩和加密的工具及需要压缩和加密内容的源码。为了管理方便,建议写一个脚本,执行后 自动将目标内容拷贝到目标地址。例如,在该目录下新建一个数据库变更脚本,执行加密命令后,将该脚本的加密后副本拷贝到/res/raw目录下,当需要执 行数据库升级脚本时,解密该内容并执行
总结:
本文主要讨论了笔者自身在项目配置方面的管理经验,当然这些内容有的是借鉴了同事的经验,无论怎样,主要提供一些为了简便开发和管理的思路。
总结:
本文主要讨论了笔者自身在项目配置方面的管理经验,当然这些内容有的是借鉴了同事的经验,无论怎样,主要提供一些为了简便开发和管理的思路。
转载于:https://blog.51cto.com/zilla/1080627