Index: components/cronet/android/sample/README |
diff --git a/components/cronet/android/sample/README b/components/cronet/android/sample/README |
new file mode 100644 |
index 0000000000000000000000000000000000000000..97bee9d560c3e14b08af8aab33bd66a5d2b13754 |
--- /dev/null |
+++ b/components/cronet/android/sample/README |
@@ -0,0 +1,180 @@ |
+ |
+How to set up and run the sample app as an Android Studio project. |
+ |
+Linux (Android Studio version 0.8.11 beta) |
+===== |
+(1) Launch Android Studio. |
+ |
+(2) Choose "Import project". |
+ - Navigate to the location of the sample soure code. |
+ You should be looking at a directory named "sample" |
+ containing a file named "AndroidManifest.xml". |
+ - Pick a new destination for it. |
+ |
+(3) Copy in the '.jar' files. |
+ (a) Directly under the "app" directory of your project, |
+ create a "libs" directory. Use a shell command if you like, |
+ or use "File|New|Directory" from the menu. But note that |
+ you only get "Directory" as an option if you are in |
+ "Project" view, not "Android" view. "Project" models |
+ the local machine's filesystem, but Android is a virtual |
+ layout of files corresponding to the deployed hierarchy. |
+ That is to say, do step (b) before step (a) if you're inclined. |
+ (b) Toggle the view from "Android" to "Project" |
+ in the selection list above the file hierarchy. |
+ Otherwise you won't see "libs". |
+ (c) Copy 'cronet.jar' and 'cronet_stub.jar' to "libs". |
+ |
+ [Also note that it is possible to leave the '.jar' files |
+ in their original locations, though this seems to be |
+ somewhat discouraged by convention] |
+ |
+(4) Inform the IDE about the '.jar' files. |
+ (a) Select both files at once. |
+ (b) Bring up the context menu and choose "Add as Library". |
+ (d) Confirm "OK" at the "Add to module" dialog. |
+ [Note: the keyboard shortcut and/or main menu selection |
+ for these steps seems to be missing from Android Studio. |
+ If you prefer, the advice under problem #2 |
+ in "Troubleshooting" below will perform the same thing |
+ without reliance on menu selections] |
+ |
+(5) Copy in the '.so' file. |
+ (a) Under "app/src/main" create a directory named "jniLibs" |
+ (b) Copy armeabi and ameabi-v7a into jniLibs, which should |
+ contain only subdirectories, not directly a '.so' file |
+ (c) The IDE will automatically know about these. |
+ |
+(6) Click "Run". |
+ |
+Troubleshooting: |
+ |
+(I) If the project doesn't build, there are two typical problems: |
+#1 - make sure that you have the correct 'cronet.jar'. |
+There is one that is part of the Chromium build which |
+does not include org.chromium.base (and so will be missing PathUtil, |
+at least) and one that is part of the cronet build. |
+ |
+#2 - If you have vast swaths of red text (errors) in the edit window |
+for CronetSampleActivity, you should confirm that the requisite |
+jar files are present in 'build.gradle'. There are at least 2 |
+files which are named 'build.gradle'. Check them both. |
+You should observe the following lines [see footnote 1] |
+ |
+dependencies { |
+ compile file('libs/cronet.jar') |
+ compile file('libs/cornet_stub.jar') |
+} |
+ |
+If absent, the lines may be added by hand to the gradle file |
+which corresponds to the module named "app", and not the project |
+s a whole. You might have to press a "Sync" button in the IDE |
+which tells it to re-scan the 'build.gradle' files. |
+ |
+(II) If the project builds but doesn't run, verify that the '.so' files |
+are present in your Android package (which is just a jar file in disguise): |
+% jar tf build/outputs/apk/app-debug.apk |
+AndroidManifest.xml |
+res/layout/cronet_sample_activity.xml |
+resource.arsc |
+classes.dex |
+lib/armeabi/libcronet.so |
+lib/armeabi-v7/libcronet.so |
+META-INF |
+etc |
+ |
+If the '.so' files are not present, it is likely that Android Studio |
+misinterpreted the containing folder as "ordinary" source code, |
+which, due to lack of any special directive pertaining to it, failed |
+to be copied to the apk. One thing to check for is the spelling |
+of "jniLibs" - it must literally be that, with a capital "L" or |
+it won't work. This is a bit of magic that allows users without |
+the NDK (Native Development Kit) to deploy '.so' files. |
+[With the NDK, things are different because in that case you have to |
+produce the '.so' files, and create build rules to do so, |
+so the setup is naturally more flexible to begin with.] |
+As a visual cue that the folder has been recognized as special, |
+its icon should match that of the "res" (resources) folder |
+which resembles a tabbed manila folder with some extra cross-hatches |
+on the front, and not the icon of the "java" folder. |
+The marking on the icon signifies that its contents land on the |
+the target device. But to keep things interesting, the icon is |
+distinct visually only in "Android" view, not "Project" view. |
+ |
+MacOS (Android Studio version 1.0.1) |
+===== |
+(0) You might or might not have to set a magic environment |
+ variable as follows [see footnote 3]: |
+ export STUDIO_JDK=/Library/Java/JavaVirtualMachines/jdk1.7.0_71.jdk |
+ |
+(1) Launch Android Studio, which can be achieved from the command |
+ line with |
+ % open '/Applications/Android Studio.app' |
+ |
+(2) Choose "Import Non-Android Studio Project" |
+ (a) Navigate to the path containing "sample" |
+ (b) Pick a place to put it, and choose "Finish" |
+ |
+(3) If you are comfortable using shell commands to create directories, |
+ you may proceed to step (3) for Linux above. |
+ Otherwise, if you prefer to create directories from the UI, |
+ proceed with the following steps. |
+ |
+(4) Choose "File -> New -> Folder -> Assets Folder". |
+ Check "Change Folder Location" and delete the entire |
+ pathname that was there. Change it to 'libs' |
+ which is conventional for pre-built jar files. |
+ |
+(5) Copy and paste the two pre-built '.jar' files into 'assets'. |
+ When you do this, it will say that the destination is |
+ "app/libs". This is right. If you prefer to see |
+ the file hierarchy as it really exists, you can change |
+ the dropdown above the tree view from "android view" |
+ to "project view". Or just keep in mind that assets = libs |
+ at this level of the hierarchy. |
+ |
+(6) Select both jar files that you added (Shift+click). |
+ and pull up the menu for them (Ctrl+click). |
+ Select "Add as library" |
+ |
+(7) Choose "File -> New -> Folder -> JNI Folder". |
+ Choose "Change Folder Location" |
+ and change the name to "src/main/jniLibs" [see footnote 2] |
+ |
+---- |
+ |
+Footnotes: |
+[1] "compile file" as used in a dependency line means to package the |
+ named jars into the apk, and not to make those files. |
+ The opposite of this is "provided file" which assumes that the |
+ jars exist on the device already (in whatever the standard |
+ location is for systemwide jar files), and not that a file |
+ has been externally provided to Android Studio. |
+ |
+[2] The menu option to add JNI files assumes that you have the |
+ NDK (Native Development Kit) installed and want to produce |
+ files into the named directory. This is triggered by an |
+ automatic rule that tries to look for C++ source code |
+ and the NDK based on the existence of "src/main/jni". |
+ Changing this directory to "src/main/jniLibs" is magical |
+ in a different way: it informs Android Studio that you will |
+ place precompiled binaries into that directory. |
+ |
+[3] This has to do with differences between the JDK that the studio |
+ runs in as distinct from the JDK that the studio understands |
+ to be present on the target machine. |
+ There is discussion of the issue in |
+ https://code.google.com/p/android/issues/detail?id=82378 |
+ |
+Additional notes: |
+ |
+Ideally the two .jar files and one .so file could be delivered as one .aar |
+(Android Archive) file, but Android Studio will try to pull aar files from |
+a Maven repository without some workarounds that are about as much trouble |
+as adding in three separate files. |
+See https://code.google.com/p/android/issues/detail?id=55863 |
+ |
+Additionally, it is unclear how to automate the creation of a '.aar' file |
+outside of Android Studio and Gradle. If the entire workflow were controlled |
+by Gradle, it would be one thing; but presently the cronet jars are |
+produced as artifacts of the Chromium build which uses Ninja. |