有一个需求, 需要对 apk 反编译, 反编译后发现有 .so 引用, 基于 arm 平台, 并且只能运行于 Android 系统.
如果提示: Exception in thread "main" java.lang.UnsatisfiedLinkError: Can't load library:
/home/zhipeng/libsign.so
或者 logcat 提示java.lang.UnsatisfiedLinkError: Couldn't load sign from loader dalvik.system.PathClassLoader[DexPathList[[zip file "/sdcard/test/Root.jar"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]]: findLibrary returned null
解决办法: 修改 System.loadLibrary, 使用 System.load("/home/zhipeng/libsign.so")
如果提示: Exception in thread "main" java.lang.UnsatisfiedLinkError: /home/zhipeng/libsign.so: dlopen(/home/zhipeng/libsign.so, 1): no suitable image found. Did find:
/home/zhipeng/libsign.so:
unknown file type, first eight bytes: 0x7F 0x45 0x4C 0x46 0x01 0x01 0x01 0x00
因为 libsign.so 是基于 ARM 平台编译运行的, 有试过在树莓派上运行, 但缺少 Android 依赖.
当编译好运行 app_process /sdcard/test com.zhipeng.app.Root 后直接 提示Aborted.
通过 logcat 后可以提取到有用的信息
app_process: no class name or --zygote supplied.
Zip is good, but no classes.dex inside, and no valid .odex file in the same directory
意思是在 jar 包中没有发现 dex 文件.
解决方法: d2x-jar2dex Root.jar -o classes.dex && zip -m Root.jar classes.dex
另外需要注意的是, xxx.jar尽量和main class name 保持一致.
如果提示:
nable to locate class 'com/zhipeng/app/Root'
java.lang.NoClassDefFoundError: com/zhipeng/app/Root
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.zhipeng.app.Root" on path: DexPathList[[zip file "/sdcard/test/Root.jar"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]
记得检查 classes.dex 是否打包到 Jar 包中, 注意文件名.
说到底, System.loadLibary 为啥总是不行, 除了 apk 的方式可以成功运行, 其他方式都提示找不到文件.郁闷了..
要点如下, jar 包名尽量和 main class name 保持一致.
System.loadLibary 不行就换System.load
eclipse 导出 jar 包后, 记得再用 jar 包生成 classes.dex, 将其打包至 jar 包.
运行方式:
/system/bin/dalvikvm -classpath
/sdcard/test
/Root.jar com.zhipeng.app.Root
也可以用 app_process 的方式: app_process /sdcard/test com.zhipeng.app.Root, 但是需要先设置 CLASSPATH
// export CLASSPATH=/sdcard/test/Root.jar
记得把 libsign.so 放到
/sdcard/test中, 可以放到别的位置.
如果logcat 提示Abort message: 'Error changing dalvik-cache ownership : Permission denied' 或者java.lang.UnsatisfiedLinkError: dlopen failed: couldn't map "/storage/emulated/0/test/libsign.so" segment 1: Operation not permitted
将 .so 移动至 /data/local/tmp/下即可. 原因是: The SD Card is mounted noexec, so I'm not sure this will work. 意思是不支持加载 SD 卡这种可拆卸存储执行可执行文件.