0%

问题背景

手机射频前端、天线会有很多MIPI器件,而这些MIPI器件前期需要调试,为了方便硬件工程师调参数,会在调试的软件版本内置一些工模APK让其使用。而这些工模APK需要软件相关人员根据需求进行代码编写,在实现新的需求时,楼主就遇到了一个上层APK调用JNI接口的问题,JNI层的接口调试OK,APK的代码开发了主要功能,还有一些功能没开发完,先将接口层的代码合入了库中。

CI流水线日构建的次日大版本刷测试机,使用需要调用JNI接口层代码的工模功能全部丧失,测试手机红屏报错。

问题分析

通过adb指令抓起android侧的log。

1
adb logcat > temp.txt

搜索了报错log打印的关键字,发现是新加的JNI层接口注册失败。提交接口代码前,还特意在APK层写了测试用例压测这个接口。

将之前开发的APK代码加入再进行测试,发现注册成功。初步怀疑是APK层没有调用这个接口导致。

开始在google上搜索是不是有想过的APK开发人员遇到过类似的问题,没有搜索到类似的案例。但是某个瞬间,想起自己在安卓官网有看到APK开发指南的一篇说明《缩减、混淆处理和优化您的应用》(其实楼主作为这方面开发的新人,问过一些工作七、八年开发较长时间的同事,是不太清楚这点的),猜测是上层没有调用JNI层的那个接口,导致java侧声明的JNI层的接口代码,在编译过程中删除了,通过APK反编译工具apktool(网上搜索下载),反编译已经编译出来的apk,发现在java代码中声明的那个接口代码被删除掉了。

也在项目级 build.gradle 文件中看到了这个开发打开了minifyEnabled这个开关:

1
2
3
// Enables code shrinking, obfuscation, and optimization for only
// your project's release build type.
minifyEnabled true

问题解决

将已经开发的APK调用这个接口的模块代码合入仓库,一起编译版本。

问题总结

下面安卓官网的文字,关于APK代码缩减的关键介绍,至于编译过程中实现代码缩减这项功能的源码具体实现,需要更多的APK编译想过的资料和代码查看,后续楼主会抽空多研究一些。

  • 代码缩减(即摇树优化):从应用及其库依赖项中检测并安全地移除未使用的类、字段、方法和属性(这使其成为了一个对于规避 64k 引用限制非常有用的工具)。例如,如果您仅使用某个库依赖项的少数几个 API,缩减功能可以识别应用“未”使用的库代码并仅从应用中移除这部分代码。如需了解详情,请转到介绍如何缩减代码的部分。
  • 资源缩减:从封装应用中移除不使用的资源,包括应用库依赖项中的不使用的资源。此功能可与代码缩减功能结合使用,这样一来,移除不使用的代码后,也可以安全地移除不再引用的所有资源。如需了解详情,请转到介绍如何缩减资源的部分。
  • 混淆处理:缩短类和成员的名称,从而减小 DEX 文件的大小。如需了解详情,请转到介绍如何对代码进行混淆处理的部分。
  • 优化:检查并重写代码,以进一步减小应用的 DEX 文件的大小。例如,如果 R8 检测到从未采用过给定 if/else 语句的 else {} 分支,则会移除 else {} 分支的代码。如需了解详情,请转到介绍代码优化的部分。

前言

亚马逊云服务(AWS)免费薅羊毛一年,创建个人EC2(Elastic Compute Cloud)搭建VPN,可以比较方便的Google一些文献。这个配置主要分两部分进行配置,AWS云端和Client(我自己是在Mac Pro上进行配置)。

准备工作

注册aws个人账号,绑定一张信用卡(推荐visa),具体注册流程看官网

AWS云端配置

主要分四个步骤,创建EC2实例,设置安全组,给实例绑定弹性IP,然后安装ipsec-vpn

创建EC2实例

1、如果在中国大陆,个人建议选择东京的服务器,这样访问Google的速度会快一些,自己可以ping一个网站测一下速度,示例选择的是Hong Kong。

2、点击All services,然后选择EC2。

3、启动一个实例。

4、过滤掉付费的AMI,勾选Free tier only,然后选择下图中的其中一个AMI进行Select。

5、选择一个实例类型,勾选☑️哪个Free tier eligible,接着Review and Launch。

6、有兴趣的可以Review实例类型的一些参数,然后直接点击Launch,运行实例。

7、为你的实例创建一个密钥对,你本地电脑远程和AMI通讯密钥,一定要Download下来并保存在一个合适的地方,后续还会用到。

8、点击查看你的实例。

9、接下来选中你的实例,为你的实例配置安全组(Security Groups)和弹性IP(Elastic IPs)。

安全组设置

安全组主要是实例的入站和出站规则进行设置。

1、入站规则:三个端口,TCP类型的22port口和UDP类型的50和4500port口,见下图具体设置。

2、出站规则:所有流量和任何位置

弹性IP设置

这个设置主要是为了这个目的,这是aws官网的原话:I want to have a public IP address for my EC2 instance that will persist even if my instance is stopped and restarted,主要为了防止实例停止运行和重启是,没有对外的有效IP。

1、Allocate一个弹性IP。

2、关联实例。

安装ipsec-vpn

1、本地终端连接你创建的实例,在你创建实例保存密钥对的路径去开启终端,接着运行下图的1步骤,然后输入yes,按enter键,进行2步骤你就会连接到你创建的实例。(ps. 一般你执行过1后,后续连接你直接输入2指令就行)

2、安装指令

1
wget https://git.io/vpnsetup -O vpnsetup.sh && sudo sh vpnsetup.sh

3、安装完成之后,要记录下来你的vpn信息,本地客户端配置vpn的时候要用到。

本地客户端设置

依据自己的本地机装的操作系统类型,进行相应的配置,请参考GitHub上的这个链接🔗。

如果是mac os注意下图的这两处,一定要设置对。

主要是如下两条bash命令完成如下的修改:

1
echo $PATH //这条指令可以查看电脑已经添加的环境变量路径
1
vi ~/.profile //进行增删改环境变量

ps:环境变量一般分先后为这几个文件,系统按从上倒下优先级进行加载,etc目录下的是系统级的,~下的为用户级:

  1. /etc/profile
  2. /etc/paths
  3. ~/.bash_profile
  4. ~/.bash_login
  5. ~/.profile
  6. ~/.bashrc