加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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 ;
            }
        }
    }
 
}

(编辑:云计算网_泰州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读