小白问github项目哪些可以直接打包成apk

如题,目前只知道某些项目如JAVA和kotlin貌似可以直接打包成apk,但不知道具体怎样?比如某项目缺少什么文件或文件夹就不行,那么请问这些文件/文件夹是什么?是否能够自己解决?如果可行那么是否有化繁为简的方式?

接下来打包成apk还要签名,这用软件可以解决,但能否有可靠又免费的签名方式,就是安装时系统不会有安全问题提醒,就是像一般软件正常安装一样,

这种问题很复杂的,一般没有通解,需要结合具体情况分析。

您可以举一个具体的例子。

1 Like

还有这种只有发布版本却没有下载资源的:

“直接打包成apk”这个说法就怪怪的…
不是打包,是将源代码编译成可执行文件。为安卓手机开发的软件,自然就能编译成apk

你的问题实在过于空了,没法回答

怎么编译

每个项目都有不同的要求。需要阅读readme和相关文档

比如某项目缺少什么文件或文件夹就不行,那么请问这些文件/文件夹是什么?

同上。具体看编译时的报错

是否能够自己解决?

具体到每一个人无法分析。有的人自己就可以写一个系统内核,自己写驱动,缺什么都自己写。

如果可行那么是否有化繁为简的方式?

找作者给你发一个

可靠又免费的签名方式

安卓签名没什么要求,自己随便新建,不需要购买。

安装时系统不会有安全问题提醒

原生系统只要有签名就可以,个人建的签名也不会提示,只会在升级时会要求签名一致才能覆盖安装。但具体得看手机设备厂家,还是要具体分析。国内厂家的话,无法保证,除非你上架它们的应用商店

3 Likes

介绍里写了啊:

所以安卓apk应该去Android版的仓库下载!

前端仓库!!又不是安卓应用,怎么编译成apk???
前端你理解成网页就行了

1 Like

第一个项目(Winnie0408/SaltPlayerConverterFrontEnd),在 README 里面作者已经给出了比较详细的使用方法介绍,但需要一定的命令行基础。您可以试着学学。

第二个项目(guoq1/MagnetPlayer),上次更新已是 7 年前,而且看 issue 中的讨论,作者应该是没有意向提供 apk 文件,推测作者已经放弃该项目,该项目大概率不完善,而且其使用的各种技术可能已经过时,在当今的 Android 系统上可能无法正常运行。建议您放弃。

不是安卓软件…
docker用的

唉……

真小白呀 :doge:

我也是这么过来的

编译apk这个,其实属于会者不难,难者不会…大部分都是一样的套路

找几个有详细构建说明的,你自己按步骤做,然后就能通过实践学会怎么做了。

对于安卓软件,用Android Studio打开项目文件夹,然后 BuildGenerate Signed APK 按着提示做就行了…遇到问题再去搜解决方法

插问个问题,本人之前没搞过android开发,想问一下,android编译是只能用android studio来做么?有没有apk编译的docker镜像,可以在服务器上做编译?

有的 GitHub action 都能跑。

蛙知道github action 用的 apk编译的镜像是啥么?或者给个链接指个路?想抽时间在服务器上试试 apk 编译的

比如:

注意我没实际测试过(毕竟不是开发者,但我从 action 中下载过 apk

多谢,我抽空研究下这个(可能得过一段时间,最近超级忙。。

不急 :joy:

一般来说,kotlin/java的安卓项目都是用Gradle工具来构建的,只需要环境安装好java和Android SDK,然后运行Gradle就好(常用命令./gradlew assembleRelease)。签名就麻烦点了,需要自己先创建好签名密钥文件,然后用Android SDK带的工具签名;或者根据项目文件配置,把密钥文件放到指定位置之类的……

推荐Android Studio是因为它能直接帮你准备好环境,不用自己输命令,都是图形化的,最容易上手

github action的workflow文件参考
需要先在仓库secrets新建4个变量用于存储签名用的证书
下面yaml文件的86~89行:
SIGN_FILE_BASE64
KEY_ALIAS
KEYSTORE_PASSWORD
KEY_PASSWORD
详见GitHub - ilharp/sign-android-release: A GitHub action to sign an APK or AAB
运行时自己输入必要的就行:
image.png

name: Build Apk

on: 
  workflow_dispatch:
    inputs:
      java_version:
        required: true
        default: '17'
      repo:
        required: true
      ref:
        required: false
        default: ''
      submodules:
        required: true
        default: 'false'
      gradle_version:
        required: false
        default: 'wrapper'
      build_command:
        required: true
        default: './gradlew assembleRelease'

jobs:
  gradle:
    name: Gradle CI Build
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4
        with:
          repository: ${{ github.event.inputs.repo }}
          ref: ${{ github.event.inputs.ref }}
          fetch-depth: 0 
          
      - name: Checkout submodules
        if: ${{ github.event.inputs.submodules != 'false' }}
        run: git submodule update --init --recursive

      - name: Prepare Java
        uses: actions/setup-java@v4
        with:
          distribution: 'zulu'
          java-version: ${{ github.event.inputs.java_version }}
          java-package: jdk+fx

#       - uses: maxim-lobanov/setup-android-tools@v1
#         with:
#           packages: |
#             platform-tools
#             platforms;android-30
#             build-tools;30.0.2
#             ndk;22.1.7171670
#           cache: true

      - name: Build
        uses: gradle/actions/setup-gradle@v4
        with:
          gradle-version: ${{ github.event.inputs.gradle_version }}

      - name: Build project
        run: |
          chmod +x gradlew | true
          ${{ github.event.inputs.build_command }}
          
      - name: "Get apk's path"
        id: get_files
        uses: actions/github-script@v7
        with:
          script: |
            const path = require('path');
            const globber = await glob.create('**/*.apk');
            const files = await globber.glob();
            if ( files.length > 0 ) {
              const file = files[0];
              core.exportVariable( 'apk_path', file );
              core.exportVariable( 'apk_dir', path.dirname(file) );
            } else {
              core.setFailed(`Action failed because no apk found`);
            }
      - name: Sign APK
        id: sign_app
        uses: ilharp/sign-android-release@nightly
        with:
          releaseDir: ${{ env.apk_dir }}
          signingKey: ${{ secrets.SIGN_FILE_BASE64 }}
          keyAlias: ${{ secrets.KEY_ALIAS }}
          keyStorePassword: ${{ secrets.KEYSTORE_PASSWORD }}
          keyPassword: ${{ secrets.KEY_PASSWORD }}
      - name: Get Apk Info
        id: apk
        run: |
          find ${{ env.apk_dir }} -type f -name '*.apk' ! -name "*-signed.apk" | sudo xargs -I {} rm -f {}
          file=$(find ${{ env.apk_dir }} -type f -name "*-signed.apk" -print | head -n 1)
          find $ANDROID_SDK_ROOT/cmdline-tools/ -type f -name apkanalyzer | sudo xargs -I {} ln -s {} /usr/bin/apkanalyzer
          echo "version_name=$(apkanalyzer manifest version-name $file)" >> "$GITHUB_OUTPUT"
          echo "version_code=$(apkanalyzer manifest version-code $file)" >> "$GITHUB_OUTPUT"
          echo "application_id=$(apkanalyzer manifest application-id $file)" >> "$GITHUB_OUTPUT"
      - name: upload artifact
        uses: actions/upload-artifact@v4
        if: success()
        with:
          name: ${{steps.apk.outputs.application_id}}_${{steps.apk.outputs.version_name}}_${{steps.apk.outputs.version_code}}
          path: ${{ env.apk_dir }}/*.apk
1 Like

你自己研究吧,我又不是机器人给你自动回复……
而且这种陈年老项目,啥东西都不全的,不知道得费多大劲

1 Like