使用raylib开发C语言HelloWorld APK遇adb安装失败问题求助
问题:Raylib C语言开发HelloWorld APK安装失败(INSTALL_FAILED_INVALID_APK)
项目结构
HelloWorld/ ├── CMakeLists.txt ├── src/ │ ├── main.c ├── android/ │ └── AndroidManifest.xml └── build/
源码文件
src/main.c
#include <raylib.h> int main(void) { InitWindow(800, 600, "My App"); while (!WindowShouldClose()) { BeginDrawing(); ClearBackground(RAYWHITE); DrawText("Hello, World!", 190, 200, 20, LIGHTGRAY); EndDrawing(); } CloseWindow(); }
CMakeLists.txt
# Minimun version of CMake required to build the project cmake_minimum_required(VERSION 3.5) # Define the project name project(HelloWorld) # Specify the path of raylib headers include_directories($ENV{RAYLIB_ANDROID}/include) # Compile C code into a shared library add_library(hello_world SHARED src/main.c) # Import raylib add_library(raylib STATIC IMPORTED) # Specify the path of raylib set_target_properties(raylib PROPERTIES IMPORTED_LOCATION $ENV{RAYLIB_ANDROID}/lib/arm64/libraylib.a) # Link with necessary libraries target_link_libraries(hello_world raylib android log EGL GLESv2)
android/AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.oussamateyib.helloworld" android:versionCode="1" android:versionName="1.0.0"> <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="35" /> <application android:label="Hello World"> <activity android:name="android.app.NativeActivity" android:label="Hello World" android:configChanges="orientation|keyboardHidden|screenSize" android:exported="true"> <meta-data android:name="android.app.lib_name" android:value="hello_world" /> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
操作流程
- 在build目录编译生成
libhello_world.so,并复制到lib/arm64-v8a子目录:
cmake -G "Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE=%ANDROID_NDK_HOME%\build\cmake\android.toolchain.cmake -DANDROID_ABI=arm64-v8a -DANDROID_PLATFORM=android-35 .. make
- 用aapt打包并添加SO文件:
aapt package -f -m -F HelloWorld-temp.apk -M ../android/AndroidManifest.xml -I %ANDROID_HOME%/platforms/android-35/android.jar
aapt add HelloWorld-temp.apk lib/arm64-v8a/libhello_world.so
- zipalign对齐APK:
zipalign -v 4 HelloWorld-temp.apk HelloWorld.apk
- apksigner签名:
apksigner sign --ks my-key.jks --ks-key-alias HelloWorld HelloWorld.apk
错误信息
执行adb install HelloWorld.apk后返回:
Performing Incremental Install Serving... All files should be loaded. Notifying the device. Failure [INSTALL_FAILED_INVALID_APK: Scanning Failed.: Package /data/app/~~KjqkABJbYD3SKFrJm_qwcQ==/com.oussamateyib.helloworld-rmQUIQxHLXKSuzm4eo3fuw==/base.apk code is missing]
设备ABI为arm64-v8a,寻求解决办法。
解决方案
1. 验证APK内SO文件路径
用unzip -l HelloWorld.apk查看APK内部结构,确认libhello_world.so的路径是lib/arm64-v8a/libhello_world.so,无多余层级或路径错误。如果路径不符,重新整理本地lib目录结构后再执行aapt add命令。
2. 修正CMake编译配置
在CMakeLists.txt中为目标库添加Android专属属性,确保生成的SO符合平台规范:
set_target_properties(hello_world PROPERTIES ANDROID_PACKAGE_NAME "com.oussamateyib.helloworld" ANDROID_ABI "arm64-v8a" )
同时确认导入的libraylib.a是针对Android arm64-v8a架构编译的静态库,避免架构不匹配。
3. 更换为aapt2打包(推荐)
旧版aapt可能存在兼容性问题,改用aapt2重新打包:
# 若有res资源目录,先编译资源(无则跳过) aapt2 compile --dir ../android/res -o res.zip # 链接资源生成基础APK aapt2 link -o HelloWorld-temp.apk --manifest ../android/AndroidManifest.xml -I %ANDROID_HOME%/platforms/android-35/android.jar --auto-add-overlay # 添加SO文件 aapt add HelloWorld-temp.apk lib/arm64-v8a/libhello_world.so
4. 重新执行完整流程(清除缓存)
删除旧build目录和APK文件,从头执行编译、打包、对齐、签名,避免缓存干扰:
rm -rf build/* cd build cmake -G "Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE=%ANDROID_NDK_HOME%\build\cmake\android.toolchain.cmake -DANDROID_ABI=arm64-v8a -DANDROID_PLATFORM=android-35 .. make mkdir -p lib/arm64-v8a cp libhello_world.so lib/arm64-v8a/ # 重新打包 aapt package -f -m -F HelloWorld-temp.apk -M ../android/AndroidManifest.xml -I %ANDROID_HOME%/platforms/android-35/android.jar aapt add HelloWorld-temp.apk lib/arm64-v8a/libhello_world.so zipalign -v 4 HelloWorld-temp.apk HelloWorld.apk apksigner sign --ks my-key.jks --ks-key-alias HelloWorld HelloWorld.apk # 先卸载旧版本再安装 adb uninstall com.oussamateyib.helloworld adb install HelloWorld.apk
5. 检查SO文件架构有效性
用readelf确认SO文件的架构与设备匹配:
readelf -h libhello_world.so | grep Class # 正确输出应为:Class: ELF64
内容的提问来源于stack exchange,提问作者OussamaTeyib




