apk-revise
v1.0.7
Published
用于反编译APK文件,修改资源文件后重新打包、签名。目前主要用途用于修改AndroidManifest.xml的meta-data数据(添加渠道等信息),也可用于其他修改。
Downloads
12
Maintainers
Readme
APK-REVISE
用于反编译APK文件,修改资源文件后重新打包、签名。目前主要用途用于修改AndroidManifest.xml的meta-data数据(添加渠道等信息),也可用于其他修改。 拥有两种使用方式,命令行方式和自定义方式。反编译和重新打包使用的是apktool,然后使用zipalign和apksigner。
安装
npm install apk-revise
警示: 系统需安装Java(作者Java版本21.0.1),Node版本需大于20.11.0。
命令行方式
npx apk-revise -e=./app.apk?rename=new_app -o=./build -s=./证书.keystore -a=证书别名 -p=证书密码 -rm=./channel.json
/* ./channel.json */
{
"huawei": [
{
"name": "CHANNEL_NAME", /* meta-data的name */
"value": "huawei", /* meta-data的value */
"merge": false /* 当name为CHANNEL_NAME的meta-data存在时,是替换还是合并原有值 */
}
],
"xiaomi": [{ "name": "CHANNEL_NAME", "value": "xiaomi", "merge": false }]
}
或
npx apk-revise -e=./app.apk?rename=new_app -o=./build -s=./证书.keystore -a=证书别名 -p=证书密码 -rs=./revise.js
// ./revise.js
export default {
count: 1, // 修改打包次数
reviseData: async (instance, index) => {
// 反编译后资源目录
const dir = await instance.getReviseDirPath()
// 自己的修改方法
},
outputFilePath: async (instance, index) => {
// 导出路径
return './new_app.apk'
}
}
自定义方式
警示:自定义方式项目中的package.json需添加
"type": "module"
import { ReviseUtensil } from 'apk-revise'
// 配置
const reviseUtensil = new ReviseUtensil({
target: async (instance) => {
return {
count: 1, // 修改打包次数
reviseData: async (instance, index) => {
// 反编译后资源目录
const dir = await instance.getReviseDirPath()
// 自己的修改方法
},
outputFilePath: async (instance, index) => {
// 导出路径
return './new_app.apk'
}
}
},
file: async (instance) => {
return {
entryFilePath: './app.apk', // 原始apk文件
outputDirPath: './build', // 导出目录
isCreateReplica: true, // 是否创建资源副本,避免多次修改打包的相互影响
}
},
key: async (instance) => {
return {
ks: './证书.keystore',
ksKeyAlias: '表示signer在密钥库中的私钥和证书数据的别名的名称',
ksPass: '包含signer私钥和证书的密钥库的密码',
keyPass?: 'signer私钥的密码',
}
},
// 环境变量中配置了java、zipalign和apksigner那env可不写
env: async (instance) => {
return {
java: '系统java路径',
zipalign: '系统zipalign路径',
apksigner: '系统apksigner路径',
}
}
})
// 日志
reviseUtensil.on('process_stdout', (name, msg) => {
console.log('主进程输出', name, msg)
})
reviseUtensil.on('subprocess_stdout', (name, msg) => {
console.log('子进程输出', name, msg)
})
reviseUtensil.on('subprocess_stderr', (name, msg) => {
console.log('子进程异常', name, msg)
})
// 开始执行
const apkPathList = await reviseUtensil.run()
console.log(apkPathList)