关于签名错误"INSTALL_PARSE_FAILED_NO_CERTIFICATES"的踩坑之旅

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于签名错误"INSTALL_PARSE_FAILED_NO_CERTIFICATES"的踩坑之旅相关的知识,希望对你有一定的参考价值。

参考技术A

上一把都还调试安装正常,添加库,修改gradle文件,然后签名验证失败,出现如下错误:

分析:初步判断和签名方式有关,但是一般未指定keyStore文件,调试状态下默认使用系统盘下Users\\xxx.android\\debug.keystore,而且在修改gradle文件里面仅仅是添加依赖,并未修改相关签名配置;

分析:很多兄弟说到Android7.0后使用新的签名方式,打包以防万一,两种方式都勾选,然后一拍脑袋手动配置debug的签名,并指明两种签名方式均可用。为什么无效呢?进源码一看:(原来这两个值默认就是true,根本不用设置)

分析:到这里确实产生困惑了,按理说Android6手机不行,高于6就正常,确实应该和签名方式有关啊,束手无策...

分析:原来和添加的依赖包有关,回头一看只是添加了Mqtt相关依赖,并未有多余动作,猛然想起高版本手机貌似抛出过异常,当时一心解决签名问题,忽略了,回头看看:

分析:这个非常见异常,赶紧去查了查:
原因为maven打包之后由于重复引用某些依赖导致生成了一些.RSA、.DSA和.SF等文件,运行jar时会抛出该异常 ,多数解决方案都是删除Jar中的这些文件,于是修改打包配置:

1、V1(JAR)签名需要对apk内所有文件进行签名,V2方案是针对APK整体文件进行签名;同理安装校验签名,V1需要对所有文件进行hash校验,V2只需要校验一次。

2、V1只保证了Apk压缩包内每个文件的完整性,不能保证整个包的完整性,V2两者均能保证。

3、有较多文件的工程,V2在打包、安装解析两个过程中明显快于V1

打字稿错误:此表达式不可调用。类型 'typeof import("koa-session")' 没有调用签名

【中文标题】打字稿错误:此表达式不可调用。类型 \'typeof import("koa-session")\' 没有调用签名【英文标题】:Typescript error: This expression is not callable. Type 'typeof import("koa-session")' has no call signatures打字稿错误:此表达式不可调用。类型 'typeof import("koa-session")' 没有调用签名 【发布时间】:2020-09-09 21:06:57 【问题描述】:

部分解决:

github上有一个老问题,这里稍微描述一下这个问题。当您在全局范围内声明一个模块时,它会重写整个导出模块的类型。当您在模块中声明模块时,它会合并。为什么?我不知道

https://github.com/microsoft/TypeScript/issues/17736#issuecomment-344353174

我想通过接口合并来扩展第三方模块的类型。一切正常,但是当我发表评论时 export ;types.d.ts 我遇到以下错误:

此表达式不可调用。输入'typeof import("koa-session")' 没有呼叫签名

你能解释一下为什么会这样吗?

您可以在此处查看工作代码: https://codesandbox.io/s/typescript-node-nocfq?file=/src/types.d.ts

【问题讨论】:

【参考方案1】:

TypeScript github 上已解决了类似问题。不幸的是,我现在知道任何其他可以描述它的文档页面。

注释掉export 会将types.d.ts 文件从模块 变成脚本。来自TypeScript handbook:

在 TypeScript 中,就像在 ECMAScript 2015 中一样,任何包含***导入或导出的文件都被视为一个模块。相反,没有任何***导入或导出声明的文件被视为脚本,其内容在全局范围内可用(因此也可用于模块)。

由于没有 export 语句(也没有 import 语句)的文件不是一个模块,而是一个脚本,它没有关于任何模块的信息,并且确实会忽略存在“koa-session”定义的事实。

您可以在您的沙盒中尝试此操作 - 在 types.d.ts 中添加任何*** importexport(它可以完全未使用)将修复 This expression is not callable 错误。

【讨论】:

感谢您的回答。但这并没有描述我的问题。我使用声明模块“koa-session”,从逻辑上讲,它应该在模块和全局范围内工作。但它的行为不同。我已经发现,在全局范围内使用模块“koa-session”会重写任何模块的导出类型。为什么?我不知道,它没有在任何地方描述 因为没有 export 语句(也没有 import 语句)的文件不是一个模块,而是一个脚本,它没有关于任何模块的信息,并且确实会忽略“koa”的现有定义这一事实-会议”。除了这个 github 线程之外,我不知道任何文档(抱歉,那里发生了很多事情,请选择相关的部分)github.com/microsoft/TypeScript/issues/… 感谢您的链接。这似乎是我所期望的。它甚至解释了为什么应该省略命名空间。您能否附加此链接并相应地格式化您的问题?我会接受它并奖励你的赏金【参考方案2】:

如果要增强接口并进行接口合并,则需要导入接口。你正在做的是完全重写它。

import Session from "koa-session";
declare module "koa-session" 
  interface Session 
    user: 
      id: number;
      username: string;
    ;
  

只要这样做,您就会随心所欲地增强界面。

【讨论】:

根据文档,由于声明合并,我无法重写它。此外,当我只添加“export ”时,它会正确合并。我假设当您导入任何内容时也会发生同样的情况,而不仅仅是会话 能否提供一个文档链接,上面说 Typescript 允许重写而不是合并? 我也不需要解决方案。我需要解释

以上是关于关于签名错误"INSTALL_PARSE_FAILED_NO_CERTIFICATES"的踩坑之旅的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 中与 REST Api 进行会话时出现 QuickBlox“意外签名”错误

为啥 TypeScript 声称它“无法调用类型缺少调用签名的表达式”?

双重签名 .cat 文件有错误“主题中不存在签名”

微信支付商户签名错误

jssdk发起微信支付请求弹出"errMsg":"chooseWXPay:fail" 报商户签名错误

iPhone 应用程序代码签名错误 - “...签名无效...”