You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

使用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>

操作流程

  1. 在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
  1. 用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
  1. zipalign对齐APK:
zipalign -v 4 HelloWorld-temp.apk HelloWorld.apk
  1. 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

火山引擎 最新活动