Android项目管理之配置管理
16lz
2021-01-26
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
2.数据库版本,日志及异常配置 /res/raw/system.properties
- <manifestxmlns:android="http://schemas.android.com/apk/res/android"
- package="xxx.xxx.xxx"
- android:versionCode="xxx"
- android:versionName="xxx">
在系统初始化的时候初始化基本配置信息
- #theoutputversioin
- version:9
- #appName
- appName:xxx
- #logopenorclose
- log:true
- #carchexception;truecatch,falsenotcarch
- exception:false
- #databaseversion,whendatabaseismodified,plus1
- dbversion:9
2.1DBHelper作为单例,实例化时将数据库版本号传入
- /**
- *系统参数初始化
- *
- *@paramappllicationContext
- */
- publicstaticvoidinitSystemProperties(ContextappllicationContext){
- InputStreamis=appllicationContext.getResources().openRawResource(
- R.raw.system);
- Propertiesproperties=newProperties();
- 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(IOExceptione){
- Util.error(e.getMessage());
- }finally{
- Util.closeStream(is);
- }
- }
- publicstaticDBHelpergetInstance(){
- if(helper==null){
- helper=newDBHelper(Variable.appllicationContext,DB_NAME,null,
- Variable.dbVersion);
- }
- returnhelper;
- }
2.2日志
- /**
- *Commonlog
- *
- *@paramtag
- *@parammsg
- *@paramlevel
- */
- publicstaticvoidlog(Stringtag,Stringmsg,intlevel){
- if(Variable.isLogOpened){
- Stringmsgs=msg;
- Stringtags=tag;
- Exceptione=newException();
- StackTraceElement[]els=e.getStackTrace();
- StringlogDetails=Common.PACKAGENAME;
- for(inti=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){
- caseLog.DEBUG:
- Log.d(tags,msgs);
- break;
- caseLog.INFO:
- Log.i(tags,msgs);
- break;
- caseLog.WARN:
- Log.w(tags,msgs);
- break;
- caseLog.ERROR:
- Log.e(tags,msgs);
- break;
- default:
- Log.d(tag,msgs);
- break;
- }
- }
- }
- /**
- *Simplelog
- *
- *@paramtag
- *@parammsg
- */
- publicstaticvoidlog(Stringtag,Stringmsg){
- log(tag,msg,Log.WARN);
- }
- publicstaticvoidlog(Stringmsg){
- log("",msg);
- }
- publicstaticvoidinfo(Stringmsg){
- log("",msg,Log.INFO);
- }
- publicstaticvoiderror(Stringmsg){
- log("",msg,Log.ERROR);
- }
- publicstaticvoiddebug(Stringmsg){
- log("",msg,Log.DEBUG);
- }
2.3异常
BaseActivity的onCreate方法中添加
3.预置数据
- if(Variable.isExceptionOpened){
- CrashHandlerhandler=CrashHandler.getInstance();
- handler.init(getApplicationContext());
- Thread.setDefaultUncaughtExceptionHandler(handler);
- }
/home/chenze/workspace/trunk/assets/init.json
推荐使用json格式,占用小,易解析,这里主要就是解析特定格式的数据,然后存不存储看项目了,可以入库等
4.网络接口:
由上面的2和3看,思路基本就是这样了,2.中配环境,3中配地址
5.加密和压缩信息处理
须 知在Android项目打包过程中,Android的根目录中除了创建项目时的文件夹,其他的内容都不会被打包进去,这样我们就可以在根目录中随意存储内 容了(当然不建议太多)。我这里建立了一个general目录,存放压缩和加密的工具及需要压缩和加密内容的源码。为了管理方便,建议写一个脚本,执行后 自动将目标内容拷贝到目标地址。例如,在该目录下新建一个数据库变更脚本,执行加密命令后,将该脚本的加密后副本拷贝到/res/raw目录下,当需要执 行数据库升级脚本时,解密该内容并执行
总结:
本文主要讨论了笔者自身在项目配置方面的管理经验,当然这些内容有的是借鉴了同事的经验,无论怎样,主要提供一些为了简便开发和管理的思路。
本文出自 “雨轩印象” 博客,转载请与作者联系!
更多相关文章
- [掌上智能] 为什么Android即使硬件高一档也没iPhone那么流畅?
- Android数据库学习123
- 交叉编译-5:使用NDK和CMake在Linux上编译Android动态库
- 在windows上编译jrtplib 3.9.1和jthread 1.3.1
- Android(安卓)7.1.1 通话记录数据库详解
- Android初始化本地数据库
- 1.Android查看手机内部储存目录及数据库文件之通过模拟器Monitor
- iOS自动化测试(一)-技术方案、环境配置与疯狂踩坑
- 【android】个人推崇的数据库升级方式