2018 Update: https://github.com/Magisk-Modules-Repo/adb-ndk
Marshmallow removed adb from the /system/bin directory. For those wanting this functionality back, here’s a simple installer to push static compiles of adb and fastboot to /system/xbin and uses a command wrapper to point adb to the correct HOME directory and set TMPDIR for compatibility. Detects and supports “systemless” install via SuperSU/Magisk as well. It can then be used from Terminal while booted from that point on.
好了,后面不用看了。
=======================
此文章未完工,纯属记录挖坑试错而已……求大牛指点_(:з」∠)_
嗯,Google在Android 6.0里移除了device-on-target的adb(Compile, for android 6.0, adb for “device-on-target”)于是需要自行编译了。作为一个基本没搞过这档事的人,我内心是崩溃的。
先试试用Android NDK编译。先
<pre class="prism-highlight prism-language-bash">git clone https://github.com/android/platform_system_core/
把相关内容拿下来,ndk走起
<pre class="prism-highlight prism-language-bash">sx@zsx-pc /cygdrive/e/adb/platform_system_core-master/adb
$ /cygdrive/d/Android/AndroidNDK/android-ndk-r10e/ndk-build NDK_APPLICATION_MK=./Android.mk
/cygdrive/d/Android/AndroidNDK/android-ndk-r10e/build/core/add-application.mk:49: Android.mk: No such file or directory
jni/Android.mk:139: /cygdrive/d/Android/AndroidNDK/android-ndk-r10e/build/core/build-host-static-library.mk: No such file or directory
jni/Android.mk:169: /cygdrive/d/Android/AndroidNDK/android-ndk-r10e/build/core/build-host-static-library.mk: No such file or directory
jni/Android.mk:289: /cygdrive/d/Android/AndroidNDK/android-ndk-r10e/build/core/build-host-executable.mk: No such file or directory
Android NDK: Trying to define local module 'adbd' in jni/Android.mk.
Android NDK: But this module was already defined by jni/Android.mk.
/cygdrive/d/Android/AndroidNDK/android-ndk-r10e/build/core/build-module.mk:34: *** Android NDK: Aborting. . Stop.
很棒,搜索,得Android NDK build-host-executable.mk: No such file or directory。尝试使用patched NDK(https://github.com/flyskywhy/android-ndk-host)。得有东西没定义。
<pre class="prism-highlight prism-language-bash">sx@zsx-pc /cygdrive/e/adb/platform_system_core-master/adb
$ /cygdrive/d/Android/AndroidNDK/android-ndk-r10e/ndk-build
Android NDK: Required variable TOOLCHAIN_ABIS is not defined by /cygdrive/d/Android/AndroidNDK/android-ndk-r10e/toolchains/llvm-3.5/config.mk
/cygdrive/d/Android/AndroidNDK/android-ndk-r10e/build/core/add-toolchain.mk:38: *** Android NDK: Aborting . Stop.
懒得再去对比r10b和r10e的区别了,换方案。直接按照编译到ARM的方法来搞。
以adb-arm项目为基础(https://github.com/bonnyfone/adb-arm),其adb-arm-binary是不能直接使用的(no such file or directory)。直接按其方法编译,当然也是不能用的。只要用file对比一下就知道原因了:
<pre class="prism-highlight prism-language-bash">root@bacon:/system/bin # file audiod
audiod: ELF 32-bit arm LSB shared object, dynamic (/system/bin/linker), needs 1 lib
root@bacon:/system/bin # file adb
adb: ELF 32-bit arm LSB executable, dynamic (/lib/ld-linux.so.3), needs 1 lib
动态链接库的连接器路径不对,改。加入参数
<pre class="prism-highlight prism-language-bash">-Wl,--dynamic-linker=/system/bin/linker```
<pre class="prism-highlight prism-language-bash">root@bacon:/system/bin # file adb
adb: ELF 32-bit arm LSB executable, dynamic (/system/bin/linker), needs 1 lib但还是跑不起来,提示
<pre class="prism-highlight prism-language-bash">root@bacon:/ # adb version
error: only position independent executables (PIE) are supported.搜索,得文章:<http://stackoverflow.com/questions/24818902/running-a-native-library-on-android-l-error-only-position-independent-executab>,改。
将Makefile的相关参数改成:
<pre class="prism-highlight prism-language-bash">CFLAGS+= -O2 -g -Wall -Wno-unused-parameter -pie -fPIE
LDFLAGS += -pie -fPIE再编译,提示:
<pre class="prism-highlight prism-language-bash">root@bacon:/ # adb
CANNOT LINK EXECUTABLE: library “libcrypto.so.1.0.0” not found
page record for 0xb6ea902c was not found (block_size=16)看来是动态链接库的问题了。Android似乎对带版本的动态链接库不太友好。想要静态链接,但发现压根没有这些源文件,GitHub搜索到的几个.a也不能用,先放弃,选择从toolchain的lib下拷入相关so。
<pre class="prism-highlight prism-language-bash">adb push ‘/opt/poky/1.5/sysroots/armv7a-vfp-neon-poky-linux-gnueabi/lib/libpthread.so.0’ /system/lib
adb push ‘/opt/poky/1.5/sysroots/armv7a-vfp-neon-poky-linux-gnueabi/lib/librt.so.1’ /system/lib
adb push ‘/opt/poky/1.5/sysroots/armv7a-vfp-neon-poky-linux-gnueabi/lib/libc.so.6’ /system/lib
adb push ‘/opt/poky/1.5/sysroots/armv7a-vfp-neon-poky-linux-gnueabi/lib/ld-linux.so.3’ /system/lib
adb push ‘/opt/poky/1.5/sysroots/armv7a-vfp-neon-poky-linux-gnueabi/lib/libcrypto.so.1.0.0’ /system/lib
adb push ‘/opt/poky/1.5/sysroots/armv7a-vfp-neon-poky-linux-gnueabi/lib/libdl.so.2’ /system/lib拷入了以下so,还在挂:
<pre class="prism-highlight prism-language-bash">WARNING: linker: /system/lib/libpthread.so.0: unsupported flags DT_FLAGS_1=0x28
CANNOT LINK EXECUTABLE: unknown reloc type 19 @ 0xb6db1a39 (59)
page record for 0xb6f3602c was not found (block_size=16)`
嗯,你开心就好了。不就是libpthread都在libc里吗,不就是这些都没法link吗(笑)
那就是说只有从AOSP直接编译才可以了是吗(笑)
也就是说,先留篇失败记录吧……来日再战。