Подтвердить что ты не робот

Привет, мир с помощью Android SDK (без IDE)

Мои цели заключаются в следующем:

  • Протестируйте основные инструменты разработки на простой программе
  • Разверните программу в полезное приложение

Я предпочитаю работать с небольшими независимыми инструментами, а не с IDE. Я предпочитаю кодировать процедурный или императивный стиль (обычная старая Java), а не декларативный (XML).

Я установил автономный Android SDK в соответствии с инструкциями. У меня есть необходимый минимум других инструментов (текстовый редактор, командная оболочка и JDK). Но единственные начальные инструкции, которые я могу найти, привязаны к Android Studio, Eclipse или другим IDE. Я не могу следовать за ними.

Как я могу написать программу Java с моим текстовым редактором, чтобы отобразить "Hello world" на Android-устройстве? Как я могу проверить его с помощью эмулятора SDK? Пожалуйста, дайте мне инструкции.

4b9b3361

Ответ 1

Это инструкции, которые в конечном итоге сработали для меня. Я получил их, деконструировав Google Ant script, на котором основан ответ Rob.


Следующий контент от "Android-программирования без IDE" из документации (архивировано здесь); copyright 2017 by geekygenius, Майкл Аллан, cascal, Дорон Бехар, mnoronha и AndroidMechanic; лицензированный под CC BY-SA 3.0. Архив полного Содержимое документации можно найти на archive.org, где пример индексируется по его идентификатору темы: 85, например: 9496.

Это минималистский пример Hello World, который использует только самые базовые инструменты для Android.

Требования и допущения

В этом примере предполагается Linux. Возможно, вам придется настроить синтаксис для своей собственной платформы.

Настройка SDK для Android

После распаковки версии SDK:

  • Установите дополнительные пакеты с помощью диспетчера SDK. Не используйте android update sdk --no-ui, как указано в комплекте Readme.txt; он загружает около 30 ГБ ненужных файлов. Вместо этого используйте интерактивный менеджер SDK android sdk для получения рекомендуемого минимума пакетов.

  • Приложите следующие каталоги JDK и SDK к вашему исполнению PATH. Это необязательно, но нижеприведенные инструкции предполагают.

    • JDK/бен
    • SDK/платформенные инструменты
    • SDK/инструменты
    • SDK/build-tools/LATEST (как установлено на шаге 1)
  • Создайте виртуальное устройство Android. Используйте интерактивный AVD Manager (android avd). Возможно, вам придется немного поиграть и найти совет; инструкции на месте не всегда полезны.

    (Вы также можете использовать свое собственное устройство)

  • Запустите устройство:

    emulator -avd DEVICE
    
  • Если экран устройства заблокирован, проведите по экрану, чтобы разблокировать его.

    Оставьте его включенным во время программирования приложения.

Кодирование приложения

  1. Перейдите в пустой рабочий каталог.

  2. Сделайте исходный файл:

    mkdir --parents src/dom/domain
    touch src/dom/domain/SayingHello.java
    

    Содержание:

    package dom.domain;
    import android.widget.TextView;
    
    public final class SayingHello extends android.app.Activity
    {
        protected @Override void onCreate( final android.os.Bundle activityState )
        {
            super.onCreate( activityState );
            final TextView textV = new TextView( SayingHello.this );
            textV.setText( "Hello world" );
            setContentView( textV );
        }
    }
    
  3. Добавить манифест:

    touch AndroidManifest.xml
    

    Содержание:

    <?xml version='1.0'?>
    <manifest xmlns:a='http://schemas.android.com/apk/res/android'
     package='dom.domain' a:versionCode='0' a:versionName='0'>
        <application a:label='Saying hello'>
            <activity a:name='dom.domain.SayingHello'>
                 <intent-filter>
                    <category a:name='android.intent.category.LAUNCHER'/>
                    <action a:name='android.intent.action.MAIN'/>
                    </intent-filter>
                </activity>
            </application>
        </manifest>
    
  4. Создайте подкаталог для объявленных ресурсов:

    mkdir res
    

    Оставьте его пустым.

Построение кода

  1. Сгенерировать источник для объявлений ресурсов. Замените здесь правильный путь к SDK, и установленный API для сборки против (например, "android-23" ):

    aapt package -f \
      -I SDK/platforms/android-API/android.jar \
      -J src -m \
      -M AndroidManifest.xml -S res -v
    

    Объявления ресурсов (описанные ниже) фактически являются необязательными. В то же время вышеупомянутый вызов ничего не делает, если res/все еще пуст.

  2. Скомпилируйте исходный код в байт-код Java (.java →.class):

    javac \
      -bootclasspath SDK/platforms/android-API/android.jar \
      -classpath src -source 1.7 -target 1.7 \
      src/dom/domain/*.java
    
  3. Перевести байт-код с Java на Android (.class →.dex):

    Сначала используйте Jill (.class →.jayce):

    java -jar SDK/build-tools/LATEST/jill.jar \
      --output classes.jayce src
    

    Затем Jack (.jayce →.dex):

    java -jar SDK/build-tools/LATEST/jack.jar \
      --import classes.jayce --output-dex .
    

    Байт-код Android раньше назывался "исполняемый код Dalvik", и поэтому "dex".

    Вы можете заменить шаги 11 и 12 одним вызовом на Джек, если хотите; он может компилироваться непосредственно из источника Java (.java →.dex). Но есть преимущества для компиляции с javac. Это более известный, хорошо документированный и более широко используемый инструмент.

  4. Пакет файлов ресурсов, включая манифест:

    aapt package -f \
      -F app.apkPart \
      -I SDK/platforms/android-API/android.jar \
      -M AndroidManifest.xml -S res -v
    

    Это приводит к частичному APK файлу (пакет приложений для Android).

  5. Сделайте полный APK с помощью инструмента ApkBuilder:

    java -classpath SDK/tools/lib/sdklib.jar \
      com.android.sdklib.build.ApkBuilderMain \
      app.apkUnalign \
      -d -f classes.dex -v -z app.apkPart
    

    Он предупреждает: "ЭТО ИНСТРУМЕНТ УДАЛЕН. См." Справка "для получения дополнительной информации". Если --help терпит неудачу с ArrayIndexOutOfBoundsException, затем вместо этого не передавайте аргументы:

    java -classpath SDK/tools/lib/sdklib.jar \
      com.android.sdklib.build.ApkBuilderMain
    

    В нем объясняется, что CLI (ApkBuilderMain) устарел в пользу прямого вызова Java API (ApkBuilder). (Если вы знаете, как это сделать из командной строки, обновите этот пример.)

  6. Оптимизируйте выравнивание данных APK (рекомендуемая практика):

    zipalign -f -v 4 app.apkUnalign app.apk
    

Установка и запуск

  1. Установите приложение на Android-устройство:

    adb install -r app.apk
    
  2. Запустите приложение:

    adb shell am start -n dom.domain/.SayingHello
    

    Он должен запускаться и говорить привет.

Это все. Это то, что нужно, чтобы поздороваться с базовыми инструментами Android.

Объявление ресурса

Этот раздел является необязательным. Заявки ресурсов не требуются для простого приложения "привет мир". Если они не требуются для вашего приложения, то вы можете упростить сборку, опуская шаг 10, и удаление ссылки на каталог res/с шага 13.

В противном случае, здесь приведен краткий пример того, как объявить ресурс, и как ссылаться на него.

  1. Добавить файл ресурсов:

    mkdir res/values
    touch res/values/values.xml
    

    Содержание:

    <?xml version='1.0'?>
    <resources>
        <string name='appLabel'>Saying hello</string>
    </resources>
    
  2. Ссылка на ресурс из манифеста XML. Это декларативный стиль ссылки:

    <!-- <application a:label='Saying hello'> -->
         <application a:label='@string/appLabel'>
    
  3. Ссылка на тот же ресурс из источника Java. Это настоятельная рекомендация:

    // v.setText( "Hello world" );
       v.setText( "This app is called "
         + getResources().getString( R.string.appLabel ));
    
  4. Протестируйте приведенные выше изменения путем перестройки, переустановки и повторное выполнение приложения (шаги 10-17).

    Он должен перезапустить и сказать: "Это приложение называется Saying hello".

Удаление приложения

adb uninstall dom.domain

См. также

  • рабочий пример - рабочая сборка script, которая использует приведенные выше команды

Ответ 2

Во-первых, серьезно даже не рассматривайте использование эмулятора. Если вы просто не хотите подчиняться ненужным пыткам. Для тех, кто не хочет багажа IDE, эмулятор в 100 раз хуже. Получить устройство будет советом по этому вопросу.

Вы не сможете отказаться от XML. Я понимаю и ценю тот импульс, который у меня был подобный. Тем не менее, я в конце концов полюбил его. Используйте стили много. Я бы рекомендовал использовать Android Studio. Он имеет отличный инструмент для создания кода и разметки интерфейса.

Даже если вы хотите просто скопировать код из редактора, вы можете использовать Android Studio, чтобы сделать свой проект заглушкой. Это довольно хорошо. В случае, если вы этого не знали, в документах есть способ командной строки для создания проекта (не используя AS): он документировал здесь.

Ответ 3

Очень полезный пост. Я сделал простой установщик яркости, используя ваши очень хорошие инструкции. Просто жаль, что я не смогу найти аргументы только для одного Джека. Возможно было разместить все в одном каталоге, кроме значка, который нужно найти в res\drawable-hdpi.

javac -bootclasspath c:\android\SDK/platforms/android-19/android.jar -classpath . *.java
java -jar c:\android\SDK/build-tools/24.0.1/jill.jar --output classes.jayce .
java -jar c:\android\SDK/build-tools/24.0.1/jack.jar --import classes.jayce --output-dex .
aapt package -f -F app.apkPart -I c:\android\SDK/platforms/android-19/android.jar -M AndroidManifest.xml -S res -v
java -classpath c:\android\SDK/tools/lib/sdklib.jar com.android.sdklib.build.ApkBuilderMain app.apkUnalign -d -f classes.dex -v -z app.apkPart
zipalign -f -v 4 app.apkUnalign brite.apk

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="dom.domain"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="19" />
<uses-permission android:name="android.permission.WRITE_SETTINGS"></uses-permission>
    <application
        android:allowBackup="true"
        android:icon="@drawable/slkimage"
        android:label="brite" >
        <activity
            android:name="dom.domain.MainActivity"
            android:label="brite" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>