Автор |
Сообщение |
|
|
Заголовок сообщения: |
Re: Блог программиста любителя |
 |
|
WARNING!!! Предыдущий пример не будет работать с build-tools поздних версий, в частности build-tools 34.0.0 и android-33 Там нет утилиты dx Вместо нее утилита d8 с другими параметрами. Помучавшись, удалось скомпилировать проект, но пока на телефон не устанавливал. Решил отложить разбирательство с d8 и пока пользоваться более старыми версиями.
Поэтому скачиваем старые пакеты
sdkmanager --sdk_root=path_to_SDK "platforms;android-28" sdkmanager --sdk_root=path_to_SDK "build-tools;30.0.2"
Временно отказавшись от новейших средств, в плане эффективности вряд ли чего то потеряем
WARNING!!! Предыдущий пример не будет работать с build-tools поздних версий, в частности build-tools 34.0.0 и android-33 Там нет утилиты [b]dx[/b] Вместо нее утилита d8 с другими параметрами. Помучавшись, удалось скомпилировать проект, но пока на телефон не устанавливал. Решил отложить разбирательство с d8 и пока пользоваться более старыми версиями.
Поэтому скачиваем старые пакеты
sdkmanager --sdk_root=path_to_SDK "platforms;android-28" sdkmanager --sdk_root=path_to_SDK "build-tools;30.0.2"
Временно отказавшись от новейших средств, в плане эффективности вряд ли чего то потеряем
|
|
|
 |
Добавлено: Ср фев 05, 2025 01:20 |
|
|
 |
|
|
Заголовок сообщения: |
Re: Блог программиста любителя |
 |
|
Внимание!!! Вместо $java_files в предыдущем примере надо писать $java_files/*java Утилита dx преобразует только что полученные файлы class в android формат и записывает результат в build/dex Код: $BUILD_TOOLS/dx --dex --output=$build_dest/dex/classes.dex $build_dest/classes/ Опять вызывается утилита aapt, чтобы упаковать файлы ресурсов XML, полученные dex файлы, файлы в каталоге assets и манифест в apk файл. Он пока еще не выравнен и не подписан. Код: apk_name=myapp $BUILD_TOOLS/aapt package -f -M $main/AndroidManifest.xml \ -S $main/res/ -I "${PLATFORM}/android.jar" \ -A $main/assets \ -F $build_dest/apk/$apk_name.not_aligned.unsigned.apk $build_dest/dex/
Выравниваем Код: "${BUILD_TOOLS}/zipalign" \ -f 4 $build_dest/apk/$apk_name.not_aligned.unsigned.apk $build_dest/apk/$apk_name.aligned.apk
И подписываем Код: $BUILD_TOOLS/apksigner sign --ks keystore.jks \ --ks-key-alias androidkey --ks-pass pass:android \ --key-pass pass:android --out $build_dest/apk/$apk_name.apk \ $build_dest/apk/$apk_name.aligned.apk
Далее про генерацию ключей для подписки файла
Внимание!!! Вместо $java_files в предыдущем примере надо писать [b]$java_files/*java[/b]
Утилита dx преобразует только что полученные файлы class в android формат и записывает результат в build/dex
[code]$BUILD_TOOLS/dx --dex --output=$build_dest/dex/classes.dex $build_dest/classes/[/code] Опять вызывается утилита aapt, чтобы упаковать файлы ресурсов XML, полученные dex файлы, файлы в каталоге assets и манифест в apk файл. Он пока еще не выравнен и не подписан. [code] apk_name=myapp $BUILD_TOOLS/aapt package -f -M $main/AndroidManifest.xml \ -S $main/res/ -I "${PLATFORM}/android.jar" \ -A $main/assets \ -F $build_dest/apk/$apk_name.not_aligned.unsigned.apk $build_dest/dex/ [/code] Выравниваем [code] "${BUILD_TOOLS}/zipalign" \ -f 4 $build_dest/apk/$apk_name.not_aligned.unsigned.apk $build_dest/apk/$apk_name.aligned.apk [/code] И подписываем [code] $BUILD_TOOLS/apksigner sign --ks keystore.jks \ --ks-key-alias androidkey --ks-pass pass:android \ --key-pass pass:android --out $build_dest/apk/$apk_name.apk \ $build_dest/apk/$apk_name.aligned.apk [/code] Далее про генерацию ключей для подписки файла
|
|
|
 |
Добавлено: Ср фев 05, 2025 00:49 |
|
|
 |
|
|
Заголовок сообщения: |
Re: Блог программиста любителя |
 |
|
На самом деле файл R.java появится в каталоге build/res/com/mycompany/myapp/R.java , добавится package. Компиляция Код: mypkg=com/mycompany/myapp main=path_to_main # путь к каталогу main java_files=$main.java$mypkg # main+package build_dest==path_to_build # путь к каталогу build PLATFORM=PLATFORM=./platforms/android-33
javac -source 1.8 -target 1.8 \ -bootclasspath "${JAVA_HOME}/jre/rt.jar" \ -classpath "${PLATFORM}/android.jar" -d $build_dest/classes \ $build_dest/res/$mypkg/R.java $java_files Здесь -source 1.8 -target 1.8 - насколько я понимаю, для совместимости с java 8, используемой android. Забирает только что собранный R.java и java файлы из каталога main/java и помещает результат (файлы class) в каталог build Если все прошло без ошибок, дальше проблем быть не должно.
На самом деле файл R.java появится в каталоге build/res/com/mycompany/myapp/R.java , добавится package.
Компиляция [code] mypkg=com/mycompany/myapp main=path_to_main # путь к каталогу main java_files=$main.java$mypkg # main+package build_dest==path_to_build # путь к каталогу build PLATFORM=PLATFORM=./platforms/android-33
javac -source 1.8 -target 1.8 \ -bootclasspath "${JAVA_HOME}/jre/rt.jar" \ -classpath "${PLATFORM}/android.jar" -d $build_dest/classes \ $build_dest/res/$mypkg/R.java $java_files [/code] Здесь -source 1.8 -target 1.8 - насколько я понимаю, для совместимости с java 8, используемой android.
Забирает только что собранный R.java и java файлы из каталога main/java и помещает результат (файлы class) в каталог build
Если все прошло без ошибок, дальше проблем быть не должно.
|
|
|
 |
Добавлено: Вт фев 04, 2025 01:56 |
|
|
 |
|
|
Заголовок сообщения: |
Re: Блог программиста любителя |
 |
|
Исходники лучше собрать в отдельный каталог, например main Код: main/ assets - тут файлы и каталоги, которые просто переписываются в apk-файл Каталог assets необязателен. res - файл ресурсов java - java программы AndroidManifest.xml - файл манифеста
Результаты компиляции можно помещать в каталог, например build Код: build/ - файлы, получающиеся в процессе компиляции res - тут файл R.java, получающийся в процессе компиляции ресурсов classes - тут class файлы, после компиляции программы на java dex - тут скомпилированные class-файлы в формат андроид dest - apk файлы
Перед компиляцией желательно очистить подкаталоги в build от старого содержимого Первым делом необходимо собрать файл R.java из ресурсов в каталоге main/res . Скрипт для сборки будет выглядить примерно так. Код: определим переменные BUILD_TOOLS=./buid-tools/30.0.0 #путь к ранее скачанной утилите, где находятся #исполняемые файлы aapt, dx, apksigner и др. PLATFORM=./platforms/android-33 #путь к ранее скачанной утилите, где находится # android.jar main=path_to_main # путь к каталогу main build_dest=path_to_build # путь к каталогу build
(30.0.0 и android-33 заменить на нужные значения)
сама команда $BUILD_TOOLS/aapt package -f -m -J $build_dest/res \ -S $main/res \ -M $main/AndroidManifest.xml \ -I $PLATFORM/android.jar
После выполнения команды в каталоге build/res должен появится файл R.java
Исходники лучше собрать в отдельный каталог, например main [code] main/ assets - тут файлы и каталоги, которые просто переписываются в apk-файл Каталог assets необязателен. res - файл ресурсов java - java программы AndroidManifest.xml - файл манифеста [/code] Результаты компиляции можно помещать в каталог, например build [code] build/ - файлы, получающиеся в процессе компиляции res - тут файл R.java, получающийся в процессе компиляции ресурсов classes - тут class файлы, после компиляции программы на java dex - тут скомпилированные class-файлы в формат андроид dest - apk файлы [/code] Перед компиляцией желательно очистить подкаталоги в build от старого содержимого Первым делом необходимо собрать файл R.java из ресурсов в каталоге main/res .
Скрипт для сборки будет выглядить примерно так. [code] определим переменные BUILD_TOOLS=./buid-tools/30.0.0 #путь к ранее скачанной утилите, где находятся #исполняемые файлы aapt, dx, apksigner и др. PLATFORM=./platforms/android-33 #путь к ранее скачанной утилите, где находится # android.jar main=path_to_main # путь к каталогу main build_dest=path_to_build # путь к каталогу build
(30.0.0 и android-33 заменить на нужные значения)
сама команда $BUILD_TOOLS/aapt package -f -m -J $build_dest/res \ -S $main/res \ -M $main/AndroidManifest.xml \ -I $PLATFORM/android.jar [/code] После выполнения команды в каталоге build/res должен появится файл R.java
|
|
|
 |
Добавлено: Пт янв 31, 2025 21:20 |
|
|
 |
|
|
Заголовок сообщения: |
Re: Блог программиста любителя |
 |
|
К предыдущему Код: Чтобы установить CMake или NDK, используйте следующий синтаксис:
sdkmanager --install ["ndk;major.minor.build[suffix]" | "cmake;major.minor.micro.build"] [--channel=channel_id] // NDK channels: 0 (stable), 1 (beta), or 3 (canary)
Чтобы устанавливать обычные пакеты параметр --install не обязателен Проект HelloWord , который генерирует aide, можно скачать здесь https://disk.yandex.ru/d/5ufypLUFOOWTcQТут package="com.mycompany.myapp" Лучше избегать называть начала пакетов с "com" , как здесь, а предпочитать то, что ближе по алфавиту, чем "com" . Cам android имеет кучу приложений, которые начинаются с "com", и найти свое среди них будет трудно. java класс MainActivity.java Код: package com.mycompany.myapp;
import android.app.*; import android.os.*; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } } Имя пакета (package) тут com.mycompany.myapp соответственно файл MainActivity.java должен находиться в каталоге com/mycompany/myappВ aide java классы находятся в каталоге java, поэтому путь будет выглядить так java/com/mycompany/myapp В каталоге res хранятся файлы ресурсов описание окон находится в каталоге res/layout Каждому окну соответствует свой xml файл, имена файлов тут должны почему то состоять из строчных букв. У нас один файл main.xml. Код: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center">
<TextView android:text="@string/hello_world" android:layout_width="wrap_content" android:layout_height="wrap_content" />
</LinearLayout>
В MainActivity.java ссылка на этот скомпилированный файл выглядит так setContentView(R.layout.main); Еще в каталоге res находятся подкаталоги res/values и res/values-v21 В следующих каталогах находятся иконки приложения для разных размеров экрана Файлы называются ic_launcher.png имеют свой размер и располагаются в нижеследущих каталогах Код: каталог размер картинки drawable-hdpi 72x72 drawable-xhdpi 96x96 drawable-mdpi 48x48 drawable-xxhdpi 144x144
Можно еще создать каталог assets, содержимое этого каталога с файлами и подкаталогами компилятор просто переписывает в apk-файл. Есть методы чтения данных оттуда. И наконец важнейший файл AndroidManifest.xmlКод: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.mycompany.myapp" android:versionCode="1" android:versionName="1.0">
<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="29"/>
<application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" android:resizeableActivity="true">
<activity android:name=".MainActivity" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
К предыдущему [code] Чтобы установить CMake или NDK, используйте следующий синтаксис:
sdkmanager --install ["ndk;major.minor.build[suffix]" | "cmake;major.minor.micro.build"] [--channel=channel_id] // NDK channels: 0 (stable), 1 (beta), or 3 (canary) [/code]
Чтобы устанавливать обычные пакеты параметр --install не обязателен
Проект HelloWord , который генерирует aide, можно скачать здесь https://disk.yandex.ru/d/5ufypLUFOOWTcQ
Тут package="com.mycompany.myapp"
Лучше избегать называть начала пакетов с "com" , как здесь, а предпочитать то, что ближе по алфавиту, чем "com" . Cам android имеет кучу приложений, которые начинаются с "com", и найти свое среди них будет трудно.
java класс MainActivity.java
[code]package com.mycompany.myapp;
import android.app.*; import android.os.*; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } }[/code] Имя пакета (package) тут [b]com.mycompany.myapp[/b] соответственно файл [b]MainActivity.java[/b] должен находиться в каталоге [b]com/mycompany/myapp[/b] В aide java классы находятся в каталоге java, поэтому путь будет выглядить так [b]java/com/mycompany/myapp[/b]
В каталоге res хранятся файлы ресурсов описание окон находится в каталоге res/layout Каждому окну соответствует свой xml файл, имена файлов тут должны почему то состоять из строчных букв. У нас один файл main.xml. [code] <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center">
<TextView android:text="@string/hello_world" android:layout_width="wrap_content" android:layout_height="wrap_content" />
</LinearLayout> [/code]
В [b]MainActivity.java[/b] ссылка на этот скомпилированный файл выглядит так
setContentView(R.layout.main);
Еще в каталоге res находятся подкаталоги res/values и res/values-v21
В следующих каталогах находятся иконки приложения для разных размеров экрана Файлы называются ic_launcher.png имеют свой размер и располагаются в нижеследущих каталогах [code] каталог размер картинки drawable-hdpi 72x72 drawable-xhdpi 96x96 drawable-mdpi 48x48 drawable-xxhdpi 144x144 [/code]
Можно еще создать каталог assets, содержимое этого каталога с файлами и подкаталогами компилятор просто переписывает в apk-файл. Есть методы чтения данных оттуда.
И наконец важнейший файл [b]AndroidManifest.xml[/b] [code] <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.mycompany.myapp" android:versionCode="1" android:versionName="1.0">
<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="29"/>
<application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" android:resizeableActivity="true">
<activity android:name=".MainActivity" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest> [/code]
|
|
|
 |
Добавлено: Ср янв 29, 2025 02:31 |
|
|
 |
|
|
Заголовок сообщения: |
Re: Блог программиста любителя |
 |
|
Для начала c https://developer.android.com/sdk/index.htmlскачиваем утилиту коммандной строки для своей системы (linux mac или windows) Ищем файл вида commandlinetools-linux-7302050_latest.zip Дальше разархивируйте согласно инструкции https://developer.android.com/tools/sdkmanager?hl=ru Можно не создавать каталог latest тогда в при вызове утилиты надо указывать параметр --sdk_root=path_to_SDK Наберем ( или обернем скриптом ) path_to_sdkmanager/sdkmanager --list [--sdk_root=path_to_SDK] > lists в файле lists будут пакеты, доступные sdkmanager. На этом этапе какие либо трудности маловероятны. У меня были какие-то странности, связанные с java_run time [spoiler] работает java --version openjdk 17.0.11 2024-04-16 OpenJDK Runtime Environment (Red_Hat-17.0.11.0.9-alt1) (build 17.0.11+9) OpenJDK 64-Bit Server VM (Red_Hat-17.0.11.0.9-alt1) (build 17.0.11+9, mixed mode, sharing)
не работает java --version openjdk 17.0.12 2024-07-16 OpenJDK Runtime Environment (Red_Hat-17.0.12.0.7-alt1) (build 17.0.12+7) OpenJDK 64-Bit Server VM (Red_Hat-17.0.12.0.7-alt1) (build 17.0.12+7, mixed mode, sharing)
Почему то работает с более старой версией java.
то, что не работает, выдает ошибку
./sdkmanager Error: A JNI error has occurred, please check your installation and try again Exception in thread "main" java.lang.UnsupportedClassVersionError: com/android/sdklib/tool/sdkmanager/SdkManagerCli has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 52.0 at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:756) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at java.net.URLClassLoader.defineClass(URLClassLoader.java:473) at java.net.URLClassLoader.access$100(URLClassLoader.java:74) at java.net.URLClassLoader$1.run(URLClassLoader.java:369) at java.net.URLClassLoader$1.run(URLClassLoader.java:363) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:362) at java.lang.ClassLoader.loadClass(ClassLoader.java:418) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352) at java.lang.ClassLoader.loadClass(ClassLoader.java:351) at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:621)
В общем столкнуться с этой проблемой маловероятно, скорее всего у меня криво встал linux
[/spoiler]
Дальше надо скачать "build-tools" и "platforms;android" используя sdkmanager. При необходимости также скачивается ndk На этом этапе трудности маловероятны. В указаной ранее статье https://www.hanshq.net/command-line-android.html показывался способ скачивания пакетов напрямую с сервера, но делать этого не стоит, скорее всего, статья старая, многое может измениться. Поэтому лучше использовать sdkmanager. Пусть android платформа = 28, что соответствует android 9 Соответствия версий api и android [spoiler] Имя. Версия Уровень API Выпущено Код версии сборки К 10.0 29 Авг 2020 BuildVersionCodes.Q Круговая 9.0 28 Авг-2018 BuildVersionCodes.P Oreo 8.1 27 Дек 2017 BuildVersionCodes.OMr1 Oreo 8.0 26 Авг 2017 BuildVersionCodes.O Nougat 7.1 25 Декабрь 2016 г. BuildVersionCodes.NMr1 Nougat 7.0 24 Август 2016 г. BuildVersionCodes.N Marshmallow 6,0 23 Август 2015 г. BuildVersionCodes.M Lollipop 5.1 22 Мар 2015 г. BuildVersionCodes.LollipopMr1 Lollipop 5,0 21 Ноя 2014 BuildVersionCodes.Lollipop Kitkat Watch 4.4W 20 Июн 2014 BuildVersionCodes.KitKatWatch Kitkat 4.4. 19 Октябрь 2013 г. BuildVersionCodes.KitKat Желе-боб 4.3 18 Июл 2013 BuildVersionCodes.JellyBeanMr2 Желе-боб 4.2-4.2.2 17 Ноябрь 2012 г. BuildVersionCodes.JellyBeanMr1 Желе-боб 4.1-4.1.1 16 Июнь 2012 г. BuildVersionCodes.JellyBean Ice Cream Sandwich 4.0.3-4.0.4 15 Декабрь 2011 г. BuildVersionCodes.IceCreamSandwichMr1 Ice Cream Sandwich 4.0-4.0.2 14 Окт 2011 BuildVersionCodes.IceCreamSandwich Соты 3.2 13 Июнь 2011 г. BuildVersionCodes.HoneyCombMr2 Соты 3.1.x 12 Май 2011 г. BuildVersionCodes.HoneyCombMr1 Соты 3.0.x 11 Февраль 2011 г. BuildVersionCodes.HoneyComb Пряник 2.3.3-2.3.4 10 Февраль 2011 г. BuildVersionCodes.GingerBreadMr1 Пряник 2.3-2.3.2 9 Ноя 2010 BuildVersionCodes.GingerBread Froyo 2.2.x 8 Июнь 2010 г. BuildVersionCodes.Froyo Eclair 2.1.x 7 янв 2010 BuildVersionCodes.EclairMr1 Eclair 2.0.1 6 Декабрь 2009 г. BuildVersionCodes.Eclair01 Eclair 2.0 5 Ноябрь 2009 г. BuildVersionCodes.Eclair Кольцо 1,6 4 Сентябрь 2009 г. BuildVersionCodes.Donut Кекс 1.5 3 Май 2009 г. BuildVersionCodes.Cupcake База 1,1 2 Февраль 2009 г. BuildVersionCodes.Base11 База 1.0 1 Октябрь 2008 г. BuildVersionCodes.Base
https://learn.microsoft.com/ru-ru/previ ... api-levels [/spoiler] path_to_sdkmanager/sdkmanager --sdk_root=path_to_SDK "platform-tools" "platforms;android-28" "build-tools;30.0.2" если нужно ndk, то добавляем, например "ndk;26.2.11394342" подробнее про ndk тут https://developer.android.com/tools/sdkmanager?hl=ruЕсли все прошло успешно, то пора скомпилировать первую программу.
Для начала c https://developer.android.com/sdk/index.html скачиваем утилиту коммандной строки для своей системы (linux mac или windows) Ищем файл вида commandlinetools-linux-7302050_latest.zip
Дальше разархивируйте согласно инструкции https://developer.android.com/tools/sdkmanager?hl=ru
Можно не создавать каталог latest тогда в при вызове утилиты надо указывать параметр --sdk_root=path_to_SDK
Наберем ( или обернем скриптом )
path_to_sdkmanager/sdkmanager --list [--sdk_root=path_to_SDK] > lists в файле lists будут пакеты, доступные sdkmanager.
На этом этапе какие либо трудности маловероятны. У меня были какие-то странности, связанные с java_run time
[spoiler] [size=85] работает java --version openjdk 17.0.11 2024-04-16 OpenJDK Runtime Environment (Red_Hat-17.0.11.0.9-alt1) (build 17.0.11+9) OpenJDK 64-Bit Server VM (Red_Hat-17.0.11.0.9-alt1) (build 17.0.11+9, mixed mode, sharing)
не работает java --version openjdk 17.0.12 2024-07-16 OpenJDK Runtime Environment (Red_Hat-17.0.12.0.7-alt1) (build 17.0.12+7) OpenJDK 64-Bit Server VM (Red_Hat-17.0.12.0.7-alt1) (build 17.0.12+7, mixed mode, sharing)
Почему то работает с более старой версией java.
то, что не работает, выдает ошибку
./sdkmanager Error: A JNI error has occurred, please check your installation and try again Exception in thread "main" java.lang.UnsupportedClassVersionError: com/android/sdklib/tool/sdkmanager/SdkManagerCli has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 52.0 at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:756) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at java.net.URLClassLoader.defineClass(URLClassLoader.java:473) at java.net.URLClassLoader.access$100(URLClassLoader.java:74) at java.net.URLClassLoader$1.run(URLClassLoader.java:369) at java.net.URLClassLoader$1.run(URLClassLoader.java:363) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:362) at java.lang.ClassLoader.loadClass(ClassLoader.java:418) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352) at java.lang.ClassLoader.loadClass(ClassLoader.java:351) at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:621)
В общем столкнуться с этой проблемой маловероятно, скорее всего у меня криво встал linux
[/spoiler] [/size] Дальше надо скачать "build-tools" и "platforms;android" используя sdkmanager. При необходимости также скачивается ndk На этом этапе трудности маловероятны. В указаной ранее статье https://www.hanshq.net/command-line-android.html показывался способ скачивания пакетов напрямую с сервера, но делать этого не стоит, скорее всего, статья старая, многое может измениться. Поэтому лучше использовать sdkmanager.
Пусть android платформа = 28, что соответствует android 9 Соответствия версий api и android [size=85] [spoiler] Имя. Версия Уровень API Выпущено Код версии сборки К 10.0 29 Авг 2020 BuildVersionCodes.Q Круговая 9.0 28 Авг-2018 BuildVersionCodes.P Oreo 8.1 27 Дек 2017 BuildVersionCodes.OMr1 Oreo 8.0 26 Авг 2017 BuildVersionCodes.O Nougat 7.1 25 Декабрь 2016 г. BuildVersionCodes.NMr1 Nougat 7.0 24 Август 2016 г. BuildVersionCodes.N Marshmallow 6,0 23 Август 2015 г. BuildVersionCodes.M Lollipop 5.1 22 Мар 2015 г. BuildVersionCodes.LollipopMr1 Lollipop 5,0 21 Ноя 2014 BuildVersionCodes.Lollipop Kitkat Watch 4.4W 20 Июн 2014 BuildVersionCodes.KitKatWatch Kitkat 4.4. 19 Октябрь 2013 г. BuildVersionCodes.KitKat Желе-боб 4.3 18 Июл 2013 BuildVersionCodes.JellyBeanMr2 Желе-боб 4.2-4.2.2 17 Ноябрь 2012 г. BuildVersionCodes.JellyBeanMr1 Желе-боб 4.1-4.1.1 16 Июнь 2012 г. BuildVersionCodes.JellyBean Ice Cream Sandwich 4.0.3-4.0.4 15 Декабрь 2011 г. BuildVersionCodes.IceCreamSandwichMr1 Ice Cream Sandwich 4.0-4.0.2 14 Окт 2011 BuildVersionCodes.IceCreamSandwich Соты 3.2 13 Июнь 2011 г. BuildVersionCodes.HoneyCombMr2 Соты 3.1.x 12 Май 2011 г. BuildVersionCodes.HoneyCombMr1 Соты 3.0.x 11 Февраль 2011 г. BuildVersionCodes.HoneyComb Пряник 2.3.3-2.3.4 10 Февраль 2011 г. BuildVersionCodes.GingerBreadMr1 Пряник 2.3-2.3.2 9 Ноя 2010 BuildVersionCodes.GingerBread Froyo 2.2.x 8 Июнь 2010 г. BuildVersionCodes.Froyo Eclair 2.1.x 7 янв 2010 BuildVersionCodes.EclairMr1 Eclair 2.0.1 6 Декабрь 2009 г. BuildVersionCodes.Eclair01 Eclair 2.0 5 Ноябрь 2009 г. BuildVersionCodes.Eclair Кольцо 1,6 4 Сентябрь 2009 г. BuildVersionCodes.Donut Кекс 1.5 3 Май 2009 г. BuildVersionCodes.Cupcake База 1,1 2 Февраль 2009 г. BuildVersionCodes.Base11 База 1.0 1 Октябрь 2008 г. BuildVersionCodes.Base
https://learn.microsoft.com/ru-ru/previous-versions/xamarin/android/app-fundamentals/android-api-levels [/spoiler] [/size]
path_to_sdkmanager/sdkmanager --sdk_root=path_to_SDK "platform-tools" "platforms;android-28" "build-tools;30.0.2" если нужно ndk, то добавляем, например "ndk;26.2.11394342" подробнее про ndk тут https://developer.android.com/tools/sdkmanager?hl=ru
Если все прошло успешно, то пора скомпилировать первую программу.
|
|
|
 |
Добавлено: Пн ноя 18, 2024 22:25 |
|
|
 |
|
|
Заголовок сообщения: |
Re: Блог программиста любителя |
 |
|
Основные средства разработки программ для android. Android studio - официальное https://developer.android.com/sdk/index.htmlЕсть архивы старых sdk https://developer.android.com/studio/archive?hl=ru Насколько я помню, в старых версиях была собственная java, что в принципе может пригодиться. Следущее, aide - разработка или компиляция програм прямо на android устройствах. Ныне заброшен, поддерживается энтузиастами. https://4pda.to/forum/index.php?showtop ... 69&st=4960 Сам я до последнего его использовал. Разработка android программ из командной строки. Скачивается там же, где android studio, чуть ниже. Преимущества: Эти утилиты входят в состав самой android studio и aide. Утилиты командной строки, это java программы, соответственно, можно организовать средство разработки android программ на любом устройстве, где есть полноценная java. Такие проекты есть. Android SDK https://github.com/AndroidIDEOfficial/a ... es/tag/sdkhttps://github.com/AndroidIDEOfficial/a ... /tree/main Но есть доводы разрабатывать свои средства на коленке, можно собрать под себя. Например, любители си и ассемблеров могут подключить NDK https://www.hanshq.net/command-line-android.html Замечу, что основные вопросы по Aide на 4pda это как раз про NDK. Далее подробнее.
Основные средства разработки программ для android. Android studio - официальное https://developer.android.com/sdk/index.html Есть архивы старых sdk https://developer.android.com/studio/archive?hl=ru Насколько я помню, в старых версиях была собственная java, что в принципе может пригодиться.
Следущее, aide - разработка или компиляция програм прямо на android устройствах. Ныне заброшен, поддерживается энтузиастами. https://4pda.to/forum/index.php?showtopic=319369&st=4960 Сам я до последнего его использовал.
Разработка android программ из командной строки. Скачивается там же, где android studio, чуть ниже. Преимущества: Эти утилиты входят в состав самой android studio и aide. Утилиты командной строки, это java программы, соответственно, можно организовать средство разработки android программ на любом устройстве, где есть полноценная java. Такие проекты есть. Android SDK https://github.com/AndroidIDEOfficial/androidide-tools/releases/tag/sdk https://github.com/AndroidIDEOfficial/androidide-tools/tree/main
Но есть доводы разрабатывать свои средства на коленке, можно собрать под себя. Например, любители си и ассемблеров могут подключить NDK
https://www.hanshq.net/command-line-android.html
Замечу, что основные вопросы по Aide на 4pda это как раз про NDK.
Далее подробнее.
|
|
|
 |
Добавлено: Сб ноя 16, 2024 20:31 |
|
|
 |
|
|
Заголовок сообщения: |
Re: Блог программиста любителя |
 |
|
Спасибо большое!
Спасибо большое!
|
|
|
 |
Добавлено: Ср сен 25, 2024 03:08 |
|
|
 |
|
|
Заголовок сообщения: |
Re: Блог программиста любителя |
 |
|
В Help написано как убрать заглавные буквы Особенности SPF Краткое вступление для тех, кто уже знаком с какой-либо Форт-системой и стандартом ANS'94. Последнее обновление: $Date: 2008/11/14 20:13:12 $ [Русский] [Английский] Содержание Установил SPF4. И где здесь что-куда? Как запускать и подключать файлы? REQUIRE Пути поиска файлов для INCLUDED Модули Регистро-зависимость Ввод чисел Вещественные числа (числа с плавающей точкой) Структуры Где FORGET? Где NOT? Где DEFER? Как одним словом очистить стек? Комментарии Строки Многозадачность Словари Локальные и временные переменные Генерация исполняемых модулей (exe-файлов) Подключение dll-библиотек Средства отладки Оптимизатор Поддержка ANS Callback'и Слово NOTFOUND Scattered colons Область видимости Обработка исключений Установил SPF4. И где здесь что-куда? Первое и самое важное - расположение ваших рабочих файлов. В дистрибутиве SPF есть каталог DEVEL, предназначенный для разработчиков (в том числе и вас). Создайте в ней ваш подкаталог, например, ~vasya. И теперь вы можете подключать ваши файлы написав сокращённый путь в виде ~vasya/prog/myprog.f. Это упрощает взаимный доступ к библиотекам и программам. Общепринято библиотеки класть в подкаталог lib, а примеры программ в prog. В каталоге DEVEL собраны наработки других SP-Forth'еров, с кратким (очень кратким) их обзором вы можете ознакомиться в SPF_DEVEL, либо пройтись по файлам самому. В каталоге samples/win/spfwc вы найдёте GUI фронтенд для SPF. Просто запустите compile.bat и скопируйте полученный бинарный файл spf4wc.exe в корневой каталог установки (рядом с spf4.exe). Как запускать и подключать файлы? В командной строке скормить файл SPF'у можно просто указав путь к нему в параметрах запуска, spf.exe ~vasya/prog/myprog.f Заметьте, что путь для включения могут быть как абсолютным, так и относительно каталога devel. В консоли SPF (в режиме интерпретации) достаточно набрать имя файла: ~vasya/prog/myprog.f В целях совместимости лучше подключать явно: S" ~vasya/prog/myprog.f" INCLUDED Но правильнее всего использовать REQUIRE. REQUIRE В SPF есть нестандартное слово REQUIRE ("word" "file" -- ), где word - некоторое слово определённое в библиотеке file. Если слово word присутствует в контекстном словаре, REQUIRE считает, что библиотека уже была подключена и не загружает её. Так избегается двойная загрузка библиотек. Если же найти word не удаётся - библиотека подключается обычным образом (через INCLUDED). Например: REQUIRE CreateSocket ~ac/lib/win/winsock/sockets.f REQUIRE ForEach-Word ~pinka/lib/words.f REQUIRE ENUM ~nn/lib/enum.f NB: В качестве word выбирайте всегда наиболее уникальное слово из подключаемой библиотеки. Пути поиска файлов для INCLUDED S" file.f" INCLUDED будет искать в перечисленных ниже местах в именно таком порядке короткое имя файла file.f (т.е. в текущем каталоге) PATH_TO_SPF.EXE/devel/file.f (т.о. удобно использовать чужие наработки), PATH_TO_SPF.EXE/file.f (так подключаются стандартные либы и другие файлы из поставки SPF). Если требуется указать больше путей поиска (например использовать форт код разделяемый между системами, или неважно - любой код вне дерева каталогов SPF который не может быть адресован относительно текущего файла), то можно либо переопределить FIND-FULLNAME (который VECT) либо использовать внешнюю либу - ~ygrek/spf/included.f. TODO: Вынести отдельно Тогда потребуется только прописать в spf4.ini ~ygrek/spf/included.f with: my_path\ S" my path with spaces/" with и все файлы будут искаться в my_path в дополнение к описанному выше алгоритму (my_path может быть как абсолютным так и относительно spf.exe). Модули В SPF есть модули, которые позволяют скрывать некоторые внутренние слова библиотек выводя наружу только слова для взаимодействия. MODULE: vasya-lib \ внутренние слова EXPORT \ слова взаимодействия, видные снаружи, компилируются во внешний словарь. DEFINITIONS \ опять внутренние слова EXPORT \ ну вы поняли  ;MODULE Код MODULE: vasya-lib можно писать много раз - последующие вызовы будут докомпилировать слова в тот же модуль. На самом деле слово определённое через MODULE: это обычный словарь. Регистро-зависимость SPF регистрозависим, то есть для него слова CHAR , Char и char - три разных слова. Сделать SPF независимым от регистра слова можно подключив файл lib/ext/caseins.f. По умолчанию, регистро-независимость включается сразу после подключения lib/ext/caseins.f. Чтобы регистро-независимость временно выключать/включать, используйте переменную CASE-INS: REQUIRE CASE-INS lib/ext/caseins.f 2 dup * . CASE-INS OFF \ вернуть обратно режим зависимости от регистра 2 DUP * . CASE-INS ON \ включить регистро-независимость 2 dup * .
В Help написано как убрать заглавные буквы
Особенности SPF Краткое вступление для тех, кто уже знаком с какой-либо Форт-системой и стандартом ANS'94.
Последнее обновление: $Date: 2008/11/14 20:13:12 $
[Русский] [Английский]
Содержание Установил SPF4. И где здесь что-куда? Как запускать и подключать файлы? REQUIRE Пути поиска файлов для INCLUDED Модули Регистро-зависимость Ввод чисел Вещественные числа (числа с плавающей точкой) Структуры Где FORGET? Где NOT? Где DEFER? Как одним словом очистить стек? Комментарии Строки Многозадачность Словари Локальные и временные переменные Генерация исполняемых модулей (exe-файлов) Подключение dll-библиотек Средства отладки Оптимизатор Поддержка ANS Callback'и Слово NOTFOUND Scattered colons Область видимости Обработка исключений
Установил SPF4. И где здесь что-куда? Первое и самое важное - расположение ваших рабочих файлов. В дистрибутиве SPF есть каталог DEVEL, предназначенный для разработчиков (в том числе и вас). Создайте в ней ваш подкаталог, например, ~vasya. И теперь вы можете подключать ваши файлы написав сокращённый путь в виде ~vasya/prog/myprog.f. Это упрощает взаимный доступ к библиотекам и программам. Общепринято библиотеки класть в подкаталог lib, а примеры программ в prog.
В каталоге DEVEL собраны наработки других SP-Forth'еров, с кратким (очень кратким) их обзором вы можете ознакомиться в SPF_DEVEL, либо пройтись по файлам самому.
В каталоге samples/win/spfwc вы найдёте GUI фронтенд для SPF. Просто запустите compile.bat и скопируйте полученный бинарный файл spf4wc.exe в корневой каталог установки (рядом с spf4.exe).
Как запускать и подключать файлы? В командной строке скормить файл SPF'у можно просто указав путь к нему в параметрах запуска,
spf.exe ~vasya/prog/myprog.f Заметьте, что путь для включения могут быть как абсолютным, так и относительно каталога devel.
В консоли SPF (в режиме интерпретации) достаточно набрать имя файла:
~vasya/prog/myprog.f В целях совместимости лучше подключать явно:
S" ~vasya/prog/myprog.f" INCLUDED Но правильнее всего использовать REQUIRE.
REQUIRE В SPF есть нестандартное слово REQUIRE ("word" "file" -- ), где word - некоторое слово определённое в библиотеке file. Если слово word присутствует в контекстном словаре, REQUIRE считает, что библиотека уже была подключена и не загружает её. Так избегается двойная загрузка библиотек. Если же найти word не удаётся - библиотека подключается обычным образом (через INCLUDED). Например:
REQUIRE CreateSocket ~ac/lib/win/winsock/sockets.f REQUIRE ForEach-Word ~pinka/lib/words.f REQUIRE ENUM ~nn/lib/enum.f NB: В качестве word выбирайте всегда наиболее уникальное слово из подключаемой библиотеки.
Пути поиска файлов для INCLUDED S" file.f" INCLUDED будет искать в перечисленных ниже местах в именно таком порядке
короткое имя файла file.f (т.е. в текущем каталоге) PATH_TO_SPF.EXE/devel/file.f (т.о. удобно использовать чужие наработки), PATH_TO_SPF.EXE/file.f (так подключаются стандартные либы и другие файлы из поставки SPF). Если требуется указать больше путей поиска (например использовать форт код разделяемый между системами, или неважно - любой код вне дерева каталогов SPF который не может быть адресован относительно текущего файла), то можно либо переопределить FIND-FULLNAME (который VECT) либо использовать внешнюю либу - ~ygrek/spf/included.f.
TODO: Вынести отдельно
Тогда потребуется только прописать в spf4.ini
~ygrek/spf/included.f with: my_path\ S" my path with spaces/" with и все файлы будут искаться в my_path в дополнение к описанному выше алгоритму (my_path может быть как абсолютным так и относительно spf.exe).
Модули В SPF есть модули, которые позволяют скрывать некоторые внутренние слова библиотек выводя наружу только слова для взаимодействия.
MODULE: vasya-lib \ внутренние слова EXPORT \ слова взаимодействия, видные снаружи, компилируются во внешний словарь. DEFINITIONS \ опять внутренние слова EXPORT \ ну вы поняли :) ;MODULE Код MODULE: vasya-lib можно писать много раз - последующие вызовы будут докомпилировать слова в тот же модуль. На самом деле слово определённое через MODULE: это обычный словарь.
Регистро-зависимость SPF регистрозависим, то есть для него слова CHAR , Char и char - три разных слова. Сделать SPF независимым от регистра слова можно подключив файл lib/ext/caseins.f. По умолчанию, регистро-независимость включается сразу после подключения lib/ext/caseins.f.
Чтобы регистро-независимость временно выключать/включать, используйте переменную CASE-INS:
REQUIRE CASE-INS lib/ext/caseins.f 2 dup * . CASE-INS OFF \ вернуть обратно режим зависимости от регистра 2 DUP * . CASE-INS ON \ включить регистро-независимость 2 dup * .
|
|
|
 |
Добавлено: Пн сен 23, 2024 09:38 |
|
|
 |
|
|
Заголовок сообщения: |
Re: Блог программиста любителя |
 |
|
Вообще, разруха не только у меня. Altlinux, которым без проблем пользовался больше 20 лет, начал выдавать странности. Из проекта исчезла опера,( уже давно), не запускается avidemux, нечем редактировать видеофайлы. Исчез gfort, что крайне неприятно. Не с чем стало сравнивать свой форт. Сходу собрать gfort из исходников не удалось, ковырятся не хотелось.
к счастью в http://forth.org.ru/ Russian FORTH Interest Group
сохранилась ссылка на spf, там оказался бинарник spf4orig который запустился. В принципе пойдет, только команды надо обязательно набирать большими буквами, что не очень хорошо.
В общем, можно приступать. Еще, кажется окончательно разобрался с компилятором командной строки для android проектов.
Вообще, разруха не только у меня. Altlinux, которым без проблем пользовался больше 20 лет, начал выдавать странности. Из проекта исчезла опера,( уже давно), не запускается avidemux, нечем редактировать видеофайлы. Исчез gfort, что крайне неприятно. Не с чем стало сравнивать свой форт. Сходу собрать gfort из исходников не удалось, ковырятся не хотелось.
к счастью в [b]http://forth.org.ru/[/b] Russian FORTH Interest Group
сохранилась ссылка на spf, там оказался бинарник spf4orig который запустился. В принципе пойдет, только команды надо обязательно набирать большими буквами, что не очень хорошо.
В общем, можно приступать. Еще, кажется окончательно разобрался с компилятором командной строки для android проектов.
|
|
|
 |
Добавлено: Пт сен 13, 2024 02:44 |
|
|
 |
|
|
Заголовок сообщения: |
Re: Блог программиста любителя |
 |
|
После перерыва, решил возобновить разработку. Перерыв был вызван причинами в основном технического порядка, когда проект, над которым я упорно работал, написанный на java 17, отказавлся компилироваться на java, который использовался в android Ide. Тут еще и моя ошибка, пытался использовать статические классы на java, думал, что это круто, и переписал под это свой, в общем то приемлемо сделанный проект. На самом деле, в отличии от статических переменных, статические классы полное дерьмо, и проект нужно было возвращать взад, что постоянно откладывал, потом начал потихоньку забывать детали. В общем, как там это... психические болезни программистов - просто .. как там ее.. ...ариация какая-то. (В общем, для меня, все разговоры, что стремление к стандартизации не нужно - побоку.) Схватив свою новорожденную навигационную программу и фотопрограмму, начал наслаждаться жизнью. Программы прекрасно взаимодействовуют с домашним ftp-сервером, сделанным из древнего ноутбука с простреленным дисплеем, можно безгеморойно загружать треки в программы и выгружать треки и фотографии после поездки. Но недавно благорастворение закончилось, навигационная программа начала бешено выжирать заряд батареи. Просто кэщирование было организованно самым примитивным способом - тайл карты загружался из интернета и сохранялся на sd карте. Имя тайла - типа (z6x45y2345), присоединялось к строке, в которой таким же образом были записанны имена предыдущих, загруженных из интернета тайлов. Прежде, чем загрузить из интернета картинку, осуществлялся поиск по строке. Если находил, загружался с SD, если нет - с интернету. В конце концов размер строки стал килобайт 300 наверное! В общем поправить не трудно, да за два года образовалась полная разруха. Я забыл, из каких проектов скомпилировал нынешние, находящиеся в эксплуатации apk - файлы. Реально, их там куча. Это сохраненные промежуточные проекты, и развитие существующих, и оставленные на будущее. Их можно компилировать и они запустятся, но во всех из них могут быть ощибки и даже не понятно как их использовать. В общем, надо переписывать заново, к счастью многие фрагменты проектов хорошо проработаны, и много кусков можно надергать из старых. Но тут напасть - авторы aide забросили проект и гугол удалил его из play по причине отсутствия обновлений. (я сперва подумал, присоединились к санкциям, когда разобрался, решил задонатить, гугл плай не пропустил платеж) В общем, если кому нужен aide, можно сюда https://4pda.to/forum/index.php?showtopic=319369там лежит крякнутая версия, в отличии от бесплатной, которая может собрать проект не больше чем из 5 файлов, в этой можно собрать проект из любого кол-ва файлов. Можно взять у меня apk-файл, скачанный из google play давно. Вчера удалось собрать android проект из командной строки, думаю развивать это направление Утилиты командной строки можно скачать с официального https://developer.android.com/studio?hl=ru Далее буду описывать, как всем этим пользоваться. ps. Тяжеленную android studio ставил, проблевался. Вдобавок отказалась компилировать мои aide-проекты, никаких дел с ней больше иметь не буду, даже по приговору суда.
После перерыва, решил возобновить разработку.
Перерыв был вызван причинами в основном технического порядка, когда проект, над которым я упорно работал, написанный на java 17, отказавлся компилироваться на java, который использовался в android Ide.
Тут еще и моя ошибка, пытался использовать статические классы на java, думал, что это круто, и переписал под это свой, в общем то приемлемо сделанный проект. На самом деле, в отличии от статических переменных, статические классы полное дерьмо, и проект нужно было возвращать взад, что постоянно откладывал, потом начал потихоньку забывать детали. В общем, как там это... психические болезни программистов - просто .. как там ее.. ...ариация какая-то.
(В общем, для меня, все разговоры, что стремление к стандартизации не нужно - побоку.)
Схватив свою новорожденную навигационную программу и фотопрограмму, начал наслаждаться жизнью. Программы прекрасно взаимодействовуют с домашним ftp-сервером, сделанным из древнего ноутбука с простреленным дисплеем, можно безгеморойно загружать треки в программы и выгружать треки и фотографии после поездки.
Но недавно благорастворение закончилось, навигационная программа начала бешено выжирать заряд батареи. Просто кэщирование было организованно самым примитивным способом - тайл карты загружался из интернета и сохранялся на sd карте. Имя тайла - типа (z6x45y2345), присоединялось к строке, в которой таким же образом были записанны имена предыдущих, загруженных из интернета тайлов. Прежде, чем загрузить из интернета картинку, осуществлялся поиск по строке. Если находил, загружался с SD, если нет - с интернету. В конце концов размер строки стал килобайт 300 наверное! В общем поправить не трудно, да за два года образовалась полная разруха. Я забыл, из каких проектов скомпилировал нынешние, находящиеся в эксплуатации apk - файлы. Реально, их там куча. Это сохраненные промежуточные проекты, и развитие существующих, и оставленные на будущее.
Их можно компилировать и они запустятся, но во всех из них могут быть ощибки и даже не понятно как их использовать. В общем, надо переписывать заново, к счастью многие фрагменты проектов хорошо проработаны, и много кусков можно надергать из старых.
Но тут напасть - авторы aide забросили проект и гугол удалил его из play по причине отсутствия обновлений. (я сперва подумал, присоединились к санкциям, когда разобрался, решил задонатить, гугл плай не пропустил платеж)
В общем, если кому нужен aide, можно сюда https://4pda.to/forum/index.php?showtopic=319369
там лежит крякнутая версия, в отличии от бесплатной, которая может собрать проект не больше чем из 5 файлов, в этой можно собрать проект из любого кол-ва файлов. Можно взять у меня apk-файл, скачанный из google play давно.
Вчера удалось собрать android проект из командной строки, думаю развивать это направление
Утилиты командной строки можно скачать с официального [url]https://developer.android.com/studio?hl=ru[/url] Далее буду описывать, как всем этим пользоваться.
ps. Тяжеленную android studio ставил, проблевался. Вдобавок отказалась компилировать мои aide-проекты, никаких дел с ней больше иметь не буду, даже по приговору суда.
|
|
|
 |
Добавлено: Вт авг 27, 2024 03:15 |
|
|
 |
|
|
Заголовок сообщения: |
Re: Блог программиста любителя |
 |
|
Работа продолжается. Основная трудность - неопределенность предполагаемой системы, для которой пишешь интерфейс. Когда система наконец создана, становится очевидны дефекты интерфейса, которые должны поддерживать систему. Работа идет на новый круг, что психологически тяжело и неприятно. Сейчас прорабатываю функцию assign. Она назначает параметры устройствам ввода-вывода, куда и откуда forth скрипт будет выдавать и забирать данные, не заботясь, куда эти данные попадут на самом деле. Устройством ввода вывода может быть что угодно, его даже можно написать на форте. Остановился на следущем дизайне функции assign Код: \ .s" name" - оставляет на стеке адрес и длину слова name .s" protocol param1 ... paramN" .s" filename" channal assign \ int int int int int assign
сейчас развиты следущие протоколы Код: s" file" s" anyFileName" 5 assign \ тут все понятно файл назначается 5 каналу ( url = IP_or_HOSTNAME:port or user:password@IP_or_HOSTNAME:port/path ) s" udp url" s" filename" 5 assign s" tcp url" s" filename" 5 assign s" ftp url" s" filename" 5 assign
Запись - чтение осуществляется функциями readchan writechan - для текстов writebytes readbytes - массивы байт Это все у меня уже находится в эксплуатации, скрипты буду понемногу выкладывать. Сам forth пока выкладывать не буду, код еще пока грязный.
Работа продолжается. Основная трудность - неопределенность предполагаемой системы, для которой пишешь интерфейс. Когда система наконец создана, становится очевидны дефекты интерфейса, которые должны поддерживать систему. Работа идет на новый круг, что психологически тяжело и неприятно. Сейчас прорабатываю функцию [b]assign[/b]. Она назначает параметры устройствам ввода-вывода, куда и откуда forth скрипт будет выдавать и забирать данные, не заботясь, куда эти данные попадут на самом деле. Устройством ввода вывода может быть что угодно, его даже можно написать на форте.
Остановился на следущем дизайне функции assign [code] \ .s" name" - оставляет на стеке адрес и длину слова name .s" protocol param1 ... paramN" .s" filename" channal assign \ int int int int int assign [/code] сейчас развиты следущие протоколы [code] s" file" s" anyFileName" 5 assign \ тут все понятно файл назначается 5 каналу ( url = IP_or_HOSTNAME:port or user:password@IP_or_HOSTNAME:port/path ) s" udp url" s" filename" 5 assign s" tcp url" s" filename" 5 assign s" ftp url" s" filename" 5 assign [/code] Запись - чтение осуществляется функциями readchan writechan - для текстов writebytes readbytes - массивы байт
Это все у меня уже находится в эксплуатации, скрипты буду понемногу выкладывать. Сам forth пока выкладывать не буду, код еще пока грязный.
|
|
|
 |
Добавлено: Вс ноя 13, 2022 03:06 |
|
|
 |
|
|
Заголовок сообщения: |
Re: Блог программиста любителя |
 |
|
По причине отсутствия опыта работы с сокетами, довольно много кода пришлось переписывать много раз. Пока идет чистка кода после всех экспериментов. Но уже есть сетевые разработки, Wake on lan, ftp-клиент. Не сложно также оснастить каждое приложение, содержащее форт, своим ftp-сервером, что бы можно было без геморойно обмениваться с ним данными. Сейчас выложу рабочую версию самодельной wol. ( удаленное включение компьютеров. https://admcomp.ru/wol.html ) К сожалению технология сбойная, иногда не срабатывает. Но вероятность сбоя самодельной wol и "официальной" программы wol примерно равно. Для запуска нужно реализовать ф-ции adrString lenString index getcharи adrByte len send - которая посылает udp-пакет определенному хосту Код: 2variable mk s" 00:1A:4D:2F:89:0C" mk 2! \ адрес и размер строки mac-адреса variable aa variable bb variable er : dps \ int n int a int b a>b диапазон a < n < b ,-1 a n b > 0 0 er ! bb ! aa ! dup aa @ - 0> if DUP bb @ - 0< if -1 er ! then then drop er @ ; \ -1 -- входит в диапазон между a и b : ifdig16 \ char - log ( num | -1 ) 0 - 9 , a - f ; -1 false dup 47 59 dps \ 0-9 if 48 - else dup 96 103 dps \ a-f if 87 - else dup 64 71 dps \ A-F if 55 - else drop -1 then then then ; \ 0 - Н или -1 : sum16 ( dig1 dig2 - byte or -1000 ) swap dup 0< if \ error (-1) drop drop -1000 else swap dup 0< if drop drop -1000 else 4 shl or \ сдвигает и складывает then then ; variable qu 0 qu ! : to_byte \ .. - byte два соседних символа из строки mk превращает в байт mk 2@ qu @ getchar \ char from string 1 qu +! ifdig16 \ dup . mk 2@ qu @ getchar 1 qu +! ifdig16 \ dup . swap sum16 ; \ qu приращается
: mac \ Читает mac-строку и укладывает байты to_byte 1 qu +! c, to_byte 1 qu +! c, to_byte 1 qu +! c, to_byte 1 qu +! c, to_byte 1 qu +! c, to_byte c, 0 qu ! ; variable macm here macm ! mac \ в macm - адрес байтов mac 6 6 16 * + constant dtg.length \ 102 create datagram[] dtg.length allot 0 qu ! : fillFF \ заполнить 6 байтов структуры datagram байтом ff datagram[] dup 5 + swap do 255 i c! loop ; : movMak \ копировать байты mak адреса 6 qu +! \ qu dup 5 + swap \ qu текущий адрес в datagram 5 0 do macm @ i + c@ qu @ i + c! loop ; : 4mv movMak movMak movMak movMak ; : 16mv 4mv 4mv 4mv 4mv ; : pre fillff \ 16mv datagram[] qu ! 16mv ; pre datagram[] dtg.length send Реализовано конечно аляповато, но ковырятся времени нет.
По причине отсутствия опыта работы с сокетами, довольно много кода пришлось переписывать много раз. Пока идет чистка кода после всех экспериментов. Но уже есть сетевые разработки, Wake on lan, ftp-клиент. Не сложно также оснастить каждое приложение, содержащее форт, своим ftp-сервером, что бы можно было без геморойно обмениваться с ним данными. Сейчас выложу рабочую версию самодельной wol. ( удаленное включение компьютеров. [url]https://admcomp.ru/wol.html[/url] ) К сожалению технология сбойная, иногда не срабатывает. Но вероятность сбоя самодельной wol и "официальной" программы wol примерно равно.
Для запуска нужно реализовать ф-ции adrString lenString index [b]getchar[/b] и adrByte len [b]send[/b] - которая посылает udp-пакет определенному хосту [code] 2variable mk s" 00:1A:4D:2F:89:0C" mk 2! \ адрес и размер строки mac-адреса variable aa variable bb variable er : dps \ int n int a int b a>b диапазон a < n < b ,-1 a n b > 0 0 er ! bb ! aa ! dup aa @ - 0> if DUP bb @ - 0< if -1 er ! then then drop er @ ; \ -1 -- входит в диапазон между a и b : ifdig16 \ char - log ( num | -1 ) 0 - 9 , a - f ; -1 false dup 47 59 dps \ 0-9 if 48 - else dup 96 103 dps \ a-f if 87 - else dup 64 71 dps \ A-F if 55 - else drop -1 then then then ; \ 0 - Н или -1 : sum16 ( dig1 dig2 - byte or -1000 ) swap dup 0< if \ error (-1) drop drop -1000 else swap dup 0< if drop drop -1000 else 4 shl or \ сдвигает и складывает then then ; variable qu 0 qu ! : to_byte \ .. - byte два соседних символа из строки mk превращает в байт mk 2@ qu @ getchar \ char from string 1 qu +! ifdig16 \ dup . mk 2@ qu @ getchar 1 qu +! ifdig16 \ dup . swap sum16 ; \ qu приращается
: mac \ Читает mac-строку и укладывает байты to_byte 1 qu +! c, to_byte 1 qu +! c, to_byte 1 qu +! c, to_byte 1 qu +! c, to_byte 1 qu +! c, to_byte c, 0 qu ! ; variable macm here macm ! mac \ в macm - адрес байтов mac 6 6 16 * + constant dtg.length \ 102 create datagram[] dtg.length allot 0 qu ! : fillFF \ заполнить 6 байтов структуры datagram байтом ff datagram[] dup 5 + swap do 255 i c! loop ; : movMak \ копировать байты mak адреса 6 qu +! \ qu dup 5 + swap \ qu текущий адрес в datagram 5 0 do macm @ i + c@ qu @ i + c! loop ; : 4mv movMak movMak movMak movMak ; : 16mv 4mv 4mv 4mv 4mv ; : pre fillff \ 16mv datagram[] qu ! 16mv ; pre datagram[] dtg.length send [/code] Реализовано конечно аляповато, но ковырятся времени нет.
|
|
|
 |
Добавлено: Ср окт 26, 2022 15:06 |
|
|
 |
|
|
Заголовок сообщения: |
Re: Блог программиста любителя |
 |
|
Все это время выгуливал эту программу в велосипедных поездках. Программа умеет работать с одним загруженным треком и отображать текущий, формируемый трек. В принципе, несложно было бы написать форт-программу, которая давала бы, например, звуковое оповещение в случае отклонения от заданного трека, но почему-то поленился это сделать. Вместо этого, используя Intent, реализовал вызов фотографической программы пользователя Longer'а http://fforum.winglion.ru/viewtopic.php?p=44257#p44257 (Кстати, много кода я надергал с его camSnap'a, на тот момент я был чайником в андроид программировании) Intent вызывается при нажатии на кнопку wpt, что позволяет не только зафиксировать координаты путевой точки, но и отфотографировать ее со всех сторон. Для этого ослабил крепление смартфона на руле так, что бы можно было переворачивать его вертикально, для фотографирования, или горизонтально, для навигации. В целом, две взаимодействующие примитивные программы оказались гораздо удобнее каких-то иных средств. Когда же в обоих окажется отлаженный forth, использование таких программ станет еще на порядок гибче.
Работа над фортом продолжается - введено много улучшений. Прорабатывается многозадачность, каналы. Добавилась возможность работать не только с файлами, но и с датаграммами.
[pre]Все это время выгуливал эту программу в велосипедных поездках. Программа умеет работать с одним загруженным треком и отображать текущий, формируемый трек. В принципе, несложно было бы написать форт-программу, которая давала бы, например, звуковое оповещение в случае отклонения от заданного трека, но почему-то поленился это сделать. Вместо этого, используя Intent, реализовал вызов фотографической программы пользователя [b]Longer[/b]'а [url]http://fforum.winglion.ru/viewtopic.php?p=44257#p44257[/url] (Кстати, много кода я надергал с его camSnap'a, на тот момент я был чайником в андроид программировании) Intent вызывается при нажатии на кнопку wpt, что позволяет не только зафиксировать координаты путевой точки, но и отфотографировать ее со всех сторон. Для этого ослабил крепление смартфона на руле так, что бы можно было переворачивать его вертикально, для фотографирования, или горизонтально, для навигации. В целом, две взаимодействующие примитивные программы оказались гораздо удобнее каких-то иных средств. Когда же в обоих окажется отлаженный forth, использование таких программ станет еще на порядок гибче.
Работа над фортом продолжается - введено много улучшений. Прорабатывается многозадачность, каналы. Добавилась возможность работать не только с файлами, но и с датаграммами.[/pre]
|
|
|
 |
Добавлено: Вс окт 09, 2022 07:46 |
|
|
 |
|
|
Заголовок сообщения: |
Re: Блог программиста любителя |
 |
|
Цитата: А просто писать на ФОРТЕ, использую всю красоту и мощь можно? Нельзя. Скорее всего для андроида нет форта, пригодного для написания скриптов, чтоб переправлять данные между процессами, как это делают в мире Юникс уже пол столетия. Кстати, на такие возможности, мне кажется мало обращают внимание. А они радикально облегчают любительское программирование, оставляя реализацию всякой организационной хрени на "потом", которую можно доработать скриптами. Хорошая новость. Написал отображение карты за один вечер, хотя ожидал закончить работу за месяц другой. Осталось только написать кеширование загруженных из интернета тайлов, и можно считать реализацию черновика сделанной. Запись фрагмента недавней велопрогулки. На телефоне карту можно перемещать, написал свою реализацию перемещения экрана, та, что используется в android api ужастна, экран залипает. Код: float Xdown, Ydown;// координаты касания @Override public boolean onTouch(View v, MotionEvent event ) {
float x,y; x = event.getX(); y = event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: // нажатие Xdown=x; Ydown=y; break; case MotionEvent.ACTION_MOVE: // движение .. на некоторых моделях работает муторно break; case MotionEvent.ACTION_UP: // отпускание !! убрать инт int dxp=(int)(Xdown-x); // смещение в пикселях int dyp=-(int)(Ydown-y); double dxm=dxp*PixelSizeMetres; // смещение в метрах double dym=dyp*PixelSizeMetres; float klat=111111.0f; // метров в градусе по широте float kLon=(float ) (40000*Math.cos( Math.toRadians( centrLat) )/360 ) *1000; // по долготе double dxg = dxm/kLon; double dyg = dym/klat; centrLat=centrLat+dyg; centrLon=centrLon+dxg; PixelSizeMetres = AU.calcMetrsPix(centrLat, zoom); dispCorner = AU.calcDispCorner(centrLat,centrLon,PixelSizeMetres, displaywidth , displayheight); navView.tileArray=macroTileArray( centrLat, centrLon, zoom, displaywidth , displayheight); if (AU.Wpt!=null)updateWP( AU.Wpt, dispCorner , PixelSizeMetres); if (AU.TRK!=null) updateTRK(AU.TRK); if (TRKp!=null) updateGPS(TRKp); navView.invalidate(); break; case MotionEvent.ACTION_CANCEL: break; } return true; }
В работе использовал только сферическую геометрию и информацию отсюда https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames Никакими сторонними библиотеками не пользовался.
[quote]А просто писать на ФОРТЕ, использую всю красоту и мощь можно?[/quote]
Нельзя. Скорее всего для андроида нет форта, пригодного для написания скриптов, чтоб переправлять данные между процессами, как это делают в мире Юникс уже пол столетия. Кстати, на такие возможности, мне кажется мало обращают внимание. А они радикально облегчают любительское программирование, оставляя реализацию всякой организационной хрени на "потом", которую можно доработать скриптами.
Хорошая новость. Написал отображение карты за один вечер, хотя ожидал закончить работу за месяц другой. Осталось только написать кеширование загруженных из интернета тайлов, и можно считать реализацию черновика сделанной. Запись фрагмента недавней велопрогулки.
[img]https://i.ibb.co/rk6whd4/Screenshot-20220814-013411-nav3.jpg[/img]
На телефоне карту можно перемещать, написал свою реализацию перемещения экрана, та, что используется в android api ужастна, экран залипает.
[code] float Xdown, Ydown;// координаты касания @Override public boolean onTouch(View v, MotionEvent event ) {
float x,y; x = event.getX(); y = event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: // нажатие Xdown=x; Ydown=y; break; case MotionEvent.ACTION_MOVE: // движение .. на некоторых моделях работает муторно break; case MotionEvent.ACTION_UP: // отпускание !! убрать инт int dxp=(int)(Xdown-x); // смещение в пикселях int dyp=-(int)(Ydown-y); double dxm=dxp*PixelSizeMetres; // смещение в метрах double dym=dyp*PixelSizeMetres; float klat=111111.0f; // метров в градусе по широте float kLon=(float ) (40000*Math.cos( Math.toRadians( centrLat) )/360 ) *1000; // по долготе double dxg = dxm/kLon; double dyg = dym/klat; centrLat=centrLat+dyg; centrLon=centrLon+dxg; PixelSizeMetres = AU.calcMetrsPix(centrLat, zoom); dispCorner = AU.calcDispCorner(centrLat,centrLon,PixelSizeMetres, displaywidth , displayheight); navView.tileArray=macroTileArray( centrLat, centrLon, zoom, displaywidth , displayheight); if (AU.Wpt!=null)updateWP( AU.Wpt, dispCorner , PixelSizeMetres); if (AU.TRK!=null) updateTRK(AU.TRK); if (TRKp!=null) updateGPS(TRKp); navView.invalidate(); break; case MotionEvent.ACTION_CANCEL: break; } return true; } [/code]
В работе использовал только сферическую геометрию и информацию отсюда [url]https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames[/url]
Никакими сторонними библиотеками не пользовался.
|
|
|
 |
Добавлено: Вс авг 14, 2022 03:32 |
|
|
 |
|