• 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
268 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 146 wizyt
pytanie zadane 13 czerwca 2018 w C# przez piotrsz109 Stary wyjadacz (13,730 p.)
0 głosów
1 odpowiedź 338 wizyt
pytanie zadane 29 kwietnia 2018 w Inne języki przez jegor377 Stary wyjadacz (13,230 p.)
0 głosów
0 odpowiedzi 447 wizyt
pytanie zadane 14 sierpnia 2019 w Java przez Anon LVL 1000 Użytkownik (690 p.)

92,832 zapytań

141,776 odpowiedzi

320,824 komentarzy

62,163 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

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!

...