summaryrefslogtreecommitdiffstats
path: root/pkgs/applications/editors/android-studio-for-platform/common.nix
blob: 9fd53cc5e76cb212e350fe7cc7a8c57398fbb9a6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
{
  channel,
  pname,
  version,
  versionPrefix,
  sha256Hash,
}:

{
  android-tools,
  bash,
  buildFHSEnv,
  coreutils,
  dpkg,
  e2fsprogs,
  fetchurl,
  findutils,
  git,
  gnugrep,
  gnused,
  gnutar,
  gtk3,
  glib,
  gzip,
  fontsConf,
  fontconfig,
  freetype,
  libGL,
  libsecret,
  libx11,
  libxext,
  libxi,
  libxrandr,
  libxrender,
  libxtst,
  makeFontsConf,
  makeWrapper,
  ncurses5,
  openssl,
  ps,
  python3,
  lib,
  stdenv,
  unzip,
  usbutils,
  which,
  runCommand,
  xkeyboard_config,
  zip,
  zlib,
  makeDesktopItem,
  tiling_wm ? false, # if we are using a tiling wm, need to set _JAVA_AWT_WM_NONREPARENTING in wrapper
}:

let
  filename = "asfp-${versionPrefix}-${version}-linux.deb";

  androidStudioForPlatform = stdenv.mkDerivation {
    pname = "${pname}-unwrapped";
    inherit version;

    src = fetchurl {
      url = "https://dl.google.com/android/asfp/${filename}";
      sha256 = sha256Hash;
    };

    nativeBuildInputs = [
      dpkg
      makeWrapper
    ];

    installPhase = ''
      cp -r ./tmp/*/ $out
      wrapProgram $out/bin/studio.sh \
        --set-default JAVA_HOME "$out/jbr" \
        --set QT_XKB_CONFIG_ROOT "${xkeyboard_config}/share/X11/xkb" \
        ${lib.optionalString tiling_wm "--set _JAVA_AWT_WM_NONREPARENTING 1"} \
        --set FONTCONFIG_FILE ${fontsConf} \
        --prefix PATH : "${
          lib.makeBinPath [

            # Checked in studio.sh
            coreutils
            findutils
            gnugrep
            which
            gnused

            # Used during setup wizard
            gnutar
            gzip

            # Runtime stuff
            git
            ps
            usbutils
            android-tools

            # For Soong sync
            openssl
            python3
            unzip
            zip
            e2fsprogs
          ]
        }" \
        --prefix LD_LIBRARY_PATH : "${
          lib.makeLibraryPath [
            # Crash at startup without these
            fontconfig
            freetype
            libxext
            libxi
            libxrender
            libxtst
            libx11

            # Support multiple monitors
            libxrandr

            # For GTKLookAndFeel
            gtk3
            glib

            # For Soong sync
            e2fsprogs

            libsecret
            libGL
          ]
        }"
    '';
  };

  desktopItem = makeDesktopItem {
    name = pname;
    exec = pname;
    icon = pname;
    desktopName = "Android Studio for Platform (${channel} channel)";
    comment = "The official Android IDE for Android platform development";
    categories = [
      "Development"
      "IDE"
    ];
    startupNotify = true;
    startupWMClass = "jetbrains-studio";
  };

  # Android Studio for Platform downloads prebuilt binaries as part of the SDK. These tools
  # (e.g. `mksdcard`) have `/lib/ld-linux.so.2` set as the interpreter. An FHS
  # environment is used as a work around for that.
  fhsEnv = buildFHSEnv {
    pname = "${pname}-fhs-env";
    inherit version;
    multiPkgs = pkgs: [
      zlib
      ncurses5
      ncurses5.dev
    ];
    profile = ''
      export ALLOW_NINJA_ENV=true
      export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib:/usr/lib32
    '';
  };
in
runCommand "${pname}-${version}"
  {
    inherit pname version;
    startScript = ''
      #!${bash}/bin/bash
      ${lib.getExe fhsEnv} ${androidStudioForPlatform}/bin/studio.sh "$@"
    '';
    preferLocalBuild = true;
    allowSubstitutes = false;
    passthru = {
      unwrapped = androidStudioForPlatform;
    };
    meta = {
      description = "Official IDE for Android platform development";
      longDescription = ''
        Android Studio for Platform (ASfP) is the version of the Android Studio IDE
        for Android Open Source Project (AOSP) platform developers who build with the Soong build system.
      '';
      homepage = "https://developer.android.com/studio/platform.html";
      license = with lib.licenses; [
        asl20
        unfree
      ]; # The code is under Apache-2.0, but:
      # If one selects Help -> Licenses in Android Studio, the dialog shows the following:
      # "Android Studio includes proprietary code subject to separate license,
      # including JetBrains CLion(R) (www.jetbrains.com/clion) and IntelliJ(R)
      # IDEA Community Edition (www.jetbrains.com/idea)."
      # Also: For actual development the Android SDK is required and the Google
      # binaries are also distributed as proprietary software (unlike the
      # source-code itself).
      platforms = [ "x86_64-linux" ];
      maintainers = with lib.maintainers; [ robbins ];
      teams = [ lib.teams.android ];
      mainProgram = pname;
    };
  }
  ''
    mkdir -p $out/{bin,share/pixmaps}

    echo -n "$startScript" > $out/bin/${pname}
    chmod +x $out/bin/${pname}

    ln -s ${androidStudioForPlatform}/bin/studio.png $out/share/pixmaps/${pname}.png
    ln -s ${desktopItem}/share/applications $out/share/applications
  ''