[Samsung Galaxy Nexus] chriv:
Please note that this question is purely academic in nature. My phone is not broken, and all the features I need are enabled. I just want to know how to make similar changes myself (see below).

Forgive me if this is in the wrong forum. I was going to post this in the Verizon Samsung Galaxy Nexus Development forum, but the site warned me that asking questions in that forum was against the rules (OK, I won't post my question there)!

I have a "toro" (Samsung Galaxy Nexus for VzW with LTE/CDMA).

Yesterday, I repo synced my AOSP source to bring it up to date. My phone is running an almost stock "maguro" (rooted) JRO03O from https://dl.google.com/dl/android/aosp/mysid-jro03o-factory-f17426e6.tgz .

Then I sourced build/envsetup.sh and selected full_toro-user (yes, "user", not "userdebug" :) ) with the lunch menu.

I then made what I thought was a clever patch to packages/apps/Settings/src/com/android/settings/TetherSettings.java where I added a few constants and a boolean function called isProvisioningAllowed() that is called by a now modified boolean function isProvisioningNeeded(). Essentially, isProvisioningNeeded() now checks to see if the Android owner allows his carrier to limit tethering to provisioned users (before checking to see if the carrier requires provisioning). As you may have guessed, using my patch, the default setting is now that the carrier is not allowed by the Android owner to require provisioning from the user.

For anyone curious, here is the .diff for my patch for TetherSettings.java (Java is not a programming language that I "know", but I can figure out most of the syntax from the existing code - so I may have crappy code) :

project packages/apps/Settings/
diff --git a/src/com/android/settings/TetherSettings.java b/src/com/android/settings/TetherSettings.java
index 4a79eca..63f1526 100644
--- a/src/com/android/settings/TetherSettings.java
+++ b/src/com/android/settings/TetherSettings.java
@@ -106,6 +106,11 @@ public class TetherSettings extends SettingsPreferenceFragment
private String[] mProvisionApp;
private static final int PROVISION_REQUEST = 0;

+ /* Is carrier allowed to require provisioning for tethering */
+ private static final int CARRIER_TETHERING_PROVISIONING_ALLOWED = 0;
+ private static final int CARRIER_TETHERING_PROVISIONING_PROHIBITED = -1;
+ private int mCarrierTetheringProvisioning = CARRIER_TETHERING_PROVISIONING_PROHIBITED;
+
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
@@ -424,6 +429,36 @@ public class TetherSettings extends SettingsPreferenceFragment
return false;
}

+ boolean isProvisioningAllowed() {
+ /* returns whether Android owner allows carrier to restrict tethering to provisioned users */
+ if (mCarrierTetheringProvisioning == CARRIER_TETHERING_PROVISIONING_PROHIBITED) {
+ return false;
+ }
+ if (mCarrierTetheringProvisioning == CARRIER_TETHERING_PROVISIONING_ALLOWED) {
+ return true;
+ }
+ /* If neither of the above values match mCarrierTetheringProvisioning then assume it is prohibited by Android owner */
+ return false;
+ }
+
+ boolean isProvisioningNeeded() {
+ /* first check to see if provisioning is allowed before checking to see if it is needed */
+ if (isProvisioningAllowed()) {
+ /* provisioning is allowed, check to see if needed */
+ if (SystemProperties.getBoolean("net.tethering.noprovisioning", false)) {
+ /* provisioning is allowed, but not needed */
+ return false;
+ }
+ /* provisioning is allowed (and needed if mProvisionApp array has two values) */
+ return mProvisionApp.length == 2;
+ } else {
+ /* provisioning is not allowed, therefore it is not needed */
+ return false;
+ }
+
+/* Original (unaltered) isProvisioningNeeded() function
+
boolean isProvisioningNeeded() {
if (SystemProperties.getBoolean("net.tethering.noprovisioning", false)) {
return false;
@@ -431,6 +466,8 @@ public class TetherSettings extends SettingsPreferenceFragment
return mProvisionApp.length == 2;
}

+*/
+
private void startProvisioningIfNecessary(int choice) {
mTetherChoice = choice;
if (isProvisioningNeeded()) {

Then I built the entire tree. Next, I backed up "Settings.apk" and "Settings.odex" from my /system/app directory on my phone. Also, I remounted /system as r/w. I then dropped in the new "Settings.apk" and "Settings.odex" from my custom build, and set the owner.group to root.root (on both) and permissions to 644 (on both). I remounted /system as r/o again.

Even with a cold boot, the "Settings" menu crashes when launched (with my "Settings.apk" and "Settings.odex" in place).

I restored my backups for those two system files, and rebooted again (which fixed my Settings menu/app). I then downloaded somebody else's fixed "framework-res.apk" and deleted "SPG.apk". While this accomplishes one goal (no carrier restrictions on Google Android native tethering), it does not help me learn how to do this myself.

I want to be able to tweak the AOSP source on the fly, and produce binaries that are compatible with my ROM.

So my problem basically breaks down to the following 4 sub-questions:

1) Can anyone tell me why my customized "Settings.apk" and "Settings.odex" crash when "Settings" is launched?

2) Did I make a change that would break binary compatibility (I tried not to)?

3) Or is it because the current version of AOSP builds binaries for 4.1.2 (JZO54K) instead of for 4.1.1 (JRO03O)?

4) How do I build AOSP for an older tag anyway (like 4.1.1_r1)?