如何使用python更改AndroidManifest中的versionCode和versionName?

时间:2013-07-03 08:47:11

标签: android python python-2.7 character-encoding android-manifest

我正在尝试在构建/签署apk之前设置versionCode和versionName。构建和签名运行没有错误。

问题在于,当我尝试启动应用程序时,它崩溃了,我找到了NoClassDefFoundError并分配了有关未知权限的警告。

如果我在eclipse中打开项目而不更改AndroidManifest.xml中的任何内容并运行“export sign application package”。我得到了同样的错误。

如果我添加一个空格,删除它,并保存AndroidManifest.xml,应用程序运行没有问题。

这至少会导致我这是一个编码问题。下面是我用来更改版本的代码。

fh,abs_path = mkstemp()
file_path = 'AndroidManifest.xml'
old_file = open(file_path)
new_file = open(abs_path,'w')
for line in old_file:
    line = re.sub(r'android:versionCode=".*?"','android:versionCode="%s"' %    version_code,line)
    line = re.sub(r'android:versionName=".*?"','android:versionName="%s"' % version_name,line)
    new_file.write(line)
new_file.close()
close(fh)
old_file.close()
remove(file_path)
move(abs_path, file_path)

我也尝试过这样做来强制执行utf-8。我不确定清单的编码应该是什么。

line = re.sub(r'android:versionCode=".*?"',u'android:versionCode="%s"' %    version_code,line)
line = re.sub(r'android:versionName=".*?"',u'android:versionName="%s"' % version_name,line)
new_file.write(line.encode('utf-8'))

我试图像这样检查编码,但它也有同样的错误。

file -bi AndroidManifest.xml 
application/xml; charset=us-ascii

有人知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

问题是Android清单希望LF成为新线,正如Michael Butscher所说。要强制执行此操作,我必须使用io.open并将新行设置为'\n'。我认为这是Android中的一个错误,Google应该修复它,以便AndroidManifest.xml支持所有常见类型的换行符。

fh,abs_path = mkstemp()
file_path = 'AndroidManifest.xml'

old_file = open(file_path, 'r')
new_file = io.open(abs_path,mode='w', newline='\n')

for line in old_file:
        line = re.sub(r'android:versionCode=".*?"','android:versionCode="%s"' % version_code,line)
        line = re.sub(r'android:versionName=".*?"','android:versionName="%s"' % version_name,line)
        new_file.write(line.decode('utf-8'))

new_file.close()
close(fh)
old_file.close()
remove(file_path)
move(abs_path, file_path)