2020-03-15 16:25:08 +00:00
|
|
|
|
# **ManifestEditor**
|
2020-03-15 16:27:00 +00:00
|
|
|
|
This is a tool used to modify Android Manifest binary file.
|
2020-03-15 16:25:08 +00:00
|
|
|
|
此工具用于修改AndroidManifest二进制文件。比如,更改Manifest文件中的app包名,版本号,更改或新增app入口Application的类名,更改或新增debuggable的属性,增加usesPermission标签,增加meta-data标签等。
|
|
|
|
|
同时,为了更方便使用,提供了直接修改Apk包中的Manifest文件,并对修改后的Apk进行签名的功能。
|
|
|
|
|
|
|
|
|
|
比较常见的修改AndroidManifest二进制文件的工具,大致有这些:
|
|
|
|
|
1. [apkeditor](https://github.com/8enet/apkeditor)
|
|
|
|
|
2. [AXMLEditor](https://github.com/fourbrother/AXMLEditor)
|
|
|
|
|
|
|
|
|
|
但是,这些工具都有一个致命的问题: 新增属性无法被Android系统解析。
|
|
|
|
|
比如,在application标签下增加debuggable=true属性,安装后的App并不是debuggable的。
|
|
|
|
|
|
|
|
|
|
本工具并不存在此问题。当然,可能会存在其他一些问题,并未作充分测试。
|
|
|
|
|
|
|
|
|
|
此项目基于[axml](https://github.com/Sable/axml),并在其基础做了二次封装和一些优化,使用起来更加方便。
|
|
|
|
|
|
|
|
|
|
# **查看帮助文档**
|
|
|
|
|
```
|
|
|
|
|
$ java -jar ../ManifestEditor.jar -h
|
|
|
|
|
```
|
|
|
|
|
得到使用文档:
|
|
|
|
|
```
|
|
|
|
|
options:
|
|
|
|
|
-aa,--applicationAttribute <application-attribute-name-value>
|
|
|
|
|
set the application attribute, name and value shou
|
|
|
|
|
ld be separated by : , if name is in android namesp
|
|
|
|
|
ace, prefix "android-" should be set, multi option
|
|
|
|
|
is supported
|
|
|
|
|
-an,--applicationName <new-application-name>
|
|
|
|
|
set the app entry application name
|
|
|
|
|
-d,--debuggable <0 or 1> set 1 to make the app debuggable = true, set 0 to m
|
|
|
|
|
ake the app debuggable = false
|
|
|
|
|
-f,--force force overwrite
|
|
|
|
|
-h,--help Print this help message
|
|
|
|
|
-ma,--manifestAttribute <manifest-attribute-name-value>
|
|
|
|
|
set the app manifest attribute, name and value sho
|
|
|
|
|
uld be separated by : , if name is in android names
|
|
|
|
|
pace, prefix "android-" should be set, multi option
|
|
|
|
|
is supported
|
|
|
|
|
-o,--output <output-file> output modified xml or apk file, default is $source
|
|
|
|
|
_apk_dir/[file-name]-new.xml or [file-name]-new-uns
|
|
|
|
|
igned.apk
|
|
|
|
|
-pkg,--packageName <new-package-name>set the android manifest package name
|
|
|
|
|
-s,--signApk use jarsigner to sign the output apk file
|
|
|
|
|
-up,--usesPermission <uses-permission-name>
|
|
|
|
|
add the app uses permission name to the manifest fi
|
|
|
|
|
le, multi option is supported
|
|
|
|
|
-vc,--versionCode <new-version-code>set the app version code
|
|
|
|
|
-vn,--versionName <new-version-name>set the app version name
|
|
|
|
|
version: 1.0.0
|
|
|
|
|
```
|
|
|
|
|
# **修改Manifest文件**
|
|
|
|
|
### 1. 修改Manifest中app包名: `-pkg`
|
|
|
|
|
```
|
|
|
|
|
$ java -jar ../ManifestEditor.jar ../AndroidManifest.xml -pkg com.test.newpackage
|
|
|
|
|
```
|
|
|
|
|
在AndroidManifest.xml文件相同的目录下,会生成一个新的xml文件:AndroidManifest-new.xml
|
|
|
|
|
|
|
|
|
|
这个新的manifest文件中,package被改成了`com.test.newpackage`。
|
|
|
|
|
### 2. 新增debuggable = true的属性: `-d`
|
|
|
|
|
```
|
|
|
|
|
$ java -jar ../ManifestEditor.jar ../AndroidManifest.xml -d 1
|
|
|
|
|
```
|
|
|
|
|
新的manifest文件中,Application标签下,增加了`android:debuggable = "true"`属性。
|
|
|
|
|
如果需要将debuggable改为false,只需:
|
|
|
|
|
```
|
|
|
|
|
$ java -jar ../ManifestEditor.jar ../AndroidManifest.xml -d 0
|
|
|
|
|
```
|
|
|
|
|
### 3. 修改Manifest文件中的versionCode和versionName: `-vc` `-vn`
|
|
|
|
|
```
|
|
|
|
|
$ java -jar ../ManifestEditor.jar ../AndroidManifest.xml -vc 100 -vn 1.0.0
|
|
|
|
|
```
|
|
|
|
|
新的manifest文件中,versionCode被改成了`100`,versionName被改成了`1.0.0`。
|
|
|
|
|
### 4. 修改Manifest文件中的applicationName: `-an`
|
|
|
|
|
```
|
|
|
|
|
$ java -jar ../ManifestEditor.jar ../AndroidManifest.xml -an com.test.new.MyApplication
|
|
|
|
|
```
|
|
|
|
|
新的manifest文件中,application标签下的name被改为:`android:name="com.test.new.MyApplication"`。
|
|
|
|
|
### 5. 新增Manifest文件中的usesPermission标签:`-up`
|
|
|
|
|
```
|
|
|
|
|
$ java -jar ../ManifestEditor.jar ../AndroidManifest.xml -up android.permission.READ_EXTERNAL_STORAGE -up android.permission.WRITE_EXTERNAL_STORAGE
|
|
|
|
|
```
|
|
|
|
|
新的manifest文件中,新增了读写sdcard两个权限标签。假如原Manifest文件中已经存在相关权限标签,则不会增加新的。
|
|
|
|
|
### 6. 增加或修改顶层的manifest标签下的其他属性:`-ma`
|
|
|
|
|
```
|
|
|
|
|
$ java -jar ../ManifestEditor.jar ../AndroidManifest.xml -ma android-compileSdkVersion:28 -ma android-compileSdkVersionCodename:9
|
|
|
|
|
```
|
|
|
|
|
新的manifest文件中,顶层的manifest标签下新增或者修改的标签为:
|
|
|
|
|
```
|
|
|
|
|
<manifest
|
|
|
|
|
...
|
|
|
|
|
android:compileSdkVersion="28"
|
|
|
|
|
android:compileSdkVersionCodename="9">
|
|
|
|
|
```
|
|
|
|
|
对于非android命名空间下的属性,去掉命令中的`android-`即可,暂不支持其他命名空间下的属性的更改。比如:
|
|
|
|
|
```
|
|
|
|
|
$ java -jar ../ManifestEditor.jar ../AndroidManifest.xml -ma platformBuildVersionCode:100
|
|
|
|
|
```
|
|
|
|
|
改动的属性是platformBuildVersionCode:
|
|
|
|
|
```
|
|
|
|
|
<manifest
|
|
|
|
|
...
|
|
|
|
|
platformBuildVersionCode="100">
|
|
|
|
|
```
|
|
|
|
|
### 7. 增加或修改application标签下的其他属性: `-aa`
|
|
|
|
|
```
|
|
|
|
|
$ java -jar ../ManifestEditor.jar ../AndroidManifest.xml -aa android-allowBackup:false
|
|
|
|
|
```
|
|
|
|
|
新的manifest文件中,application标签下新增或者修改的标签为:
|
|
|
|
|
```
|
|
|
|
|
<application
|
|
|
|
|
...
|
|
|
|
|
android:allowBackup="false"
|
|
|
|
|
...
|
|
|
|
|
>
|
|
|
|
|
```
|
|
|
|
|
对于非android命名空间下的属性,去掉命令中的`android-`即可,暂不支持其他命名空间下的属性的更改。
|
|
|
|
|
### 8. 新Manifest文件输出到指定目录: `-o`
|
|
|
|
|
```
|
|
|
|
|
$ java -jar ../ManifestEditor.jar ../AndroidManifest.xml -o ../new_androidmanifest.xml -d 1
|
|
|
|
|
```
|
|
|
|
|
将debuggable改为true后的Manifest文件输出为`new_androidmanifest.xml`
|
|
|
|
|
# **修改Apk中的Manifest文件**
|
|
|
|
|
```
|
|
|
|
|
$ java -jar ../ManifestEditor.jar ../original.apk -o ../new_build_unsigned.apk -d 1
|
|
|
|
|
```
|
|
|
|
|
将original.apk文件里的manifest的debuggable属性改为true后,输出未签名的新apk: `new_build_unsigned.apk`。
|
|
|
|
|
如果需要用内置的签名文件对apk进行签名,加上`-s`即可:
|
|
|
|
|
```
|
|
|
|
|
$ java -jar ../ManifestEditor.jar ../original.apk -o ../new_build.apk -d 1 -s
|
|
|
|
|
```
|
|
|
|
|
`new_build.apk`文件目录会生成另外一个签名后的apk:`new_build_signed.apk`。
|
|
|
|
|
|
|
|
|
|
默认使用的是jarsigner命令对apk签名,假如签名失败,可自行对`new_build.apk`进行签名。
|
|
|
|
|
# **Android或者Java代码中使用**
|
|
|
|
|
也可以将`ManifestEditor.jar`文件导入到Android或Java工程中使用,接入方法为:
|
|
|
|
|
```
|
|
|
|
|
ModificationProperty property = new ModificationProperty();
|
|
|
|
|
|
|
|
|
|
property.addManifestAttribute(new AttributeItem(NodeValue.Manifest.PACKAGE, "wind.new.pkg.name").setNamespace(null))
|
|
|
|
|
.addManifestAttribute(new AttributeItem(NodeValue.Manifest.VERSION_CODE, 1))
|
|
|
|
|
.addManifestAttribute(new AttributeItem(NodeValue.Manifest.VERSION_NAME, "1123"))
|
|
|
|
|
.addUsesPermission("android.permission.READ_EXTERNAL_STORAGE")
|
|
|
|
|
.addUsesPermission("android.permission.WRITE_EXTERNAL_STORAGE")
|
|
|
|
|
.addMetaData(new ModificationProperty.MetaData("aa", "11"))
|
|
|
|
|
.addMetaData(new ModificationProperty.MetaData("aa", "22"))
|
|
|
|
|
.addApplicationAttribute(new AttributeItem(NodeValue.Application.DEBUGGABLE, true))
|
|
|
|
|
.addApplicationAttribute(new AttributeItem(NodeValue.Application.NAME, "my.app.name.MyTestApplication"))
|
|
|
|
|
.addApplicationAttribute(new AttributeItem("appComponentFactory", "my.app.name.MyAppComponentFactory"));
|
|
|
|
|
|
|
|
|
|
String inputManifestFilePath = "../../AndroidManifest_old.xml";
|
|
|
|
|
String outputManifestFilePath = "../../AndroidManifest.xml";
|
|
|
|
|
|
|
|
|
|
// 处理manifest文件方法
|
|
|
|
|
FileProcesser.processManifestFile(inputManifestFilePath, outputManifestFilePath, property);
|
|
|
|
|
|
|
|
|
|
String inputApkFilePath = "../../original_old.apk";
|
|
|
|
|
String outputApkFilePath = "../../new_build_unsigned.apk";
|
|
|
|
|
|
|
|
|
|
// 处理得到的apk是未签名的,需要自行签名使用
|
|
|
|
|
FileProcesser.processApkFile(inputApkFilePath, outputApkFilePath, property);
|
|
|
|
|
```
|
|
|
|
|
# **License**
|
|
|
|
|
Originally forked from [axml](https://github.com/Sable/axml).
|
|
|
|
|
```
|
|
|
|
|
Copyright 2020, WindySha
|
|
|
|
|
|
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this work
|
|
|
|
|
except in compliance with the License. You may obtain a copy of the License in the
|
|
|
|
|
LICENSE file, or at:
|
|
|
|
|
|
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
|
|
|
|
|
Unless required by applicable law or agreed to in writing, software distributed under the
|
|
|
|
|
License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
|
|
|
|
|
ANY KIND, either express or implied. See the License for the specific language governing
|
|
|
|
|
permissions and limitations under the License.
|
|
|
|
|
```
|
|
|
|
|
|