切换导航
首页
技术问答
编程语言
前端开发
移动开发
开发工具
程序设计
行业应用
CMS系统
服务器
频道导航
▸ PHP
▸ Java
▸ Java SE
▸ Python
▸ C#
▸ C&C++
▸ Ruby
▸ VB
▸ asp.Net
▸ Go
▸ Perl
▸ netty
▸ Django
▸ Delphi
▸ Jsp
▸ .NET Core
▸ Spring
▸ Flask
▸ Springboot
▸ SpringMVC
▸ Lua
▸ Laravel
▸ Mybatis
▸ Asp
▸ Groovy
▸ ThinkPHP
▸ Yii
▸ swoole
▸ HTML
▸ HTML5
▸ JavaScript
▸ CSS
▸ jQuery
▸ Bootstrap
▸ Angularjs
▸ TypeScript
▸ Vue
▸ Dojo
▸ Json
▸ Electron
▸ Node.js
▸ extjs
▸ Express
▸ XML
▸ ES6
▸ Ajax
▸ Flash
▸ Unity
▸ React
▸ Flex
▸ Ant Design
▸ Web前端
▸ 微信小程序
▸ 微信公众号
▸ iOS
▸ Android
▸ Swift
▸ Hybrid
▸ Cocos2d-x
▸ Flutter
▸ Xcode
▸ Silverlight
▸ cocoa
▸ Cordova
前端之家
XML
操作XML以及签名实例
操作XML以及签名实例
2020-05-19
XML
前端之家
前端之家
收集整理的这篇文章主要介绍了
操作XML以及签名实例
,
前端之家
小编觉得挺不错的,现在分享给大家,也给大家做个参考。
http://blog.csdn.net/tibib/article/details/8811759
@H_
301
_5@
前几天接到个需求,如何根据一个基础的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中指定的,应用
名称
的话有可能直接写死,但多数是这种情况
[html]
view plain
copy
android:icon
=
"@drawable/ic_launcher"
ndroid:label
=
"@string/app_name"
我们只要覆盖drawable-*下对应名字的icon
图片
和
修改
values-*路径下strings.xml中对应名字的
属性
值就行了,为了简单起见在这里以drawable-hdpi和values-zh-rCN路径来介绍
AndroidManifest.xml解析
通过上面的介绍,我们需要从AndroidManifest.xml
获取
icon和label两个
属性
的值,下面是一个简单的解析类,该注意的地方都有注释
[java]
copy
/**
*@authorTibib
*
*/
public
class
AndroidManifestParser{
public
StringNS=
"http://schemas.android.com/apk/res/android"
;
public
AppInfoparse(InputStreamin)
throws
Exception{
try
{
//使用pull解析库
XmlPullParserparser=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
(Exceptione){
e.printStackTrace();
throw
e;
}
finally
{
in.close();
}
}
private
AppInforeadAppInfo(XmlPullParserparser)
throws
Exception{
AppInfoappInfo=
new
AppInfo();
while
(parser.next()!=XmlPullParser.END_TAG){
if
(parser.getEventType()!=XmlPullParser.START_TAG){
continue
;
Stringname=parser.getName();
//StartsbylookingfortheGeneraltag
if
(
"application"
.equals(name)){
StringattrLabelValue=parser.getAttributeValue(NS,
"label"
);
StringattrIconValue=parser.getAttributeValue(NS,
"icon"
);
appInfo.setAppName(attrLabelValue.split(
"/"
)[
1
]);
appInfo.setIconName(attrIconValue.split(
"/"
)[
1
]);
else
{
skip(parser);
return
appInfo;
//Skipstagstheparserisn'tinterestedin.Usesdepthtohandlenestedtags.i.e.,
//ifthenexttagafteraSTART_TAGisn'tamatchingEND_TAG,itkeepsgoinguntilit
//findsthematchingEND_TAG(asindicatedbythevalueof"depth"being0).
private
void
skip(XmlPullParserparser)
throws
XmlPullParserException,IOException{
throw
new
IllegalStateException();
int
depth=
1
;
while
(depth!=
0
){
switch
(parser.next()){
case
XmlPullParser.END_TAG:
depth--;
break
;
case
XmlPullParser.START_TAG:
depth++;
break
;
}
修改
strings.xml中name
属性
为app_name(具体
名称
看配置)的值
copy
class
XmlModifyUtil{
/**
*使用的是jdom库
static
void
modifyXML(FilemodifyXmlFile,StringappNameAttrValue,
StringappNameText){
OutputStreamWriterbos=
null
;
try
{
SAXBuilderbuilder=
new
SAXBuilder();
if
(modifyXmlFile.exists()){
Documentdocument=(Document)builder.build(modifyXmlFile);
Elementroot=document.getRootElement();
List<Element>stringChildList=root.getChildren(
"string"
);
for
(Elementelement:stringChildList){
StringnameAttrValue=element.getAttribute(
"name"
)
.getValue();
if
(nameAttrValue.equals(appNameAttrValue)){
element.setText(appNameText);
StringxmlFileData=
new
XMLOutputter().outputString(document);
//strings.xml默认是UTF-8格式
bos=
new
OutputStreamWriter(
new
FileOutputStream(modifyXmlFile),
"UTF-8"
);
bos.write(xmlFileData);
bos.flush();
System.out.println(
"Filedoesnotexist"
);
catch
(Exceptionex){
ex.printStackTrace();
finally
{
if
(bos!=
null
){
bos.close();
catch
(IOExceptione){
}
执行编译和签名命令
我把反编译和签名工具都放在了同一目录,并且事先把基础apk反编译好,现在只需要用
代码
来执行编译和签名命令就行了。在Java中可以通过
Runtime类来执行DOS命令
copy
void
createApk(StringapkName)
throws
IOException,InterruptedException{
Filedir=
new
File(wpPath);
//编译命令,其中azbz是基础apk反编译后的
文件
夹
StringbackCommand=
"cmd/capktool.batbazbz"
+apkName+
".apk"
;
//签名命令
StringsignCommand=
"cmd/cjava-jarsignapk.jarplatform.x509.pemplatform.pk8"
+apkName+
".apk"
+apkName+
"_signed.apk"
;
//这个命令执行完成会
生成
一个未签名的apk
RuntimebackR=Runtime.getRuntime();
ProcessbackP=backR.exec(backCommand,153); background-color:inherit; font-weight:bold">null
,dir);
//等待执行完再往下执行
backP.waitFor();
//签名apk,这里使用的google提供的证书
RuntimesignR=Runtime.getRuntime();
ProcesssignP=signR.exec(signCommand,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">
signP.waitFor();
下面是随手写的一个
生成
两个icon和
名称
不同的Apk例子
copy
class
ExecDosCommand{
static
StringwpPath_app=
"E:"
+File.separator+
"decodeapk"
+File.separator+
"azbz"
+File.separator;
static
StringiconPath=wpPath_app+
"res"
+File.separator+
"drawable-hdpi"
+File.separator;
static
StringstringPath=wpPath_app+
"res"
+File.separator+
"values-zh-rCN"
+File.separator+
"strings.xml"
;
static
StringmanifestPath=wpPath_app+
"AndroidManifest.xml"
;
static
StringwpPath=
"E:"
+File.separator+
"decodeapk"
+File.separator;
void
main(String[]args)
AndroidManifestParserparser=
new
AndroidManifestParser();
AppInfoappInfo=parser.parse(
new
FileInputStream(manifestPath));
for
(
int
i=
0
;i<
2
;i++){
coverIcon(appInfo,i);
modifyAppName(appInfo,248); line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">
createApk(
"
修改
"
+(i+
1
));
void
modifyAppName(AppInfoappInfo,
int
i){
XmlModifyUtil.modifyXML(
new
File(stringPath),
appInfo.getAppName(),
"
修改
"
+(i+
1
));
void
coverIcon(AppInfoappInfo,153); background-color:inherit; font-weight:bold">int
i)
throws
FileNotFoundException,IOException{
BufferedOutputStreambos=
new
BufferedOutputStream(
new
FileOutputStream(iconPath+appInfo.getIconName()+
".png"
));
BufferedInputStreambis=
new
BufferedInputStream(
new
FileInputStream(wpPath+File.separator+
"image"
+File.separator+
"icon"
+(i+
1
)+
".png"
));
byte
[]buffer=
new
byte
[
1024
];
int
temp=
0
;
while
((temp=bis.read(buffer))!=-
1
){
bos.write(buffer,
0
,temp);
bos.close();
bis.close();
//编译命令
signP.waitFor();
}
原文链接:/xml/300236.html
上一篇:xml 学习1
下一篇:org.xml.sax.SAXParseException Th
猜你在找的XML相关文章
10分钟掌握XML、JSON及其解析
引言 NOKIA 有句著名的广告语:“科技以人为本”。任何技术都是为了满足人的生产生活需要而...
作者:前端之家 时间:2020-08-12
[CXF REST标准实战系列] 一、JAXB xml与javaBean的转换
Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket Reprint it anywhere...
作者:前端之家 时间:2020-08-12
[CXF REST标准实战系列] 一、JAXB xml与javaBean的转换
Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket Reprint it anywhere...
作者:前端之家 时间:2020-08-12
10分钟掌握XML、JSON及其解析
http://blog.jobbole.com/79252/ 引言 NOKIA 有句著名的广告语:“科技以人为本”。任何技...
作者:前端之家 时间:2020-08-12
自定义圆形控件RoundImageView并认识一下attr.xml
(点击上方公众号,可快速关注) 公众号:smart_android 作者:耿广龙|loonggg 点击“阅读原...
作者:前端之家 时间:2020-08-12
10分钟掌握XML、JSON及其解析
引言 NOKIA 有句著名的广告语:“科技以人为本”。任何技术都是为了满足人的生产生活需要而...
作者:前端之家 时间:2020-08-12
10分钟掌握XML、JSON及其解析(上)
(点击上方公众号,可快速关注) 来源: Long Luo 的博客 链接:http://longluo.github.i...
作者:前端之家 时间:2020-08-12
10分钟掌握XML、JSON及其解析(中)
接上文 二、JSON XML很好很强大,但是最近有另外一个时代弄潮儿,这就是JSON。现在JSON的光...
作者:前端之家 时间:2020-08-12
10分钟掌握XML、JSON及其解析(下)
接上文 2.4 如何解析JSON? Android JSON所有相关类,都在org.json包下。 包括JSONObject、...
作者:前端之家 时间:2020-08-12
10分钟掌握XML、JSON及其解析
原文出处: Long Luo 的博客(@Long_Luo) 引言 NOKIA 有句著名的广告语:“科技以人...
作者:前端之家 时间:2020-08-12
编程分类
HTML
HTML5
JavaScript
CSS
jQuery
Bootstrap
Angularjs
TypeScript
Vue
Dojo
Json
Electron
Node.js
extjs
Express
XML
ES6
Ajax
Flash
Unity
React
Flex
Ant Design
Web前端
微信小程序
微信公众号
最新文章
• 10分钟掌握XML、JSON及其解
• [CXF REST标准实战系列] 一
• [CXF REST标准实战系列] 一
• 10分钟掌握XML、JSON及其解
• 自定义圆形控件RoundImage
• 【XML】
• 10分钟掌握XML、JSON及其解
• 10分钟掌握XML、JSON及其解
• 10分钟掌握XML、JSON及其解
• 10分钟掌握XML、JSON及其解
热门标签
更多 ►
关闭广告
单独headers
封装代码
提示错误
整数正则
非0开头
跳页
出页码
antd table
提示URL未注册
公众号支付
vue hash模式
iSlider
车牌键盘
循环图片
echarts 双折
左右布局
DllPlugin
对象创建
打字游戏
圈选
两栏
云函数
蒙版
ES2020
橱窗
无缝滚动轮播
色块碰撞
组件销毁
文档操作