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