① 为什么android的APK打包的时候要带上armv7或者x86的so库
因为,你在写程序的时候,其中的一些函数,使用了这些库中的文件,所以要带上才能正常使用
② Android中的armeabi、armeabi-v7a、arm64-v8a及x86的详解
一. lib和libs
放在lib中的是被reference的,放在libs中的是被include的。
放在libs中的文件会自动被编辑器所include。所以不要把API放到libs里去。
lib的内容是不会被打包到APK中,libs中的内容是会被打包进APK中
二. .so库
NDK编译出来的动态链接库。
一些重要的加密算法或者核心协议一般都用c写然后给java调用。这样可以避免反编译后查看到应用的源码。
三. .so库该如何存放
放置 .so 文件的正确姿势其实就两句话:
• 为了减小 apk 体积,只保留 armeabi 和 armeabi-v7a 两个文件夹,并保证这两个文件夹中 .so 数量一致
• 对只提供 armeabi 版本的第三方 .so,原样复制一份到 armeabi-v7a 文件夹
存放so的规则:
你应该尽可能的提供专为每个ABI优化过的.so文件,但要么全部支持,要么都不支持:你不应该混合着使用。你应该为每个ABI目录提供对应的.so文件。
四. libs下armeabi等的作用是什么
存放.so库,主要针对不同的设备兼容,也可以说是专门针对不同Android手机下CPU架构的兼容。
Android 设备的CPU类型(通常称为”ABIs”)
早期的Android系统几乎只支持ARMv5的CPU架构,后面发展到支持七种不同的CPU架构:ARMv5,ARMv7 (从2010年起),x86 (从2011年起),MIPS (从2012年起),ARMv8,MIPS64和x86_64 (从2014年起),每一种都关联着一个相应的ABI。
应用程序二进制接口(Application Binary Interface)定义了二进制文件(尤其是.so文件)如何运行在相应的系统平台上,从使用的指令集,内存对齐到可用的系统函数库。在Android 系统上,每一个CPU架构对应一个ABI:armeabi,armeabi-v7a,x86,mips,arm64- v8a,mips64,x86_64。
armeabi-v7a: 第7代及以上的 ARM 处理器。2011年以后生产的大部分Android设备都使用它.
arm64-v8a: 第8代、64位ARM处理器,很少设备,三星 Galaxy S6是其中之一。
armeabi: 第5代、第6代的ARM处理器,早期的手机用的比较多。
x86: 平板、模拟器用得比较多。
x86_64: 64位的平板。
如果项目只包含了 armeabi,那么在所有Android设备都可以运行;
如果项目只包含了 armeabi-v7a,除armeabi架构的设备外都可以运行;
如果项目只包含了 x86,那么armeabi架构和armeabi-v7a的Android设备是无法运行的; 如果同时包含了 armeabi, armeabi-v7a和x86,所有设备都可以运行,程序在运行的时候去加载不同平台对应的so,这是较为完美的一种解决方案,同时也会导致包变大。
最后,如果我们只想支持armeabi-v7a,那么需要在gradle中配置
因为默认情况下,打包后会自动生成armeabi 到 x86的所有文件夹。这就有可能导致一些x86的设备因为在x86文件夹下找不到so文件而崩溃。
③ 苹果的A7CPU 和安卓的ARMv7是一样的吗
苹果的A7CPU 和安卓的ARMv7是不一样的。苹果的A7CPU是自主研发的64位架构CPU,而安卓的是架构。只是一种生产工艺或技术。
架构,又名软件架构,是有关软件整体结构与组件的抽象描述,用于指导大型软件系统各个方面的设计。架构描述语言(ADL)用于描述软件的体系架构。现在已有多种架构描述语言,如Wright(由卡内基梅隆大学开发),Acme(由卡内基梅隆大学开发),C2(由UCI开发),Darwin(由伦敦帝国学院开发)。ADL的基本构成包括组件、连接器和配置。
④ Android APK 32位和64位 的区别
32位 对应的就是32位的操作系统,那么 64位 就是对应64位的操作系统。
armeabi: armv5架构和armv6架构(32位)
armeabi-v7a:armv7架构(32位)
armeabi-v8a:armv8架构(64位)
x86:x86架构(32位)
x86_64:x86_64架构(64位)
要确定应用是否包含 64位 库,最简单的方法就是检查APK文件的结构。在编译时,APK会与应用所需的所有原生库打包在一起。原生库会根据 ABI 而存储在不同的文件夹中。应用无需支持所有的64位架构,但对于支持的每种原生 32位架构,则应用都必须包含相应的 64位 架构
第一步:在AndroidStudio中检测APK
查看 lib 目录下是否有支持64位架构的 .so 文件。如果没有支持 32位 或者 64位 的就在 build.gradle — defaultConfig 中配置一下添加所需要的库,重新打包。
感觉有用的同学,动动小手指给个赞,码字不易。
⑤ 手机型号MI-ONE Plus 版本Android2.3.6 cpu型号:ARMv7 processor rev 10 (v71) cpu核心数:单核
的Exynos 4212 Cortex-A9ARM的
32 nm1.5 GHz双核心双核ARM的Mali-400 MP4 _at_ 400MHzExynos 441232nm1.4 GHz四核心四核心ARM的Mali-400 Cortex-A9ARM的MP4 @ MP4 @ 400MHz的
应该是没有问题的,这
4412四核
procts4quad。“目标=”_blank“> http://www.samsung.com/global/business/semiconctor/minisite/Exynos/procts4quad.html
⑥ qt输出安卓程序设置
1.新建一个普通Widgets的工程
?2.选择Desktep Qt5.9.3 MinGW 32bit编译器和Android for armeabi-v7a (GCC 4.9, Qt 5.9.3 for Android armv7)编译器
?3.然后选择默认的就行
?4.在mainwindow.ui界面上,放入两个按钮,分别命名为发布和订阅
?5.选择MinGW 32bit的debug编译模式,构建和运行
?6.选择Android的debug模式重新构建,构建完后,在工程同目录下,生产一个build-AndroidTest3-Android_for_armeabi_v7a_GCC_4_9_Qt_5_9_3_for_Android_armv7-Debug文件夹,在该生产的文件的android-buildin目录下,会生成该项目的APK
?7.点击运行按钮,在弹出框中选择AVDVertualDevice安卓仿真器,如果没有则点击【Creat Android Virtual Device】按钮新建一个。
?8.点击【ok】按钮后,等待安卓虚拟机启动一段时间,会弹出如下界面:(注意:要等安卓虚拟机完全开机完后,才会自动运行刚才的apk程序,第一次启动可能需要4-5分钟左右,如果需要持续调试,可以不用关闭该安卓虚拟机)
?9.如果刚才生产的apk没有自动启动的话,可以把刚才生产的apk丢进安卓虚拟机中进行测试
⑦ android开发libs下的armeabi、armeabi-v7a、arm64-v8a等及导入so所踩过的坑
项目中需要使用第三方的sdk,集成完成后在小米4设备上能够正常运行,但在三星S6上面运行的时候crash,日志如下:
Android 设备的CPU类型(通常称为”ABIs”)
早期的Android系统几乎只支持ARMv5的CPU架构,现在可以支持七种不同的CPU架构:ARMv5,ARMv7 (从2010年起),x86 (从2011年起),MIPS (从2012年起),ARMv8,MIPS64和x86_64 (从2014年起),每一种都关联着一个相应的ABI。 应用程序二进制接口定义了二进制文件(尤其是.so文件)如何运行在相应的系统平台上,从使用的指令集,内存对齐到可用的系统函数库。在Android 系统上,每一个CPU架构对应一个ABI:armeabi,armeabi-v7a,x86,mips,arm64- v8a,mips64,x86_64。
各版本分析如下:
mips / mips64: 极少用于手机可以忽略
x86 / x86_64: x86 架构的手机都会包含由 Intel 提供的称为 Houdini 的指令集动态转码工具,实现 对 arm .so 的兼容,再考虑 x86 1% 以下的市场占有率,x86 相关的两个 .so 也是可以忽略的
armeabi: ARM v5 这是相当老旧的一个版本,缺少对浮点数计算的硬件支持,在需要大量计算时有性能瓶颈
armeabi-v7a: ARM v7 目前主流版本
arm64-v8a: 64位支持
所谓的ARMv8架构,就是在MIPS64架构上增加了ARMv7架构中已经拥有的的TrustZone技术、虚拟化技术及NEON advanced SIMD技术等特性,研发成的。
PS:在2011年11月,ARM公司发布了新一代处理器64位架构ARMv8的部分技术细节(也就是我们常说的Cortex-A57A53),代表着未来移动处理器迈入64位行列。我们得明确一点,ARM公司自己本身并没有64位芯片设计技术,他是通过了收购MIPS64处理器架构的部分技术使用权,再结合ARM的一些特性设计出来的。也就是说:MIPS、ARM、X86三大架构中,唯一没有64位技术的ARM,通过收购MIPS的形式得到了64位。
介绍参考资源如下:
http://www.jianshu.com/p/34ee91ae5547
宝剑锋从磨砺出,梅花香自苦寒来
⑧ 【Android开发学Flutter】Xcode编译问题汇总
Xcode编译经常遇到各种问题,处理起来费时费力,挺打击学习积极性的。记录下这些问题,方便自己也帮助后来人。
编译的时候遇到:
网上有很多解决方法,我是用这个方法解决的:
编译的时候遇到:
解决办法:
Project -> User-Defined -> FLUTTER_ROOT 改成本地 flutter SDK路径
感谢 issues 上的小哥,给你个🚀
在项目目录下执行 flutter run 可以正常运行到手机,但是在Xcode build 还是有问题。
这时需要手动添加 FLUTTER_ROOT 到 User-Defined :
添加之后:
就可以正常在Xcode build 安装到手机了。
flutter build ios 后出现:
pod install 后出现:
解决办法:
这是因为terminal没有走代理的流量,
使用 git config --global http.proxy "localhost:port" ,设置代理。
port是端口号,根据不同的vpn不一样,我的端口是10080。
执行 git config --global http.proxy "localhost:10080"
Xcode build 的时候出现:
解决办法:打开 ios/Podflie 文件:
关于 bitcode 的问题,我检查了下用到的第三方SDK,应该是网络地图的问题,我引入了个第三方插件(吐槽下没官方插件),网络地图有支持和不支持 bitcode 的两个SDK,我取消这个插件就没有报这个错了,奇怪的是,再次引入同一个插件,也可以正常打包,所以说这个问题还没有完全解决。
大家可以试下这个处理方法:
TARGETS -> Build Seettings 搜 arm ,试一下把其他删除,只留下armv7跟armv7s或者只留下armv7
解决办法:
https://www.jianshu.com/p/201df7e9a52f
我是clean Xcode之后就可以了
解决办法:
用的是P12证书,改成手动签名:
⑨ cpu型号ARMv7 运行内存814mb安卓系统2.3.4能否升级到安卓4.0
亲,您好,,天语小黄蜂(型号:天语w619)是一款由中国天语集团(K-Touch)于2012年4月25日联手阿里巴巴和中国联通发布的一款Android智能手机,定位入门级市场。该机初始搭载了阿里巴巴最新的阿里云2012操作系统(后发布了原生Android2.3.7),并且使用了512MB的双内存和800Mhz高通7225A(ARMv7)处理器,售价仅为599元左右,是当前599元价位以内Android手机中最具性价比的手机。 联想A750是联想(Lenovo)于2012年3月推出的一款Android智能手机。该机采用了一块4英寸(800*480分辨率)的电容屏,一颗频率为1Ghz的MT6575处理器,内置加强过的PowerVR SGX531 Pro图像处理芯片、512MB的RAM以及4G的ROM,拥有2000毫安的大容量电池,搭载Android2.3系统,未来还能升级为4.0系统,并且支持双卡双待。该机拥有前置30万摄像头以及后置500万摄像头,整体性能是目前所有千元安卓智能机中最强大的。上市仅仅10天便达到50万台的销售量,是当前千元价位以内Android手机中极具性价比的手机之一。 有人会问,为什么我介绍手机给别人至介绍一款,我认为既然这是最好的,性价比最高的,那为什么还要误导亲们呢,为什么要把不如他的介绍给亲呢,我的解答就如同我们团队的宗旨,专业为您。
⑩ 说说Android项目中的armeabi,armeabi-v7a和x86
这三者都表示的是CPU类型,早期的Android系统几乎只支持ARMv5的CPU架构,但是现在已经有7种了。ARMv5,ARMv7 (从2010年起),x86 (从2011年起),MIPS (从2012年起),ARMv8,MIPS64和x86_64 (从2014年起),每一种都关联着一个相应的ABI(应用程序二进制接口(ApplicationBinary Interface)定义了二进制文件(尤其是.so文件)如何运行在相应的系统平台上,从使用的指令集,内存对齐到可用的系统函数库)。Android现在的主流CPU是armeabi-v7a。armeabi-v7a是针对有浮点运算或高级扩展功能的ARMv7 CPU。
当一个应用安装在设备上,只有该设备支持的CPU架构对应的.so文件会被安装。不同CPU架构的Android手机加载时会在libs下找自己对应的目录,从对应的目录下寻找需要的.so文件;如果没有对应的目录,就会去armeabi下去寻找,如果已经有对应的目录,但是如果没有找到对应的.so文件,也不会去armeabi下去寻找了。
以x86设备为例,x86设备会在项目中的 libs文件夹寻找是否含有x86文件夹,如果含有x86文件夹,则默认为该项目有x86对应的so可运行文件,只有x86文件夹而文件夹下没有so,程序运行也是会出现findlibrary returned null的错误的;如果工程本身不含有x86文件夹,则会寻找armeabi或者armeabi-v7a文件夹,兼容运行。以armeabi-v7a设备为例,该Android设备当然优先寻找libs目录下的armeabi-v7a文件夹,同样,如果只有armeabi-v7a文件夹而没有 so也是会报错的;如果找不到armeabi-v7a文件夹,则寻找armeabi文件夹,兼容运行该文件夹下的so,但是不能兼容运行x86的so。所以项目中如果只含有x86的so,在armeabi和armeabi-v7a也是无法运行的。以上就是不同CPU架构运行时加载so的策略。
目前主流的Android设备是armeabi-v7a架构的,然后就是x86和armeabi了。如果同时包含了 armeabi,armeabi-v7a和x86,所有设备都可以运行,程序在运行的时候去加载不同平台对应的so,这是较为完美的一种解决方案,但是同时也会导致包变大。
armeabi-v7a是可以兼容armeabi的,而v7a的CPU支持硬件浮点运算,目前绝大对数设备已经是armeabi-v7a了,所以为了性能上的更优,就不要为了兼容放到armeabi下了。x86也是可以兼容armeabi平台运行的,另外需要指出的是,打出包的x86的so,总会比armeabi平台的体积更小,对于性能有洁癖的童鞋们,还是建议在打包so的时候支持x86。
第三方的类库只提供了armeabi下的.so文件,我们项目里适配了armeabi-v7a和x86,如果不在对应的文件下放对应的.so文件,就可能导致某些Android设备会出一些问题,我们可以复制armeabi下得.so文件到不同的文件夹下。如果第三方提供了不同平台的.so文件,则复制不同平台的.so文件到项目中对应的文件夹下即可。
关于.so文件之前有一个坑,svn会把提交的so文件过滤掉,在接第三方SDK的时候通过SVN更新了文档,但是没有注意到少了几个so文件,浪费了大把的时间去找原因。记得去掉svn对so的忽略!!!