Android中如何达成OEM
发布时间:2021-11-21 19:02:42 所属栏目:PHP教程 来源:互联网
导读:前几天接到个需求,如何根据一个基础的Android App来生成100个或更多的App,要求App icon和App name都不一样(可能还会有配置文件)。这个有点类似于为App贴上自己的标签,但具体功能由别人提供,有点类似于OEM,下面来分析下如何实现 仔细想一下其实这个就
前几天接到个需求,如何根据一个基础的Android App来生成100个或更多的App,要求App icon和App name都不一样(可能还会有配置文件)。这个有点类似于为App贴上自己的标签,但具体功能由别人提供,有点类似于OEM,下面来分析下如何实现 仔细想一下其实这个就是apk的编译和反编译的应用,再加上个签名(不签名的话无法使用)。只不过是用代码实现罢了 准备工作 1、配置好Java开发环境 2、下载google提供的apk编译和反编译工具 (包含apktool.jar、apktool.bat、aapt.exe三个文件) 3、下载google提供的签名工具(包含sign.bat、signapk.jar两个文件) icon覆盖和strings文件修改 我们都知道,在Android应用中应用的icon和应用的名称是在AndroidManifest.xml中指定的,应用名称的话有可能直接写死,但多数是这种情况 android:icon ="@drawable/ic_launcher" android:label ="@string/app_name" 我们只要覆盖drawable-*下对应名字的icon图片和修改values-*路径下strings.xml中对应名字的属性值就行了,为了简单起见在这里以drawable-hdpi和values-zh-rCN路径来介绍 AndroidManifest.xml解析 通过上面的介绍,我们需要从 AndroidManifest.xml获取icon和label两个属性的值,下面是一个简单的解析类,该注意的地方都有注释 /** * @author Tibib * */ public class AndroidManifestParser { public String NS = "http://schemas.android.com/apk/res/android" ; public AppInfo parse(InputStream in) throws Exception { try { //使用pull解析库 XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser(); NS = parser.getNamespace(); //设置使用 namespaces特性 parser.setFeature(XmlPullParser. FEATURE_PROCESS_NAMESPACES , true ); parser.setInput(in, "UTF-8" ); parser.nextTag(); return readAppInfo(parser); } catch (Exception e){ e.printStackTrace(); throw e; } finally { in.close(); } } private AppInfo readAppInfo(XmlPullParser parser) throws Exception{ AppInfo appInfo = new AppInfo(); while (parser.next() != XmlPullParser. END_TAG) { if (parser.getEventType() != XmlPullParser. START_TAG) { continue ; } String name = parser.getName(); // Starts by looking for the General tag if ("application" .equals(name)){ String attrLabelValue = parser.getAttributeValue( NS, "label" ); String attrIconValue = parser.getAttributeValue( NS, "icon" ); appInfo.setAppName(attrLabelValue.split( "/" )[1]); appInfo.setIconName(attrIconValue.split( "/" )[1]); } else { skip(parser); } } return appInfo; } // Skips tags the parser isn't interested in. Uses depth to handle nested tags. i.e., // if the next tag after a START_TAG isn't a matching END_TAG, it keeps going until it // finds the matching END_TAG (as indicated by the value of "depth" being 0). private void skip(XmlPullParser parser) throws XmlPullParserException, IOException { if (parser.getEventType() != XmlPullParser. START_TAG) { throw new IllegalStateException(); } int depth = 1; while (depth != 0) { switch (parser.next()) { case XmlPullParser. END_TAG: depth--; break ; case XmlPullParser. START_TAG: depth++; break ; } } } } ![]() (编辑:云计算网_泰州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |