Sign in Join
Wiki copytemporary

Android Build APK/ru: what changed

Revision 2 to 3. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11Данная статья освещает способ как скомпилировать проект на FPC и загрузить его на андроид устройство.
22
33Подразумевается, что проект являет собой NDK библиотеку, которая загрузается в Java коде. Так же, данный способ не привязан к какому либо расширению IDE (например Android4Laz) и может использовать отдельно для произвольных проектов.
44
55## Требования
66
77- FPC (с готовыми [[Android/ru|Android rtl]] библиотеками).
88- JRE (Java-Run Time) - нужен для JDK, а так же, для запуска "java" машины (для исполнения утилит входящийх в состав Android SDK)
99- JDK (необходим для установки **javac**), JDK потребует установки JRE.
1010- Android NDK
1111- Android SDK
1212
1313Никаких дополнительнех средств сборкт (например ant) не требуется
1414
1515### Версия JRE/JDK
1616
1717На данный момент (зима 2017) официально доступна для скачивания только версия 8 (1.8). Ранее можно было скачать версию 7. Многие компоненты Android SDK привязаны к конкретной версии JDK.
1818
1919## Сборка
2020
21210\. Предполагается, что весь проект лежит в некоторой папке, например "mydemo". А все скрипты и утилиты для сборки под android находятся в "mydemo\android". Это имеет значение только на следующем шаге, где указан ключ -FE.
2222
23231\. необходимо скомпилировать проект (библиотеку). Командная строка (windows)может выглядеть таким образом.
2424
25-`C:\FPC\3.1.1\bin\i386-win32\fpc.exe ^`\
26-` -Tandroid -Parm -MDelphi ^`\
27-` -Scghi -CX -O3 -Xs -XX -l -vbq ^`\
28-` -FUlib\arm-android ^`\
29-` -oandroid\mydemo.so ^`\
30-` -FE.\android\files\lib\armeabi\ ^`\
31-` -CpARMv6 -CfVFPv2 -Xd -XParm-linux-androideabi- ^`\
32-` -FDC:\android\ndk-r11c\toolchains\arm-linux-androideabi-4.9\prebuilt\windows\bin  ^`\
33-` -FuC:\android\ndk-r11c\platforms\android-9\arch-arm\usr\lib ^`\
34-` mydemo.lpr`
25+```
26+C:\FPC\3.1.1\bin\i386-win32\fpc.exe ^
27+ -Tandroid -Parm -MDelphi ^
28+ -Scghi -CX -O3 -Xs -XX -l -vbq ^
29+ -FUlib\arm-android ^
30+ -oandroid\mydemo.so ^
31+ -FE.\android\files\lib\armeabi\ ^
32+ -CpARMv6 -CfVFPv2 -Xd -XParm-linux-androideabi- ^
33+ -FDC:\android\ndk-r11c\toolchains\arm-linux-androideabi-4.9\prebuilt\windows\bin ^
34+ -FuC:\android\ndk-r11c\platforms\android-9\arch-arm\usr\lib ^
35+ mydemo.lpr
36+```
3537
3638На что следует обратить внимание. Ключи
3739
3840- -FD - указывает путь, где хранятся утилиты сборки
3941- -XParm-linux-androideabi- - указывает префикс для утилит сборки
4042- -Fu - указывающие на библиотеки NDK - необходимы для компоновки
4143- -FE - указывает путь, куда следует записать созданную библиотеку. Конечная директория в данном случае указана как "lib\armeabi". Этот путь будет сохранится в самом apk. Он должен быть именно таким, т.к. он привязан к целевой архитектуре (arm). Для arm64 или arm7 путь должен быть иным. Все сторонние динамические библиотеки для ARM архитектуры, так же должны находится в папке lib\armeabi.
4244
43452\. подготовить файл-манифест AndroidManifest.xml
4446
45473\. создать .apk файл
4648
47-`set buildtoolsdir=C:\android\sdk-windows\build-tools\23.0.3`\
48-`set APP_NAME=testapp`\
49-`set APK_SDK_PLATFORM=C:\android\sdk-windows\platforms\android-11`\
49+```
50+set buildtoolsdir=C:\android\sdk-windows\build-tools\23.0.3
51+set APP_NAME=testapp
52+set APK_SDK_PLATFORM=C:\android\sdk-windows\platforms\android-11
5053
51-`rem -S res - fails, if "res" directory doesn't exist`\
52-`rem enerate-dependencies is needed to generate R.java file`\
53-`%buildtoolsdir%\aapt p -v -f -M AndroidManifest.xml ^`\
54-`  -F bin\%APP_NAME%.ap_ ^`\
55-`  --generate-dependencies ^`\
56-`  -I %APK_SDK_PLATFORM%\android.jar -S res -m -J gen ^`\
57-`  files`
54+rem -S res - fails, if "res" directory doesn't exist
55+rem enerate-dependencies is needed to generate R.java file
56+%buildtoolsdir%\aapt p -v -f -M AndroidManifest.xml ^
57+ -F bin\%APP_NAME%.ap_ ^
58+ --generate-dependencies ^
59+ -I %APK_SDK_PLATFORM%\android.jar -S res -m -J gen ^
60+ files
61+```
5862
5963утилита создаёт файл начальный .apk файл (-F bin\\%APP_NAME%.ap_ - расширение указано как "ap_" намеренно, т.к. это не итоговый файл), а так же R.java файл в папке "gen" (-J gen). При создании apk (по сути .zip) файла, будут включена папка "files". (на шаге №1 в неё был скопилированы библиотека "-FE.\android\files\lib\armeabi\\", таким образом "lib\armeabi\mydemo.so" попадёт в apk файл) "-S" указывает папку со стандартными андроид ресурсами (иконки и layout xml-ы), папка будет скопирована в .apk
6064
6165Структура сгенерированного .apk файла будет выглядеть так:
6266
63-`AndroidManifest.xml `\
64-`resources.arsc`\
65-`res`\
66-`lib`\
67-`lib\armeabi`\
68-`...все другие папки/файлы которые были расположены в "files"`
67+```
68+AndroidManifest.xml
69+resources.arsc
70+res
71+lib
72+lib\armeabi
73+...все другие папки/файлы которые были расположены в "files"
74+```
6975
7076Если у программы есть какие-либо ресусрные файлы, то они должны быть добавлены в "files" непосредственно ПЕРЕД вызовом "aapt". Копировать их в "files" тоже не обязательно (как и использовать папку "files"), т.к. можно указать несколько папок-источников, например так:
7177
72-`%buildtoolsdir%\aapt ... ^`\
73-`  dir1 dir2 dir3`\
74-` `
78+```
79+%buildtoolsdir%\aapt ... ^
80+ dir1 dir2 dir3
81+```
7582
76834\. скомпилировать Java код основной программы
7784
78-`set jdkbindir=C:\Program Files\Java\jdk1.7.0_25\bin`\
79-`set androidjar=C:\android\sdk-windows\platforms\android-11\android.jar `\
85+``` pascal
86+set jdkbindir=C:\Program Files\Java\jdk1.7.0_25\bin
87+set androidjar=C:\android\sdk-windows\platforms\android-11\android.jar
8088
81-`"%jdkbindir%\javac.exe" ^`\
82-`  .\zengl\android\ZenGL.java ^`\
83-`  .\zengl\demo01\Demo01Activity.java ^`\
84-`  -cp "%androidjar%" ^`\
85-`  -d .\classes`
89+"%jdkbindir%\javac.exe" ^
90+ .\zengl\android\ZenGL.java ^
91+ .\zengl\demo01\Demo01Activity.java ^
92+ -cp "%androidjar%" ^
93+ -d .\classes
94+```
8695
8796Важно - указать "-cp" (class-path) для используемой Андроид-СДК. Компилятор java, как и сам jdk, ничего об андроид системе не знают. А компилируемая программа, будет использовать классы SDK. По-этому если class-path не указать, то будут сыпаться ошибки о том, что не объявлен класс и т.д. -d - указывает путь, куда положить скомпилированные .class файлы, они необходимы на следующем шаге.
8897
8998- На дальнейшем шаге скомпилированный код, должен быть преобразован в Dalvik. Возможно, что версия "dx.jar" ожидаен классы версии 1.7, а не 1.8 (которую вы можете использовать). В этом случае, необходимо javac необходимо указать версию совместимости:
9099
91-`set jdkbindir=C:\Program Files\Java\jdk1.8.0_25\bin`\
92-`set androidjar=C:\android\sdk-windows\platforms\android-11\android.jar `\
100+``` pascal
101+set jdkbindir=C:\Program Files\Java\jdk1.8.0_25\bin
102+set androidjar=C:\android\sdk-windows\platforms\android-11\android.jar
93103
94-`"%jdkbindir%\javac.exe" ^`\
95-`  .\zengl\android\ZenGL.java ^`\
96-`  .\zengl\demo01\Demo01Activity.java ^`\
97-`  -cp "%androidjar%" ^`\
98-`  -d .\classes -target 1.7 -source 1.7`
104+"%jdkbindir%\javac.exe" ^
105+ .\zengl\android\ZenGL.java ^
106+ .\zengl\demo01\Demo01Activity.java ^
107+ -cp "%androidjar%" ^
108+ -d .\classes -target 1.7 -source 1.7
109+```
99110
1001115\. сконвертировать Java код в dalvik
101112
102-`SET DX_PATH=C:\android\sdk-windows\build-tools\23.0.3\lib`\
113+```
114+SET DX_PATH=C:\android\sdk-windows\build-tools\23.0.3\lib
103115
104-`java -Djava.ext.dirs=%DX_PATH%\ -jar %DX_PATH%\dx.jar --dex --verbose --output=.\bin\classes.dex .\classes`
116+java -Djava.ext.dirs=%DX_PATH%\ -jar %DX_PATH%\dx.jar --dex --verbose --output=.\bin\classes.dex .\classes
117+```
105118
106119Конвертирация java-класс файлов в далвик файлы.
107120
1081216\. создать не подписанный .apk файл, добавив dalvik класс-файлы
109122
110-`set jdkdir=C:\Program Files\Java\jdk1.7.0_25\bin`\
111-`set ANDROID_HOME=C:\android\sdk-windows`\
112-`set APK_PROJECT_PATH=.`\
113-`set APP_NAME=testapp`\
123+``` pascal
124+set jdkdir=C:\Program Files\Java\jdk1.7.0_25\bin
125+set ANDROID_HOME=C:\android\sdk-windows
126+set APK_PROJECT_PATH=.
127+set APP_NAME=testapp
114128
115-`del %APK_PROJECT_PATH%\bin\%APP_NAME%-unsigned.apk`\
116-`"%jdkdir%\java" -classpath %ANDROID_HOME%\tools\lib\sdklib.jar ^`\
117-`  com.android.sdklib.build.ApkBuilderMain ^`\
118-`  %APK_PROJECT_PATH%\bin\%APP_NAME%-unsigned.apk -v -u ^`\
119-`  -z %APK_PROJECT_PATH%\bin\%APP_NAME%.ap_ ^`\
120-`  -f %APK_PROJECT_PATH%\bin\classes.dex`
129+del %APK_PROJECT_PATH%\bin\%APP_NAME%-unsigned.apk
130+"%jdkdir%\java" -classpath %ANDROID_HOME%\tools\lib\sdklib.jar ^
131+ com.android.sdklib.build.ApkBuilderMain ^
132+ %APK_PROJECT_PATH%\bin\%APP_NAME%-unsigned.apk -v -u ^
133+ -z %APK_PROJECT_PATH%\bin\%APP_NAME%.ap_ ^
134+ -f %APK_PROJECT_PATH%\bin\classes.dex
135+```
121136
122137На момент написания скрипта, отдельной утилиты для добавления classes.dex в .apk файл не было... Но здесь происходит вызов вызов ApkBuilderMain (через вызов java машины). Единственное что он делает, это добавляет classes.dex (созданный на шаге №5) в корневую папку существующего .apk файла (созданного на шаге №3 .ap_) и записывает в файл -unsigned.apk. Обычная zip утилита (например 7z), скорей всего, справилась бы не хуже.
123138
1241397\. Подписать .apk файл. Внимание! данный скрипт генерирует новый само-подписанный ключ каждый раз. Программа загружаемая на Google Play должна использовать настоящий ключ (это так же важно при дальнейшем обновлении программы)
125140
126-`set jdkbindir=C:\Program Files\Java\jdk1.7.0_25\bin`\
127-`set APP_NAME=testapp`\
141+``` pascal
142+set jdkbindir=C:\Program Files\Java\jdk1.7.0_25\bin
143+set APP_NAME=testapp
128144
129-`REM Generating on the fly a debug key`\
130-`"%jdkbindir%\keytool" -genkeypair -v -keystore bin\LCLDebugBKKey.keystore -alias LCLDebugBKKey ^`\
131-`  -keyalg RSA -validity 10000 ^`\
132-`  -dname "cn=Havefunsoft, o=company, c=US" ^`\
133-`  -storepass "123456" -keypass "123456" -keysize 2048`\
145+REM Generating on the fly a debug key
146+"%jdkbindir%\keytool" -genkeypair -v -keystore bin\LCLDebugBKKey.keystore -alias LCLDebugBKKey ^
147+ -keyalg RSA -validity 10000 ^
148+ -dname "cn=Havefunsoft, o=company, c=US" ^
149+ -storepass "123456" -keypass "123456" -keysize 2048
134150
135-`REM Signing the APK with a debug key`\
136-`del bin\%APP_NAME%-unaligned.apk`\
137-`"%jdkbindir%\jarsigner" -verbose ^`\
138-`  -sigalg SHA1withRSA ^`\
139-`  -digestalg SHA1 ^`\
140-`  -keystore bin\LCLDebugBKKey.keystore -keypass 123456 -storepass 123456 ^`\
141-`  -signedjar bin\%APP_NAME%-unaligned.apk bin\%APP_NAME%-unsigned.apk LCLDebugBKKey`
151+REM Signing the APK with a debug key
152+del bin\%APP_NAME%-unaligned.apk
153+"%jdkbindir%\jarsigner" -verbose ^
154+ -sigalg SHA1withRSA ^
155+ -digestalg SHA1 ^
156+ -keystore bin\LCLDebugBKKey.keystore -keypass 123456 -storepass 123456 ^
157+ -signedjar bin\%APP_NAME%-unaligned.apk bin\%APP_NAME%-unsigned.apk LCLDebugBKKey
158+```
142159
1431607.1 проверка подписи. (шаг опциональный)
144161
145-`set jdkbindir=C:\Program Files\Java\jdk1.7.0_25\bin`\
146-`set APP_NAME=testapp`\
162+``` pascal
163+set jdkbindir=C:\Program Files\Java\jdk1.7.0_25\bin
164+set APP_NAME=testapp
147165
148-`REM Signing the APK with a debug key`\
149-`"%jdkbindir%\jarsigner" -verify -verbose -certs bin\%APP_NAME%-unaligned.apk`
166+REM Signing the APK with a debug key
167+"%jdkbindir%\jarsigner" -verify -verbose -certs bin\%APP_NAME%-unaligned.apk
168+```
150169
1511708\. Выровнять результирующий .apk. (Выравнивние должно происходить ПОСЛЕ подписи, т.к. подпись делает apk файл не выровнянным)
152171
153-`set APP_NAME=testapp`\
154-`set buildtoolsdir=C:\android\sdk-windows\build-tools\23.0.3`\
172+```
173+set APP_NAME=testapp
174+set buildtoolsdir=C:\android\sdk-windows\build-tools\23.0.3
155175
156-`REM Align the final APK package`\
157-`%buildtoolsdir%\zipalign -v 4 bin\%APP_NAME%-unaligned.apk bin\%APP_NAME%.apk`
176+REM Align the final APK package
177+%buildtoolsdir%\zipalign -v 4 bin\%APP_NAME%-unaligned.apk bin\%APP_NAME%.apk
178+```
158179
159180По завершению 8-ого шага, результирующий .apk файл может быть загружен непосредственно на устройство.
160181
1611829\. Загрузка любой .apk файл можно загрузить на устройство, если оно подлюкчено по USB и на нём разрешены права разработчика. В состав SDK входит утилита adb, которая позволяет удалить приложение и установить новый .apk. (Если приложение уже установлено, то новый .apk загружен не будет, и предварительно его нужно удалять с помощью uninstall)
162183
163-`C:\android\sdk-windows\platform-tools\adb.exe uninstall zengl.demo01`\
164-`C:\android\sdk-windows\platform-tools\adb.exe install bin\testapp.apk`
184+```
185+C:\android\sdk-windows\platform-tools\adb.exe uninstall zengl.demo01
186+C:\android\sdk-windows\platform-tools\adb.exe install bin\testapp.apk
187+```
165188
166189## Смотри также
167190
168191- [[Android/ru|Кросс-компилятор]] инструкции по сборке кросс-компилятора на Андроид
169192
170193---
171194*From the Free Pascal wiki, page "Android Build APK/ru", as it stood on 2020-08-06 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*
172195Category: Android/ru
173196Category: FPC

Back to history