How can I determine Max CPU speed at runtime? I'd like to know the max cpu speed for the processor on an Android system at runtime. I've seen at least a couple different techniques that result in the current cpu clockrate, but not the max.

Root privileges should not be required.
After digging through the source that roxan mentioned a bit, it looks like the following in /proc can tell you what cpu speeds are available and how much time has been spent in each: 

/sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state 

However, it does give some other states that aren't appropriate. For example, on my Samsung Vibrant, I get: 

1400000 0
1300000 0
1200000 0
1000000 214141
800000 40092
400000 25273
200000 6159308
100000 389


But the chip's standard clock is 1 GHz. So it looks like it should be fairly trivial to find the highest listed speed that has a non-zero time to it.

For my purposes, this should be very adequate.

Edit: I've observed that sometimes the order in which the frequencies is listed can vary, so you'll want to iterate through the whole list and find the fastest (as opposed to stopping at the first non-zero).

More Edit: Here's a function that works for me:

/**
 * Get max cpu rate.
 *
 * This works by examining the list of CPU frequencies in the pseudo file
 * "/sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state" and how much time has been spent 
 * in each. It finds the highest non-zero time and assumes that is the maximum frequency (note 
 * that sometimes frequencies higher than that which was designed can be reported.) So it is not
 * impossible that this method will return an incorrect CPU frequency.
 *
 * Also note that (obviously) this will not reflect different CPU cores with different
 * maximum speeds.
 *
 * @return cpu frequency in MHz
 */
public static int getMaxCPUFreqMHz() {

    int maxFreq = -1;
    try {

        RandomAccessFile reader = new RandomAccessFile( "/sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state", "r" );

        boolean done = false;
        while ( ! done ) {
            String line = reader.readLine();
            if ( null == line ) {
                done = true;
                break;
            }
            String[] splits = line.split( "\\s+" );
            assert ( splits.length == 2 );
            int timeInState = Integer.parseInt( splits[1] );
            if ( timeInState &gt; 0 ) {
                int freq = Integer.parseInt( splits[0] ) / 1000;
                if ( freq &gt; maxFreq ) {
                    maxFreq = freq;
                }
            }
        }

    } catch ( IOException ex ) {
        ex.printStackTrace();
    }

    return maxFreq;
}