1175ab1222f20d79675e2c4692af396f1f5975557WenHan Gupackage compiler.abcc; 2175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu 3175ab1222f20d79675e2c4692af396f1f5975557WenHan Guimport android.app.IntentService; 4175ab1222f20d79675e2c4692af396f1f5975557WenHan Guimport android.app.Service; 5175ab1222f20d79675e2c4692af396f1f5975557WenHan Guimport android.content.Intent; 6175ab1222f20d79675e2c4692af396f1f5975557WenHan Guimport android.content.res.AssetManager; 7175ab1222f20d79675e2c4692af396f1f5975557WenHan Guimport android.content.pm.ApplicationInfo; 8175ab1222f20d79675e2c4692af396f1f5975557WenHan Guimport android.content.pm.PackageManager; 9175ab1222f20d79675e2c4692af396f1f5975557WenHan Guimport android.os.Binder; 1035522ee7b84660bce7eb896b92db42ba1ebe00d5WenHan Guimport android.os.Bundle; 11175ab1222f20d79675e2c4692af396f1f5975557WenHan Guimport android.os.IBinder; 12175ab1222f20d79675e2c4692af396f1f5975557WenHan Guimport android.os.Parcel; 13175ab1222f20d79675e2c4692af396f1f5975557WenHan Guimport android.os.ResultReceiver; 14175ab1222f20d79675e2c4692af396f1f5975557WenHan Guimport android.os.RemoteException; 15175ab1222f20d79675e2c4692af396f1f5975557WenHan Guimport android.util.Log; 16175ab1222f20d79675e2c4692af396f1f5975557WenHan Guimport java.io.File; 17175ab1222f20d79675e2c4692af396f1f5975557WenHan Guimport java.io.FilenameFilter; 18175ab1222f20d79675e2c4692af396f1f5975557WenHan Guimport java.io.FileOutputStream; 19175ab1222f20d79675e2c4692af396f1f5975557WenHan Guimport java.io.IOException; 20175ab1222f20d79675e2c4692af396f1f5975557WenHan Guimport java.io.InputStream; 21175ab1222f20d79675e2c4692af396f1f5975557WenHan Guimport java.io.OutputStream; 22175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu 23175ab1222f20d79675e2c4692af396f1f5975557WenHan Gupublic class AbccService extends IntentService { 24175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu private static final String TAG = "AbccService"; 25175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu 26175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu String mWorkingDir = null; 27175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu String mSysroot = null; 28175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu 29175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu // For onBind() 30175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu private IBinder mBinder = new LocalBinder(); 31175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu private int mCurrentStatus = AbccService.STATUS_OKAY; 32175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu private Object mStatusLock = new Object(); 33175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu 34175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu private static int STATUS_OKAY = 0; 35175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu private static int STATUS_WORKING = 1; 36175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu private static int STATUS_ERROR = 2; 37175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu 38175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu class WorkingThread extends Thread { 39175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu @Override 40175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu public void run() { 41175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu Log.i(TAG, "WorkingThread run"); 42175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu 43175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu 44175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu synchronized (mStatusLock) { 45175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu mCurrentStatus = AbccService.STATUS_WORKING; 46175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu if (mWorkingDir == null) { 47175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu mCurrentStatus = AbccService.STATUS_ERROR; 48175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu mStatusLock.notifyAll(); 49175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu return; 50175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu } 51175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu } 52175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu 53175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu Log.i(TAG, "mWorkingDir for genLibs: " + mWorkingDir); 54dbe07395020b7709a242a02e50cb05c065792005Lai Wei-Chih if (genLibs(mWorkingDir, mSysroot) != 0) { 55175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu synchronized (mStatusLock) { 56175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu mCurrentStatus = AbccService.STATUS_ERROR; 57175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu mStatusLock.notifyAll(); 58175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu return; 59175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu } 60175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu } 61175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu 62175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu Log.i(TAG, "WorkingThread run okay"); 63175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu synchronized (mStatusLock) { 64175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu mCurrentStatus = AbccService.STATUS_OKAY; 65175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu mStatusLock.notifyAll(); 66175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu Log.i(TAG, "WorkingThread run done"); 67175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu return; 68175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu } 69175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu } 70175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu } 71175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu 72175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu class LocalBinder extends Binder { 73175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu @Override 74175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu protected boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws RemoteException { 75175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu if (!pingBinder()) { 76175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu Log.e(TAG, "Process doesn't exist. Error!"); 77175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu throw new RemoteException("AbccLocalBinder pingBinder return false!"); 78175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu } 79175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu 8035522ee7b84660bce7eb896b92db42ba1ebe00d5WenHan Gu // The code is not important now. This is just a communication way 8135522ee7b84660bce7eb896b92db42ba1ebe00d5WenHan Gu // and what we really need is the information from @data 8235522ee7b84660bce7eb896b92db42ba1ebe00d5WenHan Gu Bundle real_data = data.readBundle(); 8335522ee7b84660bce7eb896b92db42ba1ebe00d5WenHan Gu if (real_data == null) { 8435522ee7b84660bce7eb896b92db42ba1ebe00d5WenHan Gu Log.e(TAG, "Should get some information from the Parcel."); 8535522ee7b84660bce7eb896b92db42ba1ebe00d5WenHan Gu return false; 8635522ee7b84660bce7eb896b92db42ba1ebe00d5WenHan Gu } 8735522ee7b84660bce7eb896b92db42ba1ebe00d5WenHan Gu String path = real_data.getString("working_dir"); 8835522ee7b84660bce7eb896b92db42ba1ebe00d5WenHan Gu if (path == null ) { 8935522ee7b84660bce7eb896b92db42ba1ebe00d5WenHan Gu Log.e(TAG, "onTransact but no working_dir provided?"); 9035522ee7b84660bce7eb896b92db42ba1ebe00d5WenHan Gu return false; 91175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu } 9235522ee7b84660bce7eb896b92db42ba1ebe00d5WenHan Gu 9335522ee7b84660bce7eb896b92db42ba1ebe00d5WenHan Gu mWorkingDir = path; 9435522ee7b84660bce7eb896b92db42ba1ebe00d5WenHan Gu compileForBinder(); 9535522ee7b84660bce7eb896b92db42ba1ebe00d5WenHan Gu return queryStatusForBinder(); 96175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu } 97175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu } 98175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu 99175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu private boolean compileForBinder() { 100175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu Log.i(TAG, "compileForBinder"); 101175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu new WorkingThread().start(); 102175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu synchronized (mStatusLock) { 103175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu mCurrentStatus = AbccService.STATUS_WORKING; 104175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu } 105175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu Log.i(TAG, "compileForBinder done"); 106175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu return true; 107175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu } 108175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu 109175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu private boolean queryStatusForBinder() { 110175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu Log.i(TAG, "queryStatusForBinder"); 111175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu Log.i(TAG, "mCurrentStatus = " + mCurrentStatus); 112175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu 113175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu while (mCurrentStatus == STATUS_WORKING) { 114175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu try { 115175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu Log.i(TAG, "queryStatusForBinder wait"); 116175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu synchronized (mStatusLock) { 117175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu mStatusLock.wait(); 118175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu } 119175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu } catch (InterruptedException e) { 120175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu } 121175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu } 122175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu 123175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu Log.i(TAG, "queryStatusForBinder checking result"); 124175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu 125175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu if (mCurrentStatus == STATUS_OKAY) 126175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu return true; 127175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu else 128175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu return false; 129175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu } 130175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu 131175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu private void extractIntentInfo(Intent intent) { 132175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu if (intent == null) { 133175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu Log.e(TAG, "Intent should not be null when extractIntentInfo."); 134175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu return; 135175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu } 136175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu 137175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu String path = intent.getStringExtra("working_dir"); 138175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu Log.i(TAG, "Got working_dir from intent: " + path); 139175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu if (path != null) 140175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu mWorkingDir = path; 141175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu else 142175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu Log.e(TAG, "Intent extra 'working_dir' cannot be null."); 143175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu 144175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu path = intent.getStringExtra("toolchain_sysroot"); 145175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu if (path != null) 146175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu mSysroot = path; 147175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu } 148175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu 149175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu private void installToolchain() { 150175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu if (mSysroot != null) { 151175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu // User specify a customized toolchain sysroot, so we don't need to copy. 152175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu return; 153175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu } 154175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu 155175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu // The toolchain is enclosed inside assets/ 156175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu File sysroot = getDir("toolchain_sysroot", MODE_WORLD_READABLE); 157175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu mSysroot = sysroot.getAbsolutePath(); 158175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu File cur_file = new File(mSysroot + "/usr"); 159175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu cur_file.mkdirs(); 160175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu cur_file.setReadable(true, /*OwnerOnly=*/false); 161175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu cur_file.setExecutable(true, /*OwnerOnly=*/false); 162175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu cur_file = new File(mSysroot + "/usr/bin"); 163175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu cur_file.mkdirs(); 164175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu cur_file.setReadable(true, /*OwnerOnly=*/false); 165175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu cur_file.setExecutable(true, /*OwnerOnly=*/false); 166175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu cur_file = new File(mSysroot + "/usr/lib"); 167175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu cur_file.mkdirs(); 168175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu cur_file.setReadable(true, /*OwnerOnly=*/false); 169175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu cur_file.setExecutable(true, /*OwnerOnly=*/false); 170175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu copyAssets("usr/bin", mSysroot + "/usr/bin", /*executable=*/true); 171175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu copyAssets("usr/lib", mSysroot + "/usr/lib", /*executable=*/false); 172175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu } 173175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu 174175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu private void copyAssets(String asset_dir, String out_dir, boolean executable) { 175175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu AssetManager assetManager = getAssets(); 176175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu String[] files = null; 177175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu try { 178175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu files = assetManager.list(asset_dir); 179175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu } catch (IOException e) { 180175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu Log.e(TAG, "Failed to get asset file list.", e); 181175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu } 182175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu for(String filename : files) { 183175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu InputStream in = null; 184175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu OutputStream out = null; 185175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu try { 186175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu in = assetManager.open(asset_dir + "/" + filename); 187175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu out = new FileOutputStream(out_dir + "/" + filename); 188175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu copyFile(in, out); 189175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu in.close(); 190175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu in = null; 191175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu out.flush(); 192175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu out.close(); 193175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu out = null; 194175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu } catch(IOException e) { 195175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu Log.e(TAG, "Failed to copy asset file: " + filename, e); 196175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu } 197175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu 198175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu File cur_file = new File(out_dir + "/" + filename); 199175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu cur_file.setReadable(true, /*OwnerOnly=*/false); 200175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu if (executable) { 201175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu cur_file.setExecutable(true, /*OwnerOnly=*/false); 202175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu } 203175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu } 204175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu } 205175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu 206175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu private void copyFile(InputStream in, OutputStream out) throws IOException { 207175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu byte[] buffer = new byte[1024]; 208175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu int read; 209175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu while((read = in.read(buffer)) != -1){ 210175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu out.write(buffer, 0, read); 211175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu } 212175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu } 213175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu 214175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu public AbccService() { 215175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu super("AbccService"); 216175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu } 217175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu 218175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu // Usage: adb shell am startservice -a compiler.abcc.BITCODE_COMPILE_TEST -n compiler.abcc/compiler.abcc.AbccService -e working_dir /data/local/tmp/test 219175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu @Override 220175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu public void onHandleIntent(Intent intent) { 221175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu Log.i(TAG, "got onHandleIntent intent: " + intent); 222175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu if (intent.getAction() != "compiler.abcc.BITCODE_COMPILE_TEST") { 223175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu Log.e(TAG, "We don't support formal release by onHandleIntent() yet!"); 224175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu return; 225175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu } 226175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu 227175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu extractIntentInfo(intent); 228175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu installToolchain(); 229175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu new WorkingThread().start(); 230175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu } 231175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu 232175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu @Override 233175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu public IBinder onBind(Intent intent) { 234175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu Log.i(TAG, "got onBind intent: " + intent); 235175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu if (intent.getAction() != "compiler.abcc.BITCODE_COMPILE") { 236175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu Log.e(TAG, "We don't support other intent except for BITCODE_COMPILE by onBind() yet!"); 237175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu return null; 238175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu } 239175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu 240175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu installToolchain(); 241175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu 242175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu if (mBinder == null) { 243175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu Log.e(TAG, "Why mBinder is null?"); 244175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu } 245175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu return mBinder; 246175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu } 247175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu 248175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu private void dumpDebugInfo() { 249175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu Log.i(TAG, "AbccService field dump:"); 250175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu Log.i(TAG, "- mWorkingDir: " + mWorkingDir); 251175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu Log.i(TAG, "- mSysroot: " + mSysroot); 252175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu Log.i(TAG, "- mBinder: " + mBinder); 253175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu Log.i(TAG, "- mCurrentStatus: " + mCurrentStatus); 254175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu } 255175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu 256175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu @Override 257175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu public boolean onUnbind(Intent intent) { 258175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu Log.i(TAG, "got onUnbind intent: " + intent); 259175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu return false; 260175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu } 261175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu 262175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu // If succeess, it will be 0 in file working_dir/compile_result. 263175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu // Otherwise, there will be error message in file working_dir/compile_error. 264dbe07395020b7709a242a02e50cb05c065792005Lai Wei-Chih private native int genLibs(String working_dir, String sysroot); 265175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu 266175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu static { 267175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu System.loadLibrary("jni_abcc"); 268175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu } 269175ab1222f20d79675e2c4692af396f1f5975557WenHan Gu} 270