关于Android开发中Arm、X86和Mips(草稿)
一、架构
1.Arm架构
是一个32位精简指令集(RISC)处理器架构,其广泛地使用在许多嵌入式系统设计。
2.X86架构
是一个intel通用计算机系列的标准编号缩写,也标识一套通用的计算机指令集合。
3.Mips架构
是一种采取精简指令集(RISC)的处理器架构。
二、三者区别
X86架构是X86指令集,它属于CISC指令集。ARM架构是ARM指令集,属于RISC指令集。
X86是冯若依曼结构,ARM是哈弗结构,这个不一定,比如ARM7TDMI用的就是冯若依曼结构。
其实都是差不多,X86指令多,应用范围广,但效率就显得低一点,ARM指令少,应用范围小,效率显得高。
MIPS架构的处理器多用在网关、猫、机顶盒什么的。ARM处理器用在便携设备,智能手机。
X86,依靠强有力的工厂,前后端联合调优,用tick-tock的稳定,强悍路标,强势控制产业链,获取价值链上最丰厚的那部分利润。
ARM, 靠IP授权的商业模式,且技术上走与Intel差异化路线,加上一些些运气(踏对了手机这条路,谢谢TI-Nokia,Apple,Samsung for big.Little)走小而美的路线,但是凭借已经形成巨大的生态系统,占据优势。
MIPS,本有机会很帅,但是对指令集控制松散,导致生态系统分裂,没有形成合力,最终被市场抛弃。
Power,没有形成规模效益,也没有进入良性循环周期,我的预测是Power8会是最后一颗芯片,就这样结束。
三、android中如何编译出64位so文件
如果是在Linux下编译Android源码,有可能是两个原因:
1. lunch命令有32位和64位的区别,注意选能够编译64位so的命令
2. mk文件中有LOCAL_MODULE_PATH的值比如为$(TARGET_OUT_SHARED_LIBRARIES)/hw的改为LOCAL_MODULE_RELATIVE_PATH := hw,后一种可以分别在lib和lib64下分别生成32位和64位的so文件,这个看看编译后的信息就知道了.
四、关于如何在生成各种架构的so文件的疑问
场景:今天在编码过程中遇到一个异常。
1 replacements=[Ljava.lang.String;@420845d0 2 HARDWARE=hws8301l 3 matchers=[Ljava.lang.String;@42084550 4 RADIO=unknown 5 HOST=screen105 6 HIDE_PRODUCT_INFO=false 7 TAGS=release-keys 8 PRODUCT_CHARM=MediaPad X1 7.0 9 ID=HuaweiMediaPad 10 MIN_VERSION_LENGTH=8 11 MANUFACTURER=HUAWEI 12 TYPE=user 13 TAG=Build 14 TIME=1403853553000 15 FINGERPRINT=Huawei/MediaPad/hws8301l:4.2.2/HuaweiMediaPad/S8301uV1R1C233B009:user/release-keys 16 UNKNOWN=unknown 17 PRODUCT_8VOGUE=MediaPad M1 8.0 18 BOARD=BalongV9R1 19 VERSION_MAX_SIZE=30 20 properties={ro.build.internal.t.version=S8-301uV100R001C233B009-01, ro.build.cust.id=S8-301uV100R001C233B009, ro.build.operator.id=S8-301uV100R001C233B009} 21 PRODUCT=MediaPad 22 FilePath=/cust/hwver.properties 23 DISPLAY=S8-301uV100R001C233B009 24 USER=jslave 25 DEVICE=hws8301l 26 MODEL=MediaPad M1 8.0 27 BOOTLOADER=unknown 28 CPU_ABI=armeabi-v7a 29 PRODUCT_UNKNOWN=unknown 30 CPU_ABI2=armeabi 31 IS_DEBUGGABLE=false 32 SERIAL=A8Z6R14613000263 33 BRAND=Huawei 34 java.lang.NoClassDefFoundError: com/xxxx/t/utils/SecuritKeyUtil 35 at com.xxxx.t.act.LoadingAct.init(LoadingAct.java:162) 36 at com.xxxx.t.act.LoadingAct.handleOtherMessage(LoadingAct.java:537) 37 at com.xxxx.framework.bufferknife.FinalActivity$MHandler.handleMessage(FinalActivity.java:307) 38 at android.os.Handler.dispatchMessage(Handler.java:99) 39 at android.os.Looper.loop(Looper.java:137) 40 at android.app.ActivityThread.main(ActivityThread.java:5119) 41 at java.lang.reflect.Method.invokeNative(Native Method) 42 at java.lang.reflect.Method.invoke(Method.java:511) 43 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:834) 44 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 45 at dalvik.system.NativeStart.main(Native Method) 46 Caused by: java.lang.ClassNotFoundException: Didn't find class "com.xxxx.t.utils.SecuritUtil" on path: /data/app/com.xxxx.t-2.apk 47 at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:65) 48 at java.lang.ClassLoader.loadClass(ClassLoader.java:501) 49 at java.lang.ClassLoader.loadClass(ClassLoader.java:461) 50 ... 11 more 51 java.lang.ClassNotFoundException: Didn't find class "com.xxxx.t.utils.SecuritUtil" on path: /data/app/com.xxxx.t-2.apk 52 at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:65) 53 at java.lang.ClassLoader.loadClass(ClassLoader.java:501) 54 at java.lang.ClassLoader.loadClass(ClassLoader.java:461) 55 at com.xxxx.t.act.LoadingAct.init(LoadingAct.java:162) 56 at com.xxxx.t.act.LoadingAct.handleOtherMessage(LoadingAct.java:537) 57 at com.xxxx.framework.bufferknife.FinalActivity$MHandler.handleMessage(FinalActivity.java:307) 58 at android.os.Handler.dispatchMessage(Handler.java:99) 59 at android.os.Looper.loop(Looper.java:137) 60 at android.app.ActivityThread.main(ActivityThread.java:5119) 61 at java.lang.reflect.Method.invokeNative(Native Method) 62 at java.lang.reflect.Method.invoke(Method.java:511) 63 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:834) 64 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 65 at dalvik.system.NativeStart.main(Native Method)
在添加jniLibs/arm64-v8a
jniLibs/armeabi-v7a
jniLibs/x86
jniLibs/mips64
jniLibs/x86_64
jniLibs/mips
后,加载so文件就报错。只有jniLibs/armeabi文件夹内有so文件。
https://www.zhihu.com/question/20148756
SQLcipher (different versions) works on one platform , but crash on other platform
http://gegaosong.iteye.com/blog/1745937
SQLCipher 3.3.1-2 aar does not create .so files for x64 architecture
2016-03-29
[Android] 关于Android的.so文件你所需要知道的
微信的安装包在只编译了armeabi,没有x86,arm64-v8a是如何运行在各种处理器的手机上的?
Android ndk-build ignoring APP_ABI := x86
Android.mk和Application.mk文件语法规范说明及举例