apk替换静态库

背景

因为项目工程在手机平台上有bug,但是却只有部分apk容易复现,大部分都比较难复现或者干脆不出现了!

而且因为早期并没有预想到那些地方或许有问题,没有做好日志埋点,所有我第一个想到的就是直接替换apk中的.so文件,在新的.so中添加我想加的log

该apk工程是unity的项目

解包

这里使用的是apktool

java -jar ./apktool.jar d ./test.apk -o ./test

以上指令就直接把apk中的内容解压了(这里是我自己的apk,因为是测试包,并没有加固之类的);

替换静态库

我们把新编译好的静态库替换掉原本静态库,直接在./test/lib/arm64-v8a下替换就可以了(我只打包一个cpu类型的!)

重打包

java -jar ./apktool.jar b ./test -o ./target.apk

还是使用apktool进行重新打包!最终输出的是一个target.apk的文件;

既然已经出了apk,我们试一下安装!

结果在apk验证的时候就中断了!看样子是apk的完整性验证没有通过!

那么就开始签名!

签名

准备好自己的jks,在sdk中,官方已经准备好了一个签名工具!

SDK\build-tools\32.0.0\apksigner.bat

.\apksigner.bat sign --ks G:\other_workspace\TestSign.jks --ks-key-alias Test G:\other_workspace\target.apk
Keystore password for signer #1:

签名完成后,在META-INF目录下就会生成相应的md5之类的文件对应符号!

继续安装!

结果gg了,看信息却是extract native libraries;

AndroidManifest.xml中找到android:extractNativeLibs,将其改为true

<application android:allowBackup="true" android:appComponentFactory="android.support.v4.app.CoreComponentFactory" android:debuggable="true" android:extractNativeLibs="true" android:icon="@drawable/icon" android:label="@string/app_name" android:networkSecurityConfig="@xml/network_security_config" android:roundIcon="@drawable/icon" android:supportsRtl="true" android:theme="@style/AppTheme" android:usesCleartextTraffic="true">
        <uses-library android:name="org.apache.http.legacy" android:required="false"/>

然后再次打包,签名,安装;最好成功安装并执行了!

注意:如果和我一样是unity的项目,注意一下关键行的差异,不要多个.so不一致的情况下,只替换部分,那样会导致启动闪退!

因为apk用的是ci打包的,所以我用来生成的.so都是基于同一台机器生成的!