blob: a9470d494a4fa58249dd61a364fd0292c1e330bd [file] [log] [blame]
/* Copyright (C) 2008 The Android Open Source Project
**
** This software is licensed under the terms of the GNU General Public
** License version 2, as published by the Free Software Foundation, and
** may be copied, distributed, and modified under those terms.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
*/
#include "android/avd/hw-config.h"
#include "android/utils/debug.h"
#include "android/utils/ini.h"
#include "android/utils/system.h"
#include <string.h>
#include <stdlib.h>
/* the global variable containing the hardware config for this device */
AndroidHwConfig android_hw[1];
static int
stringToBoolean( const char* value )
{
if (!strcmp(value,"1") ||
!strcmp(value,"yes") ||
!strcmp(value,"YES") ||
!strcmp(value,"true") ||
!strcmp(value,"TRUE"))
{
return 1;
}
else
return 0;
}
static int64_t
diskSizeToInt64( const char* diskSize )
{
char* end;
int64_t value;
value = strtoll(diskSize, &end, 10);
if (*end == 'k' || *end == 'K')
value *= 1024ULL;
else if (*end == 'm' || *end == 'M')
value *= 1024*1024ULL;
else if (*end == 'g' || *end == 'G')
value *= 1024*1024*1024ULL;
return value;
}
void
androidHwConfig_init( AndroidHwConfig* config,
int apiLevel )
{
#define HWCFG_BOOL(n,s,d,a,t) config->n = stringToBoolean(d);
#define HWCFG_INT(n,s,d,a,t) config->n = d;
#define HWCFG_STRING(n,s,d,a,t) config->n = ASTRDUP(d);
#define HWCFG_DOUBLE(n,s,d,a,t) config->n = d;
#define HWCFG_DISKSIZE(n,s,d,a,t) config->n = diskSizeToInt64(d);
#include "android/avd/hw-config-defs.h"
/* Special case for hw.keyboard.lid, we need to set the
* default to FALSE for apiLevel >= 12. This allows platform builds
* to get correct orientation emulation even if they don't bring
* a custom hardware.ini
*/
if (apiLevel >= 12) {
config->hw_keyboard_lid = 0;
}
}
int androidHwConfig_read(AndroidHwConfig* config, CIniFile* ini) {
if (ini == NULL)
return -1;
/* use the magic of macros to implement the hardware configuration loaded */
#define HWCFG_BOOL(n,s,d,a,t) if (iniFile_hasKey(ini, s)) { config->n = iniFile_getBoolean(ini, s, d); }
#define HWCFG_INT(n,s,d,a,t) if (iniFile_hasKey(ini, s)) { config->n = iniFile_getInteger(ini, s, d); }
#define HWCFG_STRING(n,s,d,a,t) if (iniFile_hasKey(ini, s)) { AFREE(config->n); config->n = iniFile_getString(ini, s, d); }
#define HWCFG_DOUBLE(n,s,d,a,t) if (iniFile_hasKey(ini, s)) { config->n = iniFile_getDouble(ini, s, d); }
#define HWCFG_DISKSIZE(n,s,d,a,t) if (iniFile_hasKey(ini, s)) { config->n = iniFile_getDiskSize(ini, s, d); }
#include "android/avd/hw-config-defs.h"
// Special case for the SD-Card, the AVD Manager can incorrectly create
// a new AVD with 'sdcard.size=<size>' and 'hw.sdCard=no'. It's not sure
// whether this occurs when updating an AVD settings or not, but it has
// been described in:
// https://code.google.com/p/android/issues/detail?id=68429
//
// 'sdcard.size' is not a hardware property, so look it up directly in
// the initFile() here and override a negative hw.sdCard value if it
// is strictly positive.
if (!config->hw_sdCard) {
if (iniFile_getDiskSize(ini, "sdcard.size", "0") > 0) {
VERBOSE_PRINT(init, "Overriding hw.sdCard to 'true' due to positive sdcard.size value!");
config->hw_sdCard = true;
}
}
return 0;
}
int androidHwConfig_write(AndroidHwConfig* config, CIniFile* ini) {
if (ini == NULL)
return -1;
/* use the magic of macros to implement the hardware configuration loaded */
#define HWCFG_BOOL(n,s,d,a,t) iniFile_setBoolean(ini, s, config->n);
#define HWCFG_INT(n,s,d,a,t) iniFile_setInteger(ini, s, config->n);
#define HWCFG_STRING(n,s,d,a,t) iniFile_setValue(ini, s, config->n);
#define HWCFG_DOUBLE(n,s,d,a,t) iniFile_setDouble(ini, s, config->n);
#define HWCFG_DISKSIZE(n,s,d,a,t) iniFile_setDiskSize(ini, s, config->n);
#include "android/avd/hw-config-defs.h"
return 0;
}
void
androidHwConfig_done( AndroidHwConfig* config )
{
#define HWCFG_BOOL(n,s,d,a,t) config->n = 0;
#define HWCFG_INT(n,s,d,a,t) config->n = 0;
#define HWCFG_STRING(n,s,d,a,t) AFREE(config->n);
#define HWCFG_DOUBLE(n,s,d,a,t) config->n = 0.0;
#define HWCFG_DISKSIZE(n,s,d,a,t) config->n = 0;
#include "android/avd/hw-config-defs.h"
}
int
androidHwConfig_isScreenNoTouch( AndroidHwConfig* config )
{
return strcmp(config->hw_screen, "no-touch") == 0;
}
int
androidHwConfig_isScreenTouch( AndroidHwConfig* config )
{
return strcmp(config->hw_screen, "touch") == 0;
}
int
androidHwConfig_isScreenMultiTouch( AndroidHwConfig* config )
{
return strcmp(config->hw_screen, "multi-touch") == 0;
}
hwLcd_screenSize_t
androidHwConfig_getScreenSize( AndroidHwConfig* config )
{
return hwLcd_getScreenSize(config->hw_lcd_height, config->hw_lcd_height,
config->hw_lcd_density);
}
int androidHwConfig_getMinVmHeapSize(AndroidHwConfig* config, int apiLevel) {
int minVMHeapSize = 16;
hwLcd_screenSize_t screenSize = androidHwConfig_getScreenSize(config);
// Taken from requirements in CDD Documents on VM/Runtime Compatibility
// TODO: android wear minimums
if (apiLevel >= 23) {
if (screenSize >= LCD_SIZE_XLARGE) {
// TODO(zyy): emulator currently is unable to allocate a heap this
// big, so it gets reduced to 576 in main-common.c
if (config->hw_lcd_density >= LCD_DENSITY_XXXHDPI) {
minVMHeapSize = 768;
} else if (config->hw_lcd_density >= LCD_DENSITY_560DPI) {
minVMHeapSize = 576;
} else if (config->hw_lcd_density >= LCD_DENSITY_XXHDPI) {
minVMHeapSize = 384;
} else if (config->hw_lcd_density >= LCD_DENSITY_420DPI) {
minVMHeapSize = 336;
} else if (config->hw_lcd_density >= LCD_DENSITY_400DPI) {
minVMHeapSize = 288;
} else if (config->hw_lcd_density >= LCD_DENSITY_360DPI) {
minVMHeapSize = 240;
} else if (config->hw_lcd_density >= LCD_DENSITY_XHDPI) {
minVMHeapSize = 192;
} else if (config->hw_lcd_density >= LCD_DENSITY_280DPI) {
minVMHeapSize = 144;
} else if (config->hw_lcd_density >= LCD_DENSITY_HDPI) {
minVMHeapSize = 96;
} else if (config->hw_lcd_density >= LCD_DENSITY_TVDPI) {
minVMHeapSize = 96;
} else if (config->hw_lcd_density >= LCD_DENSITY_MDPI) {
minVMHeapSize = 80;
} else {
minVMHeapSize = 48;
}
} else if (screenSize >= LCD_SIZE_LARGE) {
if (config->hw_lcd_density >= LCD_DENSITY_XXXHDPI) {
minVMHeapSize = 512;
} else if (config->hw_lcd_density >= LCD_DENSITY_560DPI) {
minVMHeapSize = 384;
} else if (config->hw_lcd_density >= LCD_DENSITY_XXHDPI) {
minVMHeapSize = 256;
} else if (config->hw_lcd_density >= LCD_DENSITY_420DPI) {
minVMHeapSize = 228;
} else if (config->hw_lcd_density >= LCD_DENSITY_400DPI) {
minVMHeapSize = 192;
} else if (config->hw_lcd_density >= LCD_DENSITY_360DPI) {
minVMHeapSize = 160;
} else if (config->hw_lcd_density >= LCD_DENSITY_XHDPI) {
minVMHeapSize = 128;
} else if (config->hw_lcd_density >= LCD_DENSITY_280DPI) {
minVMHeapSize = 96;
} else if (config->hw_lcd_density >= LCD_DENSITY_HDPI) {
minVMHeapSize = 80;
} else if (config->hw_lcd_density >= LCD_DENSITY_TVDPI) {
minVMHeapSize = 80;
} else if (config->hw_lcd_density >= LCD_DENSITY_MDPI) {
minVMHeapSize = 48;
} else {
minVMHeapSize = 32;
}
} else { // screenSize >= LCD_SIZE_SMALL
if (config->hw_lcd_density >= LCD_DENSITY_XXXHDPI) {
minVMHeapSize = 256;
} else if (config->hw_lcd_density >= LCD_DENSITY_560DPI) {
minVMHeapSize = 192;
} else if (config->hw_lcd_density >= LCD_DENSITY_XXHDPI) {
minVMHeapSize = 128;
} else if (config->hw_lcd_density >= LCD_DENSITY_420DPI) {
minVMHeapSize = 112;
} else if (config->hw_lcd_density >= LCD_DENSITY_400DPI) {
minVMHeapSize = 96;
} else if (config->hw_lcd_density >= LCD_DENSITY_360DPI) {
minVMHeapSize = 80;
} else if (config->hw_lcd_density >= LCD_DENSITY_XHDPI) {
minVMHeapSize = 80;
} else if (config->hw_lcd_density >= LCD_DENSITY_280DPI) {
minVMHeapSize = 48;
} else if (config->hw_lcd_density >= LCD_DENSITY_HDPI) {
minVMHeapSize = 48;
} else if (config->hw_lcd_density >= LCD_DENSITY_TVDPI) {
minVMHeapSize = 48;
} else if (config->hw_lcd_density >= LCD_DENSITY_MDPI) {
minVMHeapSize = 32;
} else {
minVMHeapSize = 32;
}
}
} else if (apiLevel >= 22) {
if (screenSize >= LCD_SIZE_XLARGE) {
if (config->hw_lcd_density >= LCD_DENSITY_XXXHDPI) {
minVMHeapSize = 768;
} else if (config->hw_lcd_density >= LCD_DENSITY_560DPI) {
minVMHeapSize = 576;
} else if (config->hw_lcd_density >= LCD_DENSITY_XXHDPI) {
minVMHeapSize = 384;
} else if (config->hw_lcd_density >= LCD_DENSITY_400DPI) {
minVMHeapSize = 288;
} else if (config->hw_lcd_density >= LCD_DENSITY_XHDPI) {
minVMHeapSize = 192;
} else if (config->hw_lcd_density >= LCD_DENSITY_280DPI) {
minVMHeapSize = 144;
} else if (config->hw_lcd_density >= LCD_DENSITY_HDPI) {
minVMHeapSize = 96;
} else if (config->hw_lcd_density >= LCD_DENSITY_TVDPI) {
minVMHeapSize = 96;
} else if (config->hw_lcd_density >= LCD_DENSITY_MDPI) {
minVMHeapSize = 80;
} else {
minVMHeapSize = 48;
}
} else if (screenSize >= LCD_SIZE_LARGE) {
if (config->hw_lcd_density >= LCD_DENSITY_XXXHDPI) {
minVMHeapSize = 512;
} else if (config->hw_lcd_density >= LCD_DENSITY_560DPI) {
minVMHeapSize = 384;
} else if (config->hw_lcd_density >= LCD_DENSITY_XXHDPI) {
minVMHeapSize = 256;
} else if (config->hw_lcd_density >= LCD_DENSITY_400DPI) {
minVMHeapSize = 192;
} else if (config->hw_lcd_density >= LCD_DENSITY_XHDPI) {
minVMHeapSize = 128;
} else if (config->hw_lcd_density >= LCD_DENSITY_280DPI) {
minVMHeapSize = 96;
} else if (config->hw_lcd_density >= LCD_DENSITY_HDPI) {
minVMHeapSize = 80;
} else if (config->hw_lcd_density >= LCD_DENSITY_TVDPI) {
minVMHeapSize = 80;
} else if (config->hw_lcd_density >= LCD_DENSITY_MDPI) {
minVMHeapSize = 48;
} else {
minVMHeapSize = 32;
}
} else { // screenSize >= LCD_SIZE_SMALL
if (config->hw_lcd_density >= LCD_DENSITY_XXXHDPI) {
minVMHeapSize = 256;
} else if (config->hw_lcd_density >= LCD_DENSITY_560DPI) {
minVMHeapSize = 192;
} else if (config->hw_lcd_density >= LCD_DENSITY_XXHDPI) {
minVMHeapSize = 128;
} else if (config->hw_lcd_density >= LCD_DENSITY_400DPI) {
minVMHeapSize = 96;
} else if (config->hw_lcd_density >= LCD_DENSITY_XHDPI) {
minVMHeapSize = 80;
} else if (config->hw_lcd_density >= LCD_DENSITY_280DPI) {
minVMHeapSize = 48;
} else if (config->hw_lcd_density >= LCD_DENSITY_HDPI) {
minVMHeapSize = 48;
} else if (config->hw_lcd_density >= LCD_DENSITY_TVDPI) {
minVMHeapSize = 48;
} else if (config->hw_lcd_density >= LCD_DENSITY_MDPI) {
minVMHeapSize = 32;
} else {
minVMHeapSize = 32;
}
}
}
else if (apiLevel >= 21) {
if (screenSize >= LCD_SIZE_XLARGE) {
if (config->hw_lcd_density >= LCD_DENSITY_XXXHDPI) {
minVMHeapSize = 768;
} else if (config->hw_lcd_density >= LCD_DENSITY_560DPI) {
minVMHeapSize = 576;
} else if (config->hw_lcd_density >= LCD_DENSITY_XXHDPI) {
minVMHeapSize = 384;
} else if (config->hw_lcd_density >= LCD_DENSITY_400DPI) {
minVMHeapSize = 288;
} else if (config->hw_lcd_density >= LCD_DENSITY_XHDPI) {
minVMHeapSize = 192;
} else if (config->hw_lcd_density >= LCD_DENSITY_HDPI) {
minVMHeapSize = 96;
} else if (config->hw_lcd_density >= LCD_DENSITY_TVDPI) {
minVMHeapSize = 96;
} else {
minVMHeapSize = 64;
}
} else if (screenSize >= LCD_SIZE_LARGE) {
if (config->hw_lcd_density >= LCD_DENSITY_XXXHDPI) {
minVMHeapSize = 512;
} else if (config->hw_lcd_density >= LCD_DENSITY_560DPI) {
minVMHeapSize = 384;
} else if (config->hw_lcd_density >= LCD_DENSITY_XXHDPI) {
minVMHeapSize = 256;
} else if (config->hw_lcd_density >= LCD_DENSITY_400DPI) {
minVMHeapSize = 192;
} else if (config->hw_lcd_density >= LCD_DENSITY_XHDPI) {
minVMHeapSize = 128;
} else if (config->hw_lcd_density >= LCD_DENSITY_HDPI) {
minVMHeapSize = 64;
} else if (config->hw_lcd_density >= LCD_DENSITY_TVDPI) {
minVMHeapSize = 64;
} else if (config->hw_lcd_density >= LCD_DENSITY_MDPI) {
minVMHeapSize = 32;
} else {
minVMHeapSize = 16;
}
} else { // screenSize >= LCD_SIZE_SMALL
if (config->hw_lcd_density >= LCD_DENSITY_XXXHDPI) {
minVMHeapSize = 256;
} else if (config->hw_lcd_density >= LCD_DENSITY_560DPI) {
minVMHeapSize = 192;
} else if (config->hw_lcd_density >= LCD_DENSITY_XXHDPI) {
minVMHeapSize = 128;
} else if (config->hw_lcd_density >= LCD_DENSITY_400DPI) {
minVMHeapSize = 96;
} else if (config->hw_lcd_density >= LCD_DENSITY_XHDPI) {
minVMHeapSize = 64;
} else if (config->hw_lcd_density >= LCD_DENSITY_HDPI) {
minVMHeapSize = 32;
} else if (config->hw_lcd_density >= LCD_DENSITY_TVDPI) {
minVMHeapSize = 32;
} else if (config->hw_lcd_density >= LCD_DENSITY_MDPI) {
minVMHeapSize = 16;
} else {
minVMHeapSize = 16;
}
}
} else if (apiLevel >= 19) {
if (screenSize >= LCD_SIZE_XLARGE) {
if (config->hw_lcd_density >= LCD_DENSITY_XXHDPI) {
minVMHeapSize = 256;
} else if (config->hw_lcd_density >= LCD_DENSITY_400DPI) {
minVMHeapSize = 192;
} else if (config->hw_lcd_density >= LCD_DENSITY_XHDPI) {
minVMHeapSize = 128;
} else if (config->hw_lcd_density >= LCD_DENSITY_HDPI) {
minVMHeapSize = 64;
} else if (config->hw_lcd_density >= LCD_DENSITY_TVDPI) {
minVMHeapSize = 64;
} else {
minVMHeapSize = 32;
}
} else { // screenSize >= LCD_SIZE_SMALL
if (config->hw_lcd_density >= LCD_DENSITY_XXHDPI) {
minVMHeapSize = 128;
} else if (config->hw_lcd_density >= LCD_DENSITY_400DPI) {
minVMHeapSize = 96;
} else if (config->hw_lcd_density >= LCD_DENSITY_XHDPI) {
minVMHeapSize = 64;
} else if (config->hw_lcd_density >= LCD_DENSITY_HDPI) {
minVMHeapSize = 32;
} else if (config->hw_lcd_density >= LCD_DENSITY_TVDPI) {
minVMHeapSize = 32;
} else if (config->hw_lcd_density >= LCD_DENSITY_MDPI) {
minVMHeapSize = 16;
} else {
minVMHeapSize = 16;
}
}
} else if (apiLevel >= 14) {
if (screenSize >= LCD_SIZE_XLARGE) {
if (config->hw_lcd_density >= LCD_DENSITY_XHDPI) {
minVMHeapSize = 128;
} else if (config->hw_lcd_density >= LCD_DENSITY_HDPI) {
minVMHeapSize = 64;
} else if (config->hw_lcd_density >= LCD_DENSITY_TVDPI) {
minVMHeapSize = 64;
} else {
minVMHeapSize = 32;
}
} else { // screenSize >= LCD_SIZE_SMALL
if (config->hw_lcd_density >= LCD_DENSITY_XHDPI) {
minVMHeapSize = 64;
} else if (config->hw_lcd_density >= LCD_DENSITY_HDPI) {
minVMHeapSize = 32;
} else if (config->hw_lcd_density >= LCD_DENSITY_TVDPI) {
minVMHeapSize = 32;
} else if (config->hw_lcd_density >= LCD_DENSITY_MDPI) {
minVMHeapSize = 16;
} else {
minVMHeapSize = 16;
}
}
} else if (apiLevel >= 7) {
if (config->hw_lcd_density >= 240) {
minVMHeapSize = 24;
} else {
minVMHeapSize = 16;
}
} else {
minVMHeapSize = 16;
}
return minVMHeapSize;
}
int androidHwConfig_getKernelDeviceNaming(AndroidHwConfig* config) {
if (!strcmp(config->kernel_newDeviceNaming, "no"))
return 0;
if (!strcmp(config->kernel_newDeviceNaming, "yes"))
return 1;
return -1;
}
int
androidHwConfig_getKernelYaffs2Support( AndroidHwConfig* config )
{
if (!strcmp(config->kernel_supportsYaffs2, "no"))
return 0;
if (!strcmp(config->kernel_supportsYaffs2, "yes"))
return 1;
return -1;
}
const char* androidHwConfig_getKernelSerialPrefix(AndroidHwConfig* config )
{
if (androidHwConfig_getKernelDeviceNaming(config) >= 1) {
return "ttyGF";
} else {
return "ttyS";
}
}