• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Jak skompilować kod źródłowy aplikacji?

VPS Starter Arubacloud
+1 głos
223 wizyt
pytanie zadane 3 marca 2021 w Systemy operacyjne, programy przez Anedroid Obywatel (1,530 p.)

W repozytorium F-Droid są linki do kodów źródłowych aplikacji, ale po pobraniu takiego kodu z GitHuba nie umiem go skompilować do postaci pliku apk. Zawsze w takim kodzie znajduje się skrypt gradlew. Po jego odpaleniu pobiera z internetu jakiś zip, coś konfiguruje, po czym na koniec wyświetla błąd:

A problem occurred configuring project ':app'.
> SDK location not found. Define location with an ANDROID_SDK_ROOT environment variable or by setting the sdk.dir path in your project's local properties file at '/home/fkoperkiewicz/tasks/lo
cal.properties'.

android-sdk jest zainstalowany, jednak uruchomienie skryptu przez ANDROID_SDK_ROOT=/usr/lib/android-sdk ./gradlew również nie pomaga. Nie wyświetla się błąd, jest napisane że kompilacja zakończyła się sukcesem, a pliku apk nigdzie nie ma, tak samo classes.dex. Jest tylko katalog buildSrc/build, i tam są różne pliki i katalogi których nie rozumiem.

komentarz 5 marca 2021 przez Author[] Gaduła (3,130 p.)
Sprawdź kompilator i wersję którego używali, może zmiana kompilatora/ jego wersji pomoże?
komentarz 10 marca 2021 przez Anedroid Obywatel (1,530 p.)

Znalazłem w internecie taki oto skrypt do ręcznego kompilowania aplikacji: https://github.com/WanghongLin/miscellaneous/blob/master/tools/build-apk-manually.sh. Trochę go przerobiłem:

#!/bin/bash
ANDROID_SDK_ROOT=/usr/lib/android-sdk
_APK_BASENAME="Application"
_INTERMEDIATE="bin gen ${_APK_BASENAME}.apk.unaligned classes.dex"
_PLATFORM=$(ls $ANDROID_SDK_ROOT/platforms | sort -nr |tail -1)
_ANDROID_CP=$ANDROID_SDK_ROOT/platforms/$_PLATFORM/android.jar

clear
rm -rf $_INTERMEDIATE
mkdir bin gen

printf "> Generating R.java\n"
aapt package -f -m -J gen -M AndroidManifest.xml -S res -I $_ANDROID_CP # Tworzenie R.java

printf "\n> Compiling classes\n"
javac -classpath $_ANDROID_CP -sourcepath 'src:gen' -d 'bin' -target 1.7 -source 1.7 `find . -name "*.java"` # Kompilowanie klas Javy

printf "\n> Generating classes.dex\n"
$ANDROID_SDK_ROOT/build-tools/debian/dx --dex --output=classes.dex bin # Tworzenie classes.dex

printf "\n> Generating apk\n"
aapt package -f -M AndroidManifest.xml -S res -I $_ANDROID_CP -F $_APK_BASENAME.apk.unaligned # Tworzenie pliku apk (z resources.arsc)
aapt add $_APK_BASENAME.apk.unaligned classes.dex # Dodawanie classes.dex do apk

printf "\n> Signing\n"
jarsigner -keystore ~/.android/debug.keystore -storepass 'android' $_APK_BASENAME.apk.unaligned androiddebugkey # Podpisywanie apk

printf "\n> Zip alignment\n"
zipalign -f 4 $_APK_BASENAME.apk.unaligned $_APK_BASENAME-debug.apk # zip alignment (Application-debug.apk)

rm -rf $_INTERMEDIATE

printf "\n> Installing\n"
adb install $_APK_BASENAME-debug.apk

Potrafi skompilować prostą aplikację typu helloworld (https://github.com/anedroid/android-helloworld), ale nie potrafi skompilować kodów źródłowych innych aplikacji, jak com.termux, com.aurora.store, org.connectbot czy io.github.muntashirakon.AppManager.

Próbowałem dodać kolejną aktywność, ale kiedy w pliku java zaimportowałem klasę androidx.appcompat.app.AppCompatActivity, kompilator zaczął wywalać błąd:

...
> Compiling classes
warning: [options] bootstrap class path not set in conjunction with -source 7
./java/org/anedroid/testapp/Buttons.java:20: error: package androidx.appcompat.app does not exist
import androidx.appcompat.app.AppCompatActivity;
                             ^
./java/org/anedroid/testapp/Buttons.java:22: error: cannot find symbol
public class Buttons extends AppCompatActivity {
                             ^
  symbol: class AppCompatActivity
./java/org/anedroid/testapp/Buttons.java:23: error: cannot find symbol
        @override
         ^
  symbol:   class override
  location: class Buttons
./java/org/anedroid/testapp/Buttons.java:25: error: cannot find symbol
                super.onCreate(savedInstanceState);
                ^
  symbol:   variable super
  location: class Buttons
./java/org/anedroid/testapp/Buttons.java:26: error: cannot find symbol
                setContentView(R.layout.btn_activity);
                ^
  symbol:   method setContentView(int)
  location: class Buttons
./java/org/anedroid/testapp/Buttons.java:28: error: cannot find symbol
                if (getSupportActionBar() != null) {
                    ^
  symbol:   method getSupportActionBar()
  location: class Buttons
./java/org/anedroid/testapp/Buttons.java:29: error: cannot find symbol
                        getSupportActionBar().setHomeButtonEnabled(true);
                        ^
  symbol:   method getSupportActionBar()
  location: class Buttons
./java/org/anedroid/testapp/Buttons.java:30: error: cannot find symbol
                        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
                        ^
  symbol:   method getSupportActionBar()
  location: class Buttons
8 errors
1 warning
...

W katalogu /usr/lib/android-sdk/platforms/android-23/ znajdują się 2 pliki: android.jar i framework.aidl. Jak się okazuje, nie było tam klasy którą zaimportowałem. Chyba powinno tam być więcej plików z innymi klasami, albo android.jar jest przestarzały.

komentarz 10 marca 2021 przez Anedroid Obywatel (1,530 p.)

Pobrałem stąd: https://github.com/Sable/android-platforms android-25 i android-29 i zapisałem /usr/lib/android-sdk/platforms/. Zmieniłem wersję w skrypcie kompilującym. Nie pomogło.

komentarz 10 marca 2021 przez Anedroid Obywatel (1,530 p.)
edycja 29 marca 2021 przez Anedroid
Z tego co zrozumiałem, androidx to zewnętrzna biblioteka rozszerzeń, dołączana oddzielnie od systemu operacyjnego. To by oznaczało, że brakuje mi jakiegoś pliku jar z tą biblioteką, którą następnie w jakiś sposób zaimportuję do skryptu oprócz podstawowego android-29/android.jar. Jeżeli pójdzie dobrze, powinna działać także kompilacja innych aplikacji.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
0 odpowiedzi 137 wizyt
pytanie zadane 13 czerwca 2018 w C# przez piotrsz109 Stary wyjadacz (13,730 p.)
0 głosów
1 odpowiedź 325 wizyt
pytanie zadane 29 kwietnia 2018 w Inne języki przez jegor377 Stary wyjadacz (13,230 p.)
0 głosów
0 odpowiedzi 435 wizyt
pytanie zadane 14 sierpnia 2019 w Java przez Anon LVL 1000 Użytkownik (690 p.)

92,453 zapytań

141,262 odpowiedzi

319,086 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...