无法使用adb安装apk

问题描述 投票:0回答:1

伙计们! 我想使用 raylib 在 C 中创建一个简单的 HelloWorld 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.txt:

<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/
中: 我跑:

cmake -G "Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE=%ANDROID_NDK_HOME%\build\cmake\android.toolchain.cmake -DANDROID_ABI=arm64-v8a -DANDROID_PLATFORM=android-35 ..
make

-->

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

--> apk打包成功

然后我跑:

zipalign -v 4 HelloWorld-temp.apk 
HelloWorld.apk

--> apk 对齐成功

然后我跑:

apksigner sign --ks my-key.jks --ks-key-alias HelloWorld HelloWorld.apk

--> apk 已使用我之前生成的密钥成功签名。

然后我运行(通过 USB 连接我的手机):

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

android c apk adb raylib
1个回答
0
投票

您的 AndroidManifest.xml 缺少一个重要条目:

android:hasCode
。对于不包含 DEX 代码的 APK 文件(因此没有
classes.dex
文件),您必须在
android:hasCode="false"
中的
<application>
标签中设置
AndroidManifest.xml

应用程序是否包含任何DEX代码——即使用 Kotlin 或 Java 编程语言。如果确实如此,则为“true”并且 如果不是,则为“假”。当值为“false”时,系统不会尝试 启动组件时加载任何应用程序代码。默认值 是“真”。如果应用程序包含本机 (C/C++) 代码,但没有 DEX 代码,这应该设置为“false”。如果设置为“true”时APK 不包含 DEX 代码,应用程序可能无法加载。

https://developer.android.com/guide/topics/manifest/application-element#code

© www.soinside.com 2019 - 2024. All rights reserved.