package manager service是怎样选择armeabi/armeabi-v7a中的库文件的?

本文探讨了Android应用如何在不同ABI(如ARMv5和ARMv7)间选择最佳机器码的问题。通过实例说明了如何正确配置Application.mk来生成对应的so文件,并放置于正确的目录中,以确保应用在不同设备上的兼容性和性能表现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android应用中使用到C代码,编译成so文件打包进apk的libs路径下。因为要支持ARMv5和ARMv7,libs下有armeabi和armeabi-v7a两个目录。安全的做法是编译库C代码时,Application.mk中打开,
APP_ABI := armeabi armeabi-v7a
编译生成的两份so文件各自放到项目工程的armeabi/armeabi-v7a目录中。有时还需要针对v7a平台编译支持NEON和不支持NEON的库。譬如这个例子,
in armeabi/: libp.so, libd.so, libvh.so, libvn.soin armeabi-v7a/: libp.so, libd.so, libd_neon.so, libvh.so, libvn.so
需要注意这一点:The 'armeabi-v7a' machine code will not run on ARMv5 or ARMv6 based devices.如果损失一些应用的性能是可以接受的,不希望保留库的两份拷贝,可以移除armeabi-v7a目录和其下的库文件,只保留armeabi目录。在安装应用时,行为是这样的,
When installing an application, the package manager service will scan the .apk and look for any shared library of the form:

lib/<primary-abi>/lib<name>.so

If one is found, then it is copied under $APPDIR/lib/lib.so, where $APPDIR corresponds to the application's specific data directory.If none is found, and a secondary ABI is defined, the service will then scan for shared libraries of the form:

lib/<secondary-abi>/lib<name>.so

If anything is found, then it is copied under $APPDIR/lib/lib.so.
什么是primary abi和secondary abi呢,
The Android system knows at runtime which ABI(s) it supports. More precisely, up to two build-specific system properties are used to indicate:the 'primary' ABI for the device, corresponding to the machine code used in the system image itself.an optional 'secondary' ABI, corresponding to another ABI that is also supported by the system image.For example, a typical ARMv5TE-based device would only define the primary ABI as 'armeabi' and not define a secondary one.On the other hand, a typical ARMv7-based device would define the primary ABI to 'armeabi-v7a' and the secondary one to 'armeabi' since it can run application native binaries generated for both of them.This mechanism ensures that the best machine code for the target device is automatically extracted from the package at installation time.
考虑这样一个情况,在打包apk时,armeabi-v7a目录下放了所需的部分so文件。还是上面那个例子,
in armeabi/: libp.so, libd.so, libvh.so, libvn.soin armeabi-v7a/: libd.so, libd_neon.so
如此,安装运行在v7a的设备上,会发生什么?尝试了一些手机和平板,CPU都是ARMv7的,Android都是4.x的。行为是拷贝以下库文件到$APPDIR/lib/目录下,
armeabi-v7a/libd.so, armeabi-v7a/libd_neon.so, armeabi/libp.so, armeabi/libvh.so, armeabi/libvn.so
符合特殊需求,libd对性能影响较大,针对ARMv7设备,使用armeabi-v7a的库,其他都使用armeabi的库。但是遇到在一台ARMv7+Android2.3.4的手机上,加载libp.so报错。再尝试另一台ARMv7+Android2.3.5的手机,一样的现象。针对这两台手机,如果打包apk时移除armeabi-v7a目录,不会报错。难道Android2.3的设备,package manager service的行为有异?
<think>好的,我现在需要解决用户在尝试使用apt install安装pigz和sdkmanager遇到的错误,具体是找不到归档文件的问题。用户可能是在Linux环境下,使用apt包管理器安装这些软件包遇到了问题。首先,我要理清楚错误的原因和可能的解决方法。 首先,用户提到的错误信息是“can't find an archive for it”,这通常意味着apt无法在配置的软件源中找到对应的软件包。这可能是因为软件包名称拼写错误,或者软件源中没有该软件包,或者软件源列表需要更新。另外,用户提到的sdkmanager可能指的是Android SDK Manager,而通常情况下,Android SDK工具并不是通过系统的包管理器(如apt)来安装的,而是通过Android Studio或手动下载SDK工具来安装的。这可能是一个误解,导致用户尝试用apt安装sdkmanager,但实际上应该通过其他方式获取。 接下来,我需要检查可能的解决方案: 1. **确认软件包名称是否正确**:用户是否拼写错误?例如,sdkmanager的正确包名可能不同,或者在Ubuntu/Debian中的名称可能不是sdkmanager。例如,Android SDK Manager通常通过Android Studio或命令行工具sdkmanager来管理,而sdkmanagerAndroid SDK的一部分,可能需要通过其他渠道安装。 2. **更新软件源列表**:用户是否运行了`sudo apt update`来更新本地软件包索引?有候旧的缓存可能导致找不到软件包。 3. **检查软件源配置**:用户是否添加了正确的软件源?例如,某些软件包可能位于universe、multiverse或第三方仓库中,需要确保这些仓库已启用。 4. **安装sdkmanager的正确方法**:如果用户确实需要Android SDK Manager,可能需要通过Android Studio或直接下载命令行工具来安装,而不是通过apt。例如,从Android开发者网站下载SDK工具包,并配置环境变量。 5. **pigz的安装问题**:pigz是一个并行gzip工具,通常在Ubuntu的仓库中存在。如果用户无法安装,可能是软件源的问题,或者网络问题导致无法下载。 另外,用户提到的引用内容中提到了Android SDK的配置问题,例如NDK未配置、AVD缺少Target API等,这可能表明用户正在尝试搭建Android开发环境。此,正确的方法应该是通过Android Studio的SDK Manager来安装所需组件,或者手动下载SDK工具。 总结可能的解决步骤: - **步骤1**:更新apt软件源,运行`sudo apt update`,确保软件列表是最新的。 - **步骤2**:确认pigz的包名正确,尝试安装:`sudo apt install pigz`。如果仍然出错,检查拼写或软件源是否包含该包。 - **步骤3**:sdkmanager可能无法通过apt安装,需要手动下载Android SDK工具。用户应访问Android开发者网站下载命令行工具,解压后运行sdkmanager来安装所需的SDK组件。 - **步骤4**:配置环境变量,将Android SDK的路径添加到PATH中,并设置ANDROID_HOME变量,如引用[3]所述。 - **步骤5**:如果用户需要特定版本的Android系统镜像(如armeabi),可能需要通过SDK Manager安装较旧版本的平台,如引用[2]提到的,安装低版本的组件。 这样,用户应该能够正确安装pigz,并通过正确的方式安装和配置Android SDK工具,包括sdkmanager,从而解决归档文件找不到的问题。</think>要解决`sdkmanager`重新安装出现的“无法找到归档文件”错误及`apt install pigz`的问题,请按照以下步骤操作: --- ### **步骤1:更新软件源列表** 运行以下命令更新APT软件源缓存,确保获取最新的软件包信息: ```bash sudo apt update ``` --- ### **步骤2:安装pigz** `pigz`是常见的压缩工具,通常包含在默认仓库中。直接安装: ```bash sudo apt install pigz ``` 如果报错,检查网络连接或更换软件源(如使用阿里云、清华镜像)[^3]。 --- ### **步骤3:正确安装Android SDK工具** **sdkmanager**属于Android SDK,无法通过`apt`直接安装。需手动下载并配置: 1. **下载命令行工具包** 访问[Android开发者网站](https://developer.android.com/studio#command-tools),下载适用于Linux的`commandlinetools-linux-*.zip`。 2. **解压并配置路径** 解压文件到指定目录(如`/usr/local/android-sdk`),并添加环境变量: ```bash echo 'export ANDROID_HOME=/usr/local/android-sdk' >> ~/.bashrc echo 'export PATH=$PATH:$ANDROID_HOME/cmdline-tools/latest/bin' >> ~/.bashrc source ~/.bashrc ``` 3. **安装SDK组件** 使用`sdkmanager`安装所需组件(如NDK): ```bash sdkmanager "ndk;25.1.8937393" # 示例安装NDK 25 ``` --- ### **步骤4:解决AVD缺少Target API的问题** 若需创建ARM架构的模拟器,需通过SDK Manager安装旧版本系统镜像: ```bash sdkmanager "system-images;android-25;default;armeabi-v7a" ``` 随后在Android Studio中创建AVD选择该镜像[^2]。 --- ### **总结问题根源** - **pigz安装失败**:软件源未更新或网络问题。 - **sdkmanager无法安装**:混淆了系统包管理器与Android SDK工具,需手动配置[^1][^3]。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值