Das Java -Hilfsprogramm für die Android -Installation
Zum automatischen Abrufen und Entpacken der benötigten Dateien des JDK wird die folgende Java -Quelldatei verwendet, welche im Arbeitsverzeichnis anzulegen ist.
Da der Quellcode dieses Java -Hilfsprogramm hier lesbar ist, kann sich der Verwender davon überzeugen, daß dieses Programm nur die angeforderten Dateien auf die Festplatte kopiert und keine versteckten Funktionen enthält.
Please.java
public class Please
{ public static byte[] buffer = new byte[ 65536 ]; public static void download( final java.lang.String[] args
/* source URI, target file, number of blocks */ )throws java.io.IOException
{ java.lang.System.err.println( "download " + java.util.Arrays.toString( args ));
final java.io.InputStream input = new java.net.URL( args[ 0 ]).openStream();
final java.io.OutputStream output = new java.io.FileOutputStream( args[ 1 ]);
int i = 0; for( boolean looping = true; looping; )
{ final int count = input.read( buffer );
if( ++i % 100 == 0 ){ if( args.length > 2 )
java.lang.System.out.printf( "%9d/%s%n", i, args[ 2 ]);
else java.lang.System.out.printf( "%9d/%n", i ); }
if( count < 0 )looping = false; else output.write( buffer, 0, count ); }
input.close(); output.close(); } public static void extract( final java.lang.String[] args
/* source file, target dir */ )throws java.io.IOException
{ java.lang.System.err.println( "unzip " + java.util.Arrays.toString( args ));
final java.util.zip.ZipInputStream input = new java.util.zip.ZipInputStream
( new java.io.FileInputStream( args[ 0 ]));
{ final java.io.File folder = new java.io.File( args[ 1 ]);
if( !folder.exists() )folder.mkdir(); }
java.util.zip.ZipEntry entry = input.getNextEntry();
while( entry != null ){ if( !entry.isDirectory() )
{ final java.lang.String name = entry.getName();
final java.io.File file
= new java.io.File( args[ 1 ]+ java.io.File.separator + name );
java.io.File parent = new java.io.File( file.getParent() );
if( !parent.exists() )parent.mkdirs();
{ final java.io.FileOutputStream output = new java.io.FileOutputStream( file );
for( int length;( length = input.read( buffer )) > 0; )
output.write( buffer, 0, length );
output.close(); }} input.closeEntry(); entry = input.getNextEntry(); }} public static void create( final java.lang.String[] args /* target file */ )
throws java.io.IOException
{ final java.io.File outFile = new java.io.File( args[ 0 ]);
final java.io.PrintWriter out =
new java.io.PrintWriter( new java.io.FileOutputStream( outFile ), true );
/* file must be rendered exactly with specific binary line terminators */
out.println( "avd.ini.encoding=ISO-8859-1\n" );
out.println( "hw.dPad=yes\n" ); /* was: "hw.dPad=no\n" */
out.println( "hw.lcd.density=160\n" );
out.println( "hw.cpu.arch=arm\n" );
out.println( "hw.device.hash=-1537072293\n" );
out.println( "disk.dataPartition.size=256M\n" );
out.println( "skin.dynamic=yes\n" );
out.println( "skin.path=1024x600\n" );
out.println( "hw.keyboard=yes\n" ); /* use host device keyboard? */
out.println( "hw.cpu.model=cortex-a8\n" );
out.println( "hw.ramSize=699\n" ); /* 512 zu wenig fuer launcher? */
out.println( "hw.device.manufacturer=Generic\n" );
out.println( "hw.sdCard=yes\n" );
out.println( "sdCard.size=256M\n" ); /* for camera! */
out.println( "hw.mainKeys=no\n" ); /* do NOT want main keys? */
out.println( "hw.accelerometer=yes\n" );
out.println( "skin.name=1024x600\n" );
out.println( "abi.type=armeabi-v7a\n" );
out.println( "hw.trackBall=no\n" );
out.println( "hw.device.name=7in WSVGA (Tablet)\n" );
out.println( "hw.battery=yes\n" );
out.println( "hw.sensors.proximity=yes\n" );
//t.println( "image.sysdir.1=system-images\\android-18\\armeabi-v7a\\\n" );
out.println( "image.sysdir.1=system-images\\android-22\\armeabi-v7a\\\n" );
out.println( "hw.sensors.orientation=yes\n" );
out.println( "hw.audioInput=yes\n" );
out.println( "hw.camera.front=none\n" );
out.println( "hw.gps=yes\n" );
out.println( "vm.heapSize=32\n" ); /* 16 zu wenig fuer launcher? */
out.println( "snapshot.present=true\n" );
out.close(); }
public static void main( final java.lang.String[] args )throws java.io.IOException
{ java.lang.System.err.println( "main" + java.util.Arrays.toString( args ));
java.lang.System.err.println();
if( args.length <= 1 )
{ java.lang.System.out.println( "java please download sourcefileURI targetfilepath" );
java.lang.System.out.println( "java please extract sourcefilepath targetdirpath" );
java.lang.System.out.println( "java please create targetdirpath" ); }
else
{ final java.lang.String[] a = java.util.Arrays.copyOfRange( args, 1, args.length );
switch( args[ 0 ])
{ case "download": download( a ); break;
case "extract": extract( a ); break;
case "create": create( a ); break; }}}}
Testen des Java -Hilfsprogramms
Das folgende Kommandoskript sollte ein Zip -Archiv herkopieren, entpacken und anzeigen. Dies sollte nicht mehr als eine Minute dauern und setzt eine Internetverbindung und die in einer früheren Lektion angelegte Datei »env.cmd« voraus.
pleasetry.cmd
@ECHO %~f0
@CALL "env.cmd"
@SET PLEASE=%JAVA% Please
@SET DOWNLOAD=%PLEASE% download
@SET EXTRACT=%PLEASE% extract
@SET GOOGLE=http://dl.google.com/android/repository
@SET NAME=platform-tools_r19.0.1-windows @%JAVAC% Please.java
@%DOWNLOAD% "%GOOGLE%/%NAME%.zip" "%TEMP%\%NAME%.zip" 100
@%EXTRACT% "%TEMP%\%NAME%.zip" "%TEMP%\%NAME%"
@dir /B/S "%TEMP%\%NAME%" PAUSE- In der Ausgabe sollten dann unter anderem die folgenden Dateien erscheinen
- …
…platform-tools\adb.exe
…platform-tools\AdbWinApi.dll
…platform-tools\AdbWinUsbApi.dll
…
Eine mögliche Ursache für eine Störung könnte eine vorübergehende Nichterreichbarkeit oder Störung des verwendeten Webservers sein. In diesem Fall sollte es helfen, das Skript später noch einmal zu starten.
Das Skript »pleasetry.cmd« wird nach dem Ende dieser Lektion nicht mehr benötigt. Das Java -Hilfsprogramm »Please.java« wird später wieder benötigt.
Klassische Versionen *
Falls die aktuelle Version des Android -SDK Probleme bereiten sollte, kann mit dem folgenden Skript auch eine erprobte klassische Version abgerufen werden. Wenn diese verwendet werden soll, ist in den folgenden Lektionen auch jeweils das Skript für die „klassische Version“ zu verwenden.
Test.cmd
SET JDK=C:\Program Files\Java\jdk1.8.0
SET JAVAC="%JDK%\bin\javac.exe"
SET JAVA="%JDK%\bin\java.exe" %JAVAC% Please.java %JAVA% Please download "http://dl.google.com/android/repository/platform-tools_r18.0.1-windows.zip" ^
"%TEMP%\platform-tools_r18.0.1-windows.zip" 100 %JAVA% Please extract "%TEMP%\platform-tools_r18.0.1-windows.zip" "%TEMP%\platform-tools_r18.0.1-windows" dir /B/S "%TEMP%\platform-tools_r18.0.1-windows" PAUSE
Es folgt noch die klassische Version (2014) von »Please.java« mit der Zahl »18« für den Emulator.
Please.java
public class Please
{ public static byte[] buffer = new byte[ 65536 ]; public static void download( final java.lang.String[] args
/* source URI, target file, number of blocks */ )throws java.io.IOException
{ java.lang.System.err.println( "download " + java.util.Arrays.toString( args ));
final java.io.InputStream input = new java.net.URL( args[ 0 ]).openStream();
final java.io.OutputStream output = new java.io.FileOutputStream( args[ 1 ]);
int i = 0; for( boolean looping = true; looping; )
{ final int count = input.read( buffer );
if( ++i % 100 == 0 ){ if( args.length > 2 )
java.lang.System.out.printf( "%9d/%s%n", i, args[ 2 ]);
else java.lang.System.out.printf( "%9d/%n", i ); }
if( count < 0 )looping = false; else output.write( buffer, 0, count ); }
input.close(); output.close(); } public static void extract( final java.lang.String[] args
/* source file, target dir */ )throws java.io.IOException
{ java.lang.System.err.println( "unzip " + java.util.Arrays.toString( args ));
final java.util.zip.ZipInputStream input = new java.util.zip.ZipInputStream
( new java.io.FileInputStream( args[ 0 ]));
{ final java.io.File folder = new java.io.File( args[ 1 ]);
if( !folder.exists() )folder.mkdir(); }
java.util.zip.ZipEntry entry = input.getNextEntry();
while( entry != null ){ if( !entry.isDirectory() )
{ final java.lang.String name = entry.getName();
final java.io.File file
= new java.io.File( args[ 1 ]+ java.io.File.separator + name );
java.io.File parent = new java.io.File( file.getParent() );
if( !parent.exists() )parent.mkdirs();
{ final java.io.FileOutputStream output = new java.io.FileOutputStream( file );
for( int length;( length = input.read( buffer )) > 0; )
output.write( buffer, 0, length );
output.close(); }} input.closeEntry(); entry = input.getNextEntry(); }} public static void create( final java.lang.String[] args /* target file */ )
throws java.io.IOException
{ final java.io.File outFile = new java.io.File( args[ 0 ]);
final java.io.PrintWriter out =
new java.io.PrintWriter( new java.io.FileOutputStream( outFile ), true );
/* file must be rendered exactly with specific binary line terminators */
out.println( "avd.ini.encoding=ISO-8859-1\n" );
out.println( "hw.dPad=yes\n" ); /* was: "hw.dPad=no\n" */
out.println( "hw.lcd.density=160\n" );
out.println( "sdcard.size=128M\n" );
out.println( "hw.cpu.arch=arm\n" );
out.println( "hw.device.hash=-1537072293\n" );
out.println( "disk.dataPartition.size=200M\n" );
out.println( "skin.dynamic=yes\n" );
out.println( "skin.path=1024x600\n" );
out.println( "hw.keyboard=yes\n" ); /* use host device keyboard? */
out.println( "hw.cpu.model=cortex-a8\n" );
out.println( "hw.ramSize=699\n" ); /* 512 zu wenig fuer launcher? */
out.println( "hw.device.manufacturer=Generic\n" );
out.println( "hw.sdCard=yes\n" );
out.println( "hw.mainKeys=no\n" ); /* do NOT want main keys? */
out.println( "hw.accelerometer=yes\n" );
out.println( "skin.name=1024x600\n" );
out.println( "abi.type=armeabi-v7a\n" );
out.println( "hw.trackBall=no\n" );
out.println( "hw.device.name=7in WSVGA (Tablet)\n" );
out.println( "hw.battery=yes\n" );
out.println( "hw.sensors.proximity=yes\n" );
out.println( "image.sysdir.1=system-images\\android-18\\armeabi-v7a\\\n" );
out.println( "hw.sensors.orientation=yes\n" );
out.println( "hw.audioInput=yes\n" );
out.println( "hw.camera.front=none\n" );
out.println( "hw.gps=yes\n" );
out.println( "vm.heapSize=32\n" ); /* 16 zu wenige fuer launcher? */
out.println( "snapshot.present=true\n" );
out.close(); }
public static void main( final java.lang.String[] args )throws java.io.IOException
{ java.lang.System.err.println( "main" + java.util.Arrays.toString( args ));
java.lang.System.err.println();
if( args.length <= 1 )
{ java.lang.System.out.println( "java please download sourcefileURI targetfilepath" );
java.lang.System.out.println( "java please extract sourcefilepath targetdirpath" );
java.lang.System.out.println( "java please create targetdirpath" ); }
else
{ final java.lang.String[] a = java.util.Arrays.copyOfRange( args, 1, args.length );
switch( args[ 0 ])
{ case "download": download( a ); break;
case "extract": extract( a ); break;
case "create": create( a ); break; }}}}