Mémo sur AndroidStudio
Michel Llibre - Novembre 2023
Table des matières
1 Le SDK 1
2 L'IDE 2
3 Ajout de code source d'un niveau android 2
4 Bug IDE 2
5 Réduction temps de compilation 2
6 Instant Run 2
7 Aide sur le langage 2
8 Edition 3
8.1 Indentation, formattage 3
9 Bug Installation : 3
10 Importation projet externe 3
11 Dupliquer un projet studio 3
12 Générer une apk 4
12.1 Générer une APK non signée 4
12.2 Geénérer une APK signée 4
13 Gradle 5
13.1 Fichier setting.gradle 5
13.2 Fichier build.gragle (Projet) 5
13.3 Fichier build.gragle (Module) 6
14 Fenêtre édition layout xml 8
15 Suppression du bandeau avec le nom de l'appli 8
16 Copie/Rename d'un projet 8
17 Application avec routines natives en C/C++ 9
Le SDK est installé ici : C:\Users\Utilisateur\AppData\Local\Android\Sdk
et le NDK en dessous.
Le logiciel de communication adb.exe se trouve sous Sdk dans le répertoire platform-tools. exemple :
C:\Users\Utilisateur\AppData\Local\Android\Sdk\platform-tools>adb devices
* daemon not running; starting now at tcp:5037
* daemon started successfully
List of devices attached
2cb898262b027ece device
L'utilisation de la ligne de commande n'est plus documentée, c'est l'IDE Android studio qui est préconisé. Toutefois, on a acces aux outils du SDK par le fichier bat :
tools\bin\sdkmanager.bat
et on a acces à l'avdmanager par le fichier bat :
tools\bin\avdmanager.bat
J'ai créé la varaible d'environnement AndroidSdk = C:\Users\Utilisateur\AppData\Local\Android\Sdk, ce qui fait qu'on peut appeler l'avd par %AndroidSdk%\platform-tools\avd.
La petite case en bas à gauche fait disparaitre ou apparaitre les onglets des bords gauche (Project, Respurce manager, ...) et droit (Gradle, Device file explorer).
Dans la fenêtre de navigation, l'onglet Project propose les différentes vues suivantes :
•Android : Affiche l'essentiel des fichiers spécifiques au développement android
•Project files : L'arborescence du projet sur le disque dur sous le répertoire noté X dans ce qui suit.
•Package : ensemble des packages de l'application
•etc
La vue Android offre 3 principales sections :
•manifest qui ne contient que le fichier AndroidManifest.xml (qui se trouve dans e répertoire X/app/src/main)
•java contient les fichiers sources (java ou kotlin)
•res contient les ressorces de l'application (drawable, layout, values, etc...)
Lancement de l'application : bouton triangle vert
Arrêt de l'application : carré devenu rouge après le lancement.
Lorsque l'IDE renseigne mal les arguments des fonctions dans ses complétions, c'est qu'il manque des codes sources pour le niveau utilisé à la compilation. Pour le télécharger :
Tools > SDK Manager > Appearances & Behavior > System Settings > Android SDK
Si l'IDE détecte des erreurs, genre "cannot resolve symbol AppCompatActivity" alors que Gradle s'exécute sans trouver rien à redire, faire File/Invalide cache/Restart, car il se peut que l'IDE n'arrive pas à se reconfiguer correctement après une modification.
Dans votre répertoire utilisateur, renommez ou supprimez le dossier .gradle, puis redémarrez Android Studio. Le logiciel va télécharger à nouveau tous les éléments dont il a besoin. Lancez la fonction Gradle Build et vérifiez que l'opération fonctionne. Cliquez sur Rebuild project et l'opération fonctionnera.
Actuellement il y a un pb qui est résolu en copiant le bloc dependencies du build.gradle de ad2ah dans les nouveaux projets qui ont un bloc dependencies pas bon.
In Android Studio go to File -> Settings -> Build, Execution, Deployment -> Gradle
Check the 'Offline work' under 'Global Gradle settings'
It will reduce 90% gradle build time.
Pour l'interdire : File -> Settings -> Build, Execution, Deployment > Instant Run… Décocher
SHIFT F1 sur une classe appelle le fichier d'aide file:///C:/Applis/android-sdk/docs/reference/android/hardware/ sur la page de la classe pointée.
Menu Code/Reformat Code ou CTRL+ALT+L
Le message suivant : INSTALL_FAILED_INVALID_APK était dû a une erreur dans le fichier
build.gradle (module app) où à la ligne applicationId, il y avait "llibre.fr.monappli" au lieu de "fr.llibre.monappli".
L'opération menu Files/Nes/Import Project … se passe généralement mal car il y a des problèmes de numéro de version.
En particulier, Dans le fichier build.gradle (Module, voir définition ci-après) le numéro de compileSdkVersion doit correspondre à un compilateur présent sur le pc qui est accessible via Files/settings/Appearence&Behavior\Systems Settings\AndroidSdk onglet SdkPlatforms (la ligne correspondante est cochée si ce compilateur est présent). Il y a intérêt à prendre le targetSdkVersion égal au compileSdkVersion.
Au niveau de la visualisation des layout xml dans la fenêtre Design, s'il t a un problème, il faut choisir avec le bouton qui ressemble à un bonhomme android un numéro d'API le plus élevé possible, mais compatible avec la version d'android studio en cours. Par défaut le numéro affiché est parfois trop elevé, trop récent, pour être compris par notre version d'android studio.
EN DERNIER RECOURS : Créer un projet avec une activité minimale avec le nom du package désiré, puis copier tous le fichiers java du projet externe dans le repertoire java de ce nouveau projet et les fichiers ressources du projet externe dans les fichiers ressources de ce nouveau projet. Puis modifier le manifeste pour y ajouter tout le nécessaire qui était dans le manisfeste du projet externe. Comme ça, pas de soucis de version !
1) copier le dossier projet1 dans projet2
2) Démarrer Android Studio, fermer tous les projets et choisir :
Import project (Gradle, Eclipse, ADT, etc.)
et sélectionner le projet copié.
3) Dans l'onglet projet à gauche, présentation Android, étage java, sélectionner le nom du package (fr.llibre.projet1) à la souris et activer le menu contextuel Refactor /Rename et dans la fenêtre de dialogue choisir "Rename Package". Remplacer projet1 par projet2 et confirmer.
4) Vérifier que la modification a été faite dans le AndroidManisfest.xml
5) Dans res/values/strings.xml changer projet1 en projet2.
6) Dans Gragle Scripts/build.gradle(Module.app) faire la modif dans applicationId.
7) Dans Dans Gragle Scripts/settings.gradle : idem.
8) faire Sync Now.
9) Menu Build > Clean Project.
10) Menu Build > Rebuild.
Menu Build/Build APK(s). L'Apk générée se trouve (a priori) dans le répertoire
MonAppli\app\build\outputs\apk\debug sous le nom app-debug.apk que l'on peut renommer, puis copier sur le smartphone dans un répertoire quelconque (download par exemple). Quand on la sélectionne avec le navigateur de fichier du smartphone, il demande si on veut l'installer.
Il semble que l'apk qui se trouve dans ce répertoire après une simple commande "run" ne soit pas bien complète et que si on la copie pour la transférer sur le smartphone, celui-ci refuse de l'installer, alors que la commande "run" l'installe sans problème. L'apk qui se trouve dans le répertoire après un Build/Build Bundles()|APK(s)/ Build APK(s) se copie et s'installe sans problème si compilée en mode debug.
Autre Installation : Exemple de copie d'une ligne exécutée par studio :
adb push D:\MesProgs\android\studio\PolariScope\app\build\outputs\apk\debug\app-debug.apk /data/local/tmp/fr.llibre.polariscope
Dans le cas où on veut la mettre sur le PlayStore de Google, sinon c'est inutile.
En cours de mise au point :
Menu Build > Select Build Variant...>
Colonne centrale "Active Build Variant" : sélectionner : release à la place de debug
Colonne Active ABI : choisir armeabi_v7a
Menu Build > Make Module : Compile les fichiers source du module sélectionné. Ne génère pas d'APK. Peu utile.
Menu Buil > Make Project : Compile tous les modules. Ne génère pas d'APK.
Menu Buil > Clean Project : Efface tous les buids et le cache.
Menu Buil > Make Project : Exécute Clean Project pour la variante de construction sélectionnée et produit un fichier APK.
Menu Build > Build Bundle(s) / APK(s) > Build APK(s) : Construit un APK de tous les modules du projet en cours pour leur variante sélectionnée. Une fois la génération terminée, une notification de confirmation apparaît, fournissant un lien vers le fichier APK et un lien pour l'analyser dans l'analyseur APK. Si la variante de build que vous avez sélectionnée est un type de build de débogage, l'APK est signé avec une clé de débogage et il est prêt à installer. Si vous avez sélectionné une variante de version, par défaut, l'APK n'est pas signé et vous devez signer manuellement l'APK. Android Studio enregistre les fichiers APK que vous créez dans nom-projet / nom-module / build / sorties / apk /.
Menu Build > Build Bundle(s) / APK(s) > Build Bundle(s) : Construit un ensemble d'applications Android de tous les modules du projet en cours pour leur variante sélectionnée. Une fois la génération terminée, une notification de confirmation apparaît, fournissant un lien vers le bundle d'applications et un lien pour l'analyser dans l'APK Analyzer.
Si la variante de build sélectionnée est un type de build de débogage, le bundle d'application est signé avec une clé de débogage et vous pouvez utiliser bundletool pour déployer votre application du bundle d'application sur un appareil connecté. Si vous avez sélectionné une variante de version, le groupe d'applications n'est pas signé par défaut et vous devez le signer manuellement à l'aide de jarsigner. Alternativement, vous pouvez sélectionner Build> Generate Signed Bundle / APK dans la barre de menus.
Android Studio enregistre les fichiers APK que vous créez dans nom-projet / nom-module / build / sorties / bundle /.
Menu Build > Generate Signed Bundle / APK : Cocher soit "Android App Bundle", soit "APK" pour générer un bundle ou une APK signée enregistrée dans les même répertoires que ci-avant.
Sous la fenêtre Key store path bouton "Create New.."
•Key store path : D:\PERSO\android\upload-keystore.jks
•Mot de passe : clemard5299
•Key Alias : key_voirm2j, password : voirm2j3156
•Michel Llibre, Occitanie, FR
etc...
Résultat dans D:\android\studio\VoirM2j\app\release
Warning : Le fichier de clés JKS utilise un format propriétaire. Il est recommandé de migrer vers PKCS12, qui est un format standard de l'industrie en utilisant "keytool -importkeystore -srckeystore D:\PERSO\android\upload-keystore.jks -destkeystore D:\PERSO\android\upload-keystore.jks -deststoretype pkcs12".
La correction avec l'outil c:\Program Files\android\android studio\jre\bin\keytool.exe n'a pas marché, peut-être erreur dans le mot de passe "voirm2j3156".
!!!!!!!!!!!!!!!!!! APPLI CORROMPUE suite à cette manip !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Pour refaire marcher l'appli, même en version début, suppression du fichier D:\PERSO\android\upload-keystore.jks et dans buil.gradle(:app) suppression de la rubrique qui mentionnait ce fichier.
Le fichier setting.gradle est situé à la racine du projet. Il contient la liste des modules que doit gérer le projet. Généralement, il ne contient que le module app :
include ':app', ':secondmodule'
Il y a plusieurs fichiers build.gradle : un dans la racine du projet et un dans chaque répertoire module. Celui qui est situé à la racine du projet est généré automatiquement. Il contient la liste des informations partagées entre tous les modules. On peut y trouver la version de gradle utilisée, les différents repository maven nécessaires à chacun des modules. On peut y définir des variables qui seront utilisables par tous les sous-modules, tel que la version minimum d’android supportée :
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.3.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
//définit des constantes utilisables dans chacun de nos modules
ext{
ANDROID_BUILD_MIN_SDK_VERSION=14
ANDROID_BUILD_TARGET_SDK_VERSION=21
ANDROID_BUILD_TOOLS_VERSION="21.1.1"
ANDROID_BUILD_SDK_VERSION=21
}
//ajoute le serveur jcenter comme source de librairies maven à tous les modules
allprojects {
repositories {
jcenter()
}
}
Remarque : Les constantes peuvent aussi être définies dans le fichier gradle.properties :
ANDROID_BUILD_MIN_SDK_VERSION=14
ANDROID_BUILD_TARGET_SDK_VERSION=21
ANDROID_BUILD_TOOLS_VERSION="21.1.1"
ANDROID_BUILD_SDK_VERSION=21
Chaque module possède un fichier build.gradle, ses options de compilation, ainsi que la liste de ses dépendances. Dans ce fichier, on retrouve les propriétés Android de l’application, anciennement présentes dans le Manifest :
•compileSdkVersion : le numéro de version d’android sdk utilisée pour compiler le projet
•buildToolsVersion : le nom complet de la version d’android sdk utilisée pour compiler le projet
•applicationId : l'’identifiant unique de l’application (son nom de package complet)
•minSdkVersion : la version minimum d’android supportée
•targetSdkVersion : la version d’android pour laquelle l’application a été compilée (la même que compileSdkVersion je pense)
•versionCode : le numéro de version
•versionName : le nom complet de la version
apply plugin: 'com.android.application'
android {
compileSdkVersion 25
buildToolsVersion "26.0.0"
defaultConfig {
applicationId "fr.llibre.viewm2j"
minSdkVersion 9
targetSdkVersion 11
ndk {
moduleName "m2lbib"
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
}
dependencies {
compile 'com.android.support:support-v4:25.0.1'
}
Le numéro de compileSdkVersion doit correspondre à un compilateur présent sur le pc qui est accessible via Files/settings/Appearence&Behavior\Systems Settings\AndroidSdk onglet SdkPlatforms. La ligne correspondante est cochée si ce compilateur est présent.
Si nous voulons que notre module app ait comme dépendance le module secondmodule, afin qu’il accède au code écrit dans ce second, il faut ajouter la ligne suivante dans la section dependencies du fichier build.gradle de app :
compile project(':secondmodule')
C'est dans cette section que l'on ajoutera aussi la demande de compilation d'une librairie externe récupérée sur github par exemple.
Remarque : On peut réutiliser dans ce fichier les constantes définies dans les fichier build.gradle (Project) ou gradle.properties.
Après une installation d'une nouvelle version d'Android Studio, pour faire marcher de vieux projets le plus simple pour mettre à jour les compileVersion, minSdkVersion et targetSdkVersion est par le biais du menu File > Project Structure, sélectionner la feuille "Modules" dans la colonne de gauche, "app" dans la colonne Modules, et à droite :
- onglet "Properties" mettre
- Compile Sdk Version à la dernière valeur chargée (29)
- Build Tools Version à la dernière valeur chargée (Android SDK Build Tools 29.0.2)
- onglet "Default Config" mettre :
- Target Sdk Version à la dernière valeur chargée (29)
- Min Sdk Version à 19 par exemple (Kitkat pour Note II)
Puis faire Ok. Cela entraine une Synchronysation du projet avec les fichiers Gradle (mise à jour des fichiers build.gradle).
Remarque : Dans la feuille "Project"de la boite de dialogue "Project Structure" les valeurs :
Android Gradle Plugin Version : 3.5.3 (ancienne valeur 2,3,3)
Gradle Version : 5.4.1 (ancienne valeur 3,3).
ont fonctionné après avoir rajouté la deuxième ligne "google()" dans le fichier "build.Gradle (Project: XXX) :
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.5.3'
}
}
allprojects {
repositories {
google() <--------- ICI
jcenter()
}
}
Récemment (avril 2022) les champs suivant de la zone dependencies
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.4.1'
implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'}
causent des erreurs qui sont réolues en les remplçant par :
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'}
En cas d'erreur de version empêchant l'affichage en mode Design (bouton en bas à gauche), choisir un numéro d'API plus faible avec le bouton en haut à droite de la sous-fenêtre d'édition du layout xml.
Avec les nouveaux entêtes , ajouter ceci
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
...>
</androidx.constraintlayout.widget.ConstraintLayout>
Les widget directement placés à l'intérieur ne sont pas visibles. Une solutions consiste à les insérer dans un layout comme celui-ci :
<LinearLayout
android:id="@+id/mainVLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:layout_editor_absoluteX="1dp"
tools:layout_editor_absoluteY="1dp">
INSERRER SES WIDGETS ICI
</LinearLayout>
Dans le fichier styles.xml ajouter le style AppTheme.NoActionBar :
<style name="AppTheme.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
Et choisir ce style dans le Manifest.xml avec la ligne :
android:theme="@style/AppTheme.NoActionBar"
1.Fermer Android Studio, copier le dossier du projet, renommer
2.Ouvrir le nouveau projet dans Android Studio. Faire ok à supprimer l'importation Gradle du projet.
3.Changer l'applicationId dans build.gradle (Module:app)
4.Changer app_name dans AndroidManifest.xml
5.Dans app/res/values/strings.xml changer le nom de l'application.
6.Dans MainActivity.java, faire un refactor/rename du nom final du package, Choisir d'abord "Directories" (ça prend du temps), puis "Package", puis "do refactor".
7.Renommer les noms des JNICALL s'il y en a, car ils sont précédés du nom du package.
8.Facultatif : Dans le code java, certains identificateurs de ressources R.id.xx peuvent être précédés du nom du package, ce qui est normal, mais lourd, du style fr.llibre.monprojet.R.id.xx. On peut par Recherche/Dans les sous dossiers/... dans les fichiers *.java remplacer les fr.llibre.monprojet.R. par R. Clean et Buid ensuite.
9.Synchroniser, Clean, Build (si pas automatique)
Pour recompiler VoirM2j, j'ai créé une nouvelle appli : "Start a new Android Studio project"
et sur la 1ère fenêtre (nom, etc.) j'ai coché la case "Include C++ support", …, choisi "Empty Activity", … et décoché la case "Backwards Compatibility (AppCompat)" pour éviter les problèmes.
Le système génère une appli toute prête qui appelle une routine C++ qui fournit un nom qui sera affiché dans un label.
Les fichier java sont à mettre dans le répertoire xxx/app/src/main/java/fr/llibre/nomappli et les fichiers C/C++ sont à mettre dans xxx/app/src/main/cpp. Dans ce répertoire les fichiers *.cpp sont compilés en C++ et les fichier *.c sont compilés en C.
Fait une nouvelle version M2jView où dans le C j'ai du changer les "long" en "int_32t".