背景
因为项目工程在手机平台上有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都是基于同一台机器生成的!
PREVIOUSInternal的跨dll访问
NEXTUnity中Lua热更ab的方案