前言
之前有同事在安卓實現tracerout,因爲大部分安卓系統都不帶traceroute命令,只能使用ping來實現模擬。
比如ping的-t命令,可以設置ttl,逐步增加調試,測試出路由的每一條。
但是效率很低,想用c寫一個方法
我使用ndk做了個so,在裏面使用rawsocket實現icmp功能,但是發現權限不足,無法建立socket。
查閱資料發現安卓沒有root權限是運行不了rawsocket的。
找到了一個方法可以解決
https://blog.csdn.net/Inconsolabl/article/details/50437588
把二進制文件放入用戶空間,然後設置權限700-rwx------ (700) -- 只有屬主有讀、寫、執行權限。
試驗成功,找網上了一個交叉編譯的traceout封在app裏面,直接調用。
最近又需要做一個tcpping的功能,但是沒有找到現成的交叉編譯的二進制程序。其實tcpping就是個握手探測,用java也可以寫。但是java那邊比較忙,我試着寫一個交叉編譯的tcpping。
實現
https://blog.csdn.net/qushaobo/article/details/81089466
參考代碼寫了個例子
但是不能執行,顯示"./data/user/0/com.example.myapplication/files/tcpping": error: Android 5.0 and later only support position-independent executables (-fPIE).
發現例子代碼是
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main (int argc, char *argv[])
{
fprintf(stderr, "this is a test...\n");
return 0;
}
使用的是stderr,很可能安卓的權限很嚴格,輸出到標準錯誤裏也不行,改成printf就ok了。
格式
對例子代碼做了一些兼容性修改
Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := tcpping
LOCAL_SRC_FILES := tcpping.cpp
ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
LOCAL_CFLAGS += -D__ARMV7__
LOCAL_ARM_MODE := arm
else
LOCAL_ARM_MODE := arm
endif
#兼容5.0+
LOCAL_CFLAGS += -fPIE -fPIC
LOCAL_LDFLAGS += -fPIE -pie
include $(BUILD_EXECUTABLE)
Application.mk
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi armeabi-v7a x86
APP_PLATFORM := android-14
進行編譯$NDK/ndk-build DK_DEBUG=1 -B V=1
進入libs目錄,拿到tcpping二進制在3個平臺下的執行程序