1.0.7 • Published 1 year ago

apk-revise v1.0.7

Weekly downloads
-
License
ISC
Repository
-
Last release
1 year ago

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)
1.0.7

1 year ago

1.0.6

1 year ago

1.0.5

1 year ago

1.0.4

1 year ago

1.0.3

1 year ago

1.0.2

1 year ago

1.0.1

1 year ago

1.0.0

1 year ago