【Android XML】Android XML 转 Java Code 系列

最近在公司做一个项目,需要把Android界面打包进jar包给客户使用。对绝大部分开发者来说,Android界面的布局以XML文件为主,并辅以少量Java代码进行动态调整。而打包进jar包的代码,意味着无法通过常规的getResources(),getString()等方法来快速的获取资源,因为这些资源都是在apk安装的时候初始化生成的。为了满足客户的需求,笔者开始在网上寻找各种解决方案。结果如下:

1.apk 主体包方案

实现方法:安装一个新的apk,新apk和主apk使用android:sharedUserId连接起来,这样主apk就可以获取新apk的所有res资源。需要注意的是,R.id.xxx的值为新apk中的R.java的值。因此需要获取到新apk的R.class,或保证新apk和主apk的R.java中的资源的值是完全一致的,否则会出现获取资源对不上号的情况。

结论:可以实现,但需要多安装一个apk。静默安装apk需要root权限,否则会弹出安装界面。还没有找到不需要安装apk就能获取资源的方法。
参考链接:http://blog.csdn.net/lg707415323/article/details/7709076

2.LayoutInflater 方案

实现方法:通过LayoutInflater类解析外部XML资源,并转换为所需布局。

分析:Android解释因为性能原因,LayoutInflater只支持解析已经预编译在apk包里的xml。所以没办法解析外部导入的xml布局资源。

结论:不可行
参考链接: http://gamebs.blog.163.com/blog/static/1860182182012827545621/

3.Android XML 转 Java Code方案  (开源/自研)

参考链接:http://www.xmltojava.com/

在线的Android XmToJaval转换服务,免费,支持各种控件(http://www.xmltojava.com/page/controls/ ),支持还算丰富,但转换完还需要一些简单的手动编辑。不支持drawable和values目录下的资源转换。

结论:能减轻手动翻译的工作量,但不能完全解决需求。EsManagerTool中用到了很多自定义的drawable和string,这些需要自己手动翻译实现。

参考链接:https://github.com/bsp0911932

https://github.com/rvp2014/AndroidXMLToJavaConverter

个人开源项目,第一个项目用php写的,代码量很少,只更新过一次,应该没法用。第二个项目是Androidy应用动态解析,刚刚建立起来的,支持的字段很少,应该也没法用。完成度都很低。在Google和Github上都没有找到成熟的方案。

结论:不可用

4.zip包方案

只能替换图片资源,没办法解析Xml布局。(桌面应用的换肤功能都基于zip或apk这两个方案)

结论:不可行

5.ClassLoader方案

把apk包用ClassLoader加载进来,并通过反射的方法获取Activity或其他组件的各种方法,从而获得资源。

分析:实践发现,反射调用Activity

结论:不可行
参考链接:http://blog.csdn.net/mer1234567/article/details/7308855

总结论:方案1最方便,但客户不一定能接受;方案3比较稳妥,但是耗费人力大。

由于方案1需要安装apk,如果要静默安装还需要root权限。这种方案过于累赘,只能选择Android XML翻译原生代码的方法。于是就有了AndroidXMLToJava管理工具的诞生。

接下来几篇会分享该转换工具的一些解决过程。项目快完善的时候会放上博客,现在暂时不放出来。

版权所有,转载请注明出处:

http://www.cnblogs.com/sickworm/p/4245089.html

时间: 2024-10-13 16:22:35

【Android XML】Android XML 转 Java Code 系列的相关文章

【Android XML】Android XML 转 Java Code 系列之 style(3)

最近一个月把代码重构了一遍, 感觉舒服多了, 但总体开发进度没有变化.. 今天聊聊把style属性转换成Java代码的办法 先说结论: 引用系统style是无法完美的实现的, 我们如果有写成Java代码的需求, 请尽量避免使用系统style. 自定义style没问题. style是什么? (参考链接) http://developer.android.com/guide/topics/resources/style-resource.html " A style resource defines

【Android XML】Android XML 转 Java Code 系列之 Selector(2)

今天我们要把drawable下的selector的XML文件转换成Java代码.(打包进jar,不依赖apk) 在转换工具中的代码为: https://github.com/SickWorm/AndroidXMLToJava/blob/master/src/com/excelsecu/axml/SelectorConverter.java Selector是什么?就是给Button等控件使用的一个根据状态改变控件颜色或背景的状态器,它一般放在drawable目录下. Selector分两种,一种

java和android的解析xml的方式

java解析xml经典的有四种方式: 1.dom 2.sax 3.jdom 4.dom4j   个人觉得dom4j好用,但是我只用过jdom. android我知道的用两种方式,sax和pull SAX方式的特点是需要解析完整个文档才会返回,如果在一个XML文档中我们只需要前面一部分数据,但是使用SAX方式还是会对整个文档进行解析,尽管XML文档中后面的大部分数据我们其实都不需要解析,因此这样实际上就浪费了处理资源. Pull解析器和SAX解析器虽有区别但也有相似性.他们的区别为:SAX解析器的

[Android] Android Build 时报错: java.io.IOException: Could not parse XML from android/accounts/annotations.xml

Android构建时报错: app:lintVitalRelease[Fatal Error] :3:214: 与元素类型 “item” 相关联的 “name” 属性值不能包含 ‘<’ 字符. Could not read /Users/panxin/Library/Android/sdk/platform-tools/api/annotations.zip java.io.IOException: Could not parse XML from android/accounts/annota

android关于AndroidManifest.xml详细分析

转:http://www.cnblogs.com/zady/archive/2013/10/14/3368385.html 一.关于AndroidManifest.xmlAndroidManifest.xml 是每个android程序中必须的文件.它位于整个项目的根目录,描述了package中暴露的组件(activities, services, 等等),他们各自的实现类,各种能被处理的数据和启动位置. 除了能声明程序中的Activities, ContentProviders, Service

Android SAX解析XML

1. 简介 1). SAX,全称Simple API for XML,是一种基于事件的解析器. SAX采用事件驱动机制来解析XML文档.什么是事件驱动模式?它将XML文档转换成一系列的事件,由单独的事件处理器来决定如何处理. 每当SAX解析器发现文档开始.元素开始.文本.元素结束.文档结束等事件时,就会向外发送一次事件,而开发者则可以通过编写事件监听器处理这些事件,以此来获取XML文档里的信息. 工作原理: 就是对文档进行顺序扫描,当扫描到文档(document)开始与结束.元素(element

Android动画解析--XML

动画类型 Android的animation由四种类型组成 XML中 alpha 渐变透明度动画效果 scale 渐变尺寸伸缩动画效果 translate 画面转换位置移动动画效果 rotate 画面转移旋转动画效果 JavaCode中 AlphaAnimation 渐变透明度动画效果 ScaleAnimation 渐变尺寸伸缩动画效果 TranslateAnimation 画面转换位置移动动画效果 RotateAnimation 画面转移旋转动画效果 Android动画模式 Animation

android 中解析XML的方法(转)

在XML解析和使用原始XML资源中都涉及过对XML的解析,之前使用的是 DOM4J和 XmlResourceParser 来解析的.本文中将使用XmlPullParser来解析,分别解析不同复杂度的test1.xml.test2.xml.test3.xml.代码如下: MainActivity: package com.home.xmlparsetest; import java.io.IOException; import java.io.InputStream; import java.ut

无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)

1.android下junit测试框架配置 单元测试需要在手机中进行安装测试 (1).在清单文件中manifest节点下配置如下节点 <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="com.example.demo1" /> 上面targetPackage指定的包要和应用的package相同. (2)在清单文件中ap