分类存档: android

使用ndk gcc编译

半年用一次,每次用都得现查一遍。

这里记录一下ndk中使用gcc编译直接跑在android上的二进制程序

先直接生成GNU Android Toolchain,然后就可以直接使用gcc来编译了,不必使用ndk-build,也免去了一堆配置文件的要求。

$NDK/build/tools/make-standalone-toolchain.sh --toolchain=arm-linux-androideabi-4.8 --platform=android-19 --install-dir=/opt/ndk_toolchain

生成后直接设置是否可用:

echo “main(){}” | /opt/ndk_toolchain/bin/arm-linux-androideabi-gcc -x c –

没有报错,即toolchain环境已经配置好。

 

生成的文件在虚拟器中测试时,注意各家的adb文件互相冲突。比如pp助手的adb就会占用端口,需要提前查看下是否存在后台进程,存再则杀掉。

夜神则直接使用nox_adb来连接。

 

apk逆向

现在apk加固越来越强了,

除了dex进行加固,连so也一直进行加固,防动态调试及静态分析。

有位大神自己编译了libdvm.so,理论上应该可以将所有的dex进行dump,因为无论在如何加固,最终都会生成完整的dex供系统使用。

https://github.com/zhukunqian/DexExtractor

apk解压后重新打包

因为涉及到对dll的加密,需要对apk解包后,替换加密后的文件,然后重新打包。

解包很简单,apk本身是zip格式。

再重新打包的命令:

jar cvf new_apk.apk -C unpack_apk/ .

打包后进行签名:

jarsigner -digestalg SHA1 -sigalg MD5withRSA -verbose -keystore xxx.keystore 13_LoadLuaLib_4.apk haifi

测试没有问题。

如果有条件这里还可以做更多的事情:

1、和原来的包进行比较,查看是否使用了不相同的证书。(可选)

2、和云测试平台进行接合,生成的包,自动上传云测试平台,生成测试报告。

3、使用monkeyrunner自动进行测试,(实际上云测试平台也是使用的monkeyrunner),生成测试报告。

后续2步很重要,可以避免发出一个有故障的包。

如何检测apk的签名是否正确

apk渠道众多,有的渠道会对签名进行二次签名。

这里就可能出现一个隐患,打出来的包可能因为不小心使用了错误的签名,会导致提交时被渠道打回。

针对这种情况我们可以在每次出包后,使用keytool查看一下签名指纹,指纹相同,签名也一定会相同。

可以做成工具来进行自动检查。

android隐藏标题栏与状态栏

requestWindowFeature(Window.FEATURE_NO_TITLE);    // 隐藏标题栏
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);  // 隐藏状态栏

上面两行注意要在setContent之前调用。

dialog没有全屏

项目中使用了视频,视频上下都是黑边,所以设置backgroundcolor为黑色,但是最上面有一点一直没有被填充上(黄色部分),写测试发现是视频所在的dialog没有全屏。

最早怀疑是最上面的状态栏的问题,看高度正好和状态栏的高度相同。

但无论如何设置backgroundcolordrawable,padding,margin,layoutparam都无法解决问题,而且输出查看也没问题。

只能采取减少法了,不断删除相应的代码并观察,看看删除到哪里才不出现这个问题。

在删除时,突然发现在有段代码有:

		// this.getWindow().setLayout(screenWidth, screenHeight);

		mButton.setVisibility(View.INVISIBLE);
	}

看上面被注释掉那一行,这段代码在设置了视频了dialog后又重新了window的layout,难道问题出在这里?注释掉果然解决掉了问题。

 

adb devices中看不到设备

1、adb devices中看不到设备。

以前也遇到过这种问题,解决方案是重装安装android use driver,还需要修改里面的android_winusb.inf文件,很是麻烦。

这里找到一个简单的办法:

修改adb_usb.ini

在任务管理器中结束adb命令,再对下面的修改可能产生影响

在模拟器存放的目录<例如:C:\Documents and Settings\Administrator\.android>下找到或新建一个adb_usb.ini文件,同时增加或写入上面设备的0xVID(VID就是上面的VID_后面跟的数字,例如:0x1782),弄好了再使用重新启动android sdk中的adb就能连接上了

2、adb devices中看到设备是offline状态

-.-!!升级一下adb版本即可。

3、小米手机获取root权限。

安装miui开发版本,adb root进入后使用su获得root权限。

4、小米手机安装驱动

https://www.mi.com/c/service/download/ 下载小米自己的驱动软件

5、三星手机一个解决办法

使用QQ的电脑管家安装手机助手,很奇怪的解决办法。电脑管家识别出手机后,debug看log可以正常用,如果想使用snapdragon抓图,可能还得使用无线连上去才可以。

android生成的keystore默认密码

好吧,我们一个项目开发人员一不小心使用了默认生成的debug.keystore提交了app,结果线上无法换keystore,我们只好将debug.keystore拿过来用了。

debug.keystore默认密码是 android。