[JAVA] Programme de régime avec préprocesseur (comment gérer la taille i-appli)

Actuellement, la plupart des appareils mobiles sont des iPhone et des androïdes pour smartphone. Connaissez-vous la limite supérieure de la taille de chaque application? En août 2020, l'application iOS fait 4 Go et l'application Android 100 Mo.

En regardant cela, il y a une grande différence ... Je me demande si Android utilise une méthode pour télécharger des données ultérieurement pour les jeux de grande capacité. Je n'ai pas écrit le tas en détail, mais comme le terminal a quelques Go de mémoire, cela ne devrait pas être un gros problème.

Cependant, ce dont je voudrais parler cette fois, c'est du futur téléphone (= Garakei), qui était actif en tant que pilier avant la naissance des smartphones, et l'histoire de l'i-appli de DoCoMo.

Je voudrais vous présenter que la première méthode de développement de l'i-appli de DoCoMo a été le résultat d'efforts en larmes.

Taille Docomo i-appli

Le temps remonte à l'époque de Garake. Je reconnais que c'est l'i-appli de Docomo qui a tiré le monde des applications de Garake, mais quelle était la limite supérieure de taille à ce moment-là?

Voici les informations de l'application sur le profil DoJa-1.0 qui a été publié au début.

Modèle Taille de l'application (Ko) Capacité du tas(KB)
FOMA N2001 10 96
FOMA N2002 10 560
FOMA P2101V 30 1100
FOMA D2101V 10 128
FOMA P2002 10 560
FOMA SH2101V 30 1024
FOMA T2101V 30 1105

Page Officielle https://www.nttdocomo.co.jp/service/developer/make/content/spec/iappli/#notice05

La taille minimale de l'application était de 10 Ko et la capacité du segment de mémoire était de 96 Ko. Il y a un tas natif séparé, et il semble que la mémoire côté terminal puisse être un peu utilisée, mais cette capacité dans la partie Java pure.

La taille de l'application est un fichier Jar qui comprend des octets compilés à partir de code et de ressources telles que des images. Cela était limité à 10 Ko (10240 octets).

Vous pouvez seulement en être conscient, alors vérifions combien c'est. Cependant, il est difficile de créer un environnement de développement i-appli, nous comparerons donc les tailles des applications Android à partir d'août 2020.

Je pense que j'ai choisi une application qui semble avoir relativement peu de fonctions, mais les unités MB sont naturelles. Étant donné que les choses et les temps sont différents, il n'est pas possible de faire une comparaison générale, mais je ne peux pas imaginer que cela rentre dans 10 Ko.

Code de développement d'application précoce

Je sais que la taille de l'i-appli est extrêmement stricte, mais je me demande comment cela a été fait. Le seul élément à gratter est le programme.

Il est vrai que vous ne pouvez pas faire ce que vous voulez car vous manquerez de fonctionnalités si vous coupez le programme, mais il existe un moyen de réduire la taille sans réduire les fonctionnalités. Cela permet de réduire la taille des noms de variables, des noms de classes et des noms de méthodes.

Le code est écrit de manière assez appropriée, mais par exemple, il ressemble à ceci.

Changer avant


public class MainFrame {
 
    private static final String TITLE = "Exemple d'application";
    private static final String ERROR_MESSAGE = "Une erreur est survenue";
 
    public void showFrame() {
        try {
            //Certains traitements
        } catch (Exception e) {
            showMessage(ERROR_MESSAGE);
        }        
    }
 
    public void showMessage(String message) {
        //Traitement de l'affichage des messages
    }
}

Après le changement


public class F {
 
    private static final String A = "Exemple d'application";
    private static final String B = "Une erreur est survenue";
 
    public void s() {
        try {
            //Certains traitements
        } catch (Exception e) {
            m(B);
        }
    }
 
    public void m(String s) {
        //Traitement de l'affichage des messages
    }
}

Si vous réduisez le nombre de caractères dans le nom de la variable et le nom de la méthode, le nombre de caractères écrits dans le fichier de classe compilé diminuera, vous pouvez donc vous attendre à une réduction de taille. Quoi qu'il en soit, c'est un programme d'économie d'énergie.

Avec un programme de cette taille, ce n'est pas illisible, mais il est évident que plus on le construit, plus il s'aggrave. Comment avez-vous résolu ce problème?

Préprocesseur + Java

Après avoir réduit sa sagesse, ses prédécesseurs ont décidé d'utiliser quelque chose que le langage Java n'utilise pas. C'est un préprocesseur souvent utilisé dans les langages C.

Plus précisément, écrivez le code suivant.

Code de version du préprocesseur


#define _MainFrame     F
#define _TITLE         A
#define _ERROR_MESSAGE B
#define _showFrame     s
#define _showMessage   m
  
public class _MainFrame {

    private static final String _TITLE = "Exemple d'application";
    private static final String _ERROR_MESSAGE = "Une erreur est survenue";

    public void _showFrame() {
        try {
            //Certains traitements
        } catch (Exception e) {
            _showMessage(_ERROR_MESSAGE);
        }
    }

    public void _showMessage(String s) {
        //Traitement de l'affichage des messages
    }
}

La syntaxe ci-dessous signifie la conversion de la lettre "_MainFrame" en lettre "F".

python


#define _MainFrame     F

Cette partie n'est pas de la syntaxe Java, donc bien sûr, elle ne peut pas être compilée par le compilateur Java. Alors passons par le préprocesseur. Ensuite, le code suivant est terminé.

public class F {
  
    private final String A = "Exemple d'application";
    private final String B = "Une erreur est survenue";
  
    public void s() {
        try {
            //Certains traitements
        } catch (Exception e) {
            m(B);
        }
    }
  
    public void m(String s) {
        //Traitement de l'affichage des messages
    }
}

Maintenant que vous pouvez le compiler, tout ce que vous avez à faire est de le construire normalement.

De cette façon, vous pouvez réduire la taille du code avec des macros tout en augmentant la lisibilité en passant le code en deux étapes: préprocesseur → compilateur Java. Je pense que c'était difficile car je ne peux pas utiliser l'IDE.

finalement

Cet article est basé sur l'idée d'utiliser un préprocesseur que j'ai vu sur un autre site il y a près de 10 ans. Le site n'existe plus, mais je l'ai écrit parce que je voulais garder l'idée.

Recommended Posts

Programme de régime avec préprocesseur (comment gérer la taille i-appli)
[Rails / RSpec] Comment traiter l'élément a une erreur de taille nulle
[Android] Comment gérer les thèmes sombres
Comment gérer les actifs de précompilation a échoué.
Comment traiter Aucun modèle de demande interactive
[Environnement Docker] Comment gérer ActiveSupport :: MessageEncryptor :: InvalidMessage
[Rails] Comment gérer les modifications d'URL après le rendu
Comment numéroter (nombre) avec html.erb
Comment mettre à jour avec activerecord-import
Comment gérer l'erreur ERREUR: lors de l'exécution de gem ... (Gem :: FilePermissionError)
Comment gérer Bundler :: Dsl :: DSLError en réécrivant gemfile
Comment gérer différentes versions de rbenv et Ruby
Comment démarrer avec Slim
Comment entourer n'importe quel caractère avec "~"
Android: Comment gérer "Impossible de déterminer la version Java à partir de '10 .0.1 '"
Comment utiliser mssql-tools avec Alpine
Project facet Java version 13 n'est pas pris en charge. Comment faire avec
Comment gérer le type auquel j'ai pensé en écrivant un programme Java pendant 2 ans
Comment démarrer Camunda avec Docker
Java8 / 9 Beginners: Streaming API addiction points et comment les gérer
Comment recadrer une image avec libGDX
Comment ajuster TextPosition avec l'extension de clavier iOS
Comment partager des fichiers avec Docker Toolbox
Comment compiler Java avec VsCode & Ant
[Java] Résumez comment comparer avec la méthode equals
Comment utiliser BootStrap avec Play Framework
Comment changer d'images miniatures avec JavaScript
[Note] Comment démarrer avec Rspec
[Introduction à Java] Comment écrire un programme Java
Longueur, taille, nombre de rubis Comment utiliser
[Java] Comment mesurer le temps d'exécution du programme
Comment faire un contrôle basé sur l'API avec cancancan
Comment réaliser le téléchargement de fichiers avec Feign
Comment mettre à jour les modèles associés avec accepte_nested_attributes_for
Comment définir JAVA_HOME avec l'appassembler-maven-plugin de Maven
Comment implémenter TextInputLayout avec la fonction de validation
Comment gérer les erreurs de connexion avec l'appareil
Comment supprimer des données avec une clé externe
Comment tester l'étendue privée avec JUnit
Comment surveiller nginx avec docker-compose avec datadog
Comment réaliser le téléchargement de fichiers avec Feign
Comment exécuter Blazor (C #) avec Docker
Comment créer un environnement Rails 6 avec Docker
[Laravel] Comment gérer une erreur de mémoire insuffisante lorsque le compositeur a besoin de [Docker]
Défi pour gérer les caractères déformés avec Java AudioSystem.getMixerInfo ()
Comment télécharger Oracle JDK 8 rpm avec curl
[Java] Comment tester s'il est nul dans JUnit
Comment se moquer de chaque cas avec Mockito 1x
Comment se moquer de chaque cas avec PowerMock + Mockito1x
Comment utiliser MyBatis2 (iBatis) avec Spring Boot 1.4 (Spring 4)
Comment enregistrer dans plusieurs tables avec une seule entrée
Comment tester les interruptions pendant Thread.sleep avec JUnit
Comment utiliser h2db intégré avec Spring Boot